奇怪的 SIMD 指令行为
Posted
技术标签:
【中文标题】奇怪的 SIMD 指令行为【英文标题】:Strange SIMD instruction behavior 【发布时间】:2014-03-08 21:16:03 【问题描述】:SSE2 指令 (paddd xmm, m128) 的工作方式非常奇怪。代码说明一切。
#include <iostream>
using namespace std;
int main()
int * v0 = new int [80];
for (int i=0; i<80; ++i)
v0[i] = i;
int * v1 = new int [80];
for (int i=0; i<80; ++i)
v1[i] = i;
asm(
".intel_syntax noprefix;"
"mov rcx , 20;"
"mov rax , %0;"
"mov rbx , %1;"
"m_start:;"
"cmp rcx , 0;"
"je m_end;"
"movdqu xmm0 , [rax];"
"paddd xmm0 , [rbx];"
"movdqu [rax] , xmm0;"
"add rbx , 16;" /* WTF?? If I put there 128, it's work really bad */
"add rax , 16;" /* but why?? I must add 128 because XMM width is 128 bits ... */
"dec rcx;"
"jmp m_start;"
"m_end:;"
".att_syntax noprefix;"
: //
: "r"(v0) , "r"(v1)
: //
);
for (int i=1; i<81; ++i)
cout << v0[i-1] << (char*)((i%10==0) ? "\n" : ", ");
return 0;
【问题讨论】:
请比“真的很奇怪”更具体。您至少应该说出您的期望和实际发生的情况。 【参考方案1】:您必须添加 16,因为 128 位是 16 个字节。
附加说明:您忘记告诉编译器您破坏了一些寄存器,并且您不应该在不告诉编译器的情况下切换语法(改用-masm=intel
开关)。
【讨论】:
以上是关于奇怪的 SIMD 指令行为的主要内容,如果未能解决你的问题,请参考以下文章