我正在尝试实现一些内联汇编程序(在 Visual Studio 2012 C++ 代码中)以利用 SSE。我想添加 7 个数字 1e9 次,所以我将它们从 RAM 放置到 CPU 的 xmm0 到 xmm6 寄存器。当我使用以下代码在 Visual Studio 2012 中使用内联汇编执行此操作时:
C++ 代码:
for(int i=0;i<count;i++)
resVal+=val1+val2+val3+val4+val5+val6+val7;
我的 ASM 代码:
int count=1000000000;
double resVal=0.0;
//placing values to register
__asm{
movsd xmm0,val1;placing var1 in xmm0 register
movsd xmm1,val2
movsd xmm2,val3
movsd xmm3,val4
movsd xmm4,val5
movsd xmm5,val6
movsd xmm6,val7
pxor xmm7,xmm7;//turns xmm7 to zero
}
for(int i=0;i<count;i++)
{
__asm
{
addsd xmm7,xmm0;//+=var1
addsd xmm7,xmm1;//+=var2
addsd xmm7,xmm2;
addsd xmm7,xmm3;
addsd xmm7,xmm4;
addsd xmm7,xmm5;
addsd xmm7,xmm6;//+=var7
}
}
__asm
{
movsd resVal,xmm7;//placing xmm7 into resVal
}
这是来自 C++ 编译器的反汇编代码,用于代码“resVal+=val1+val2+val3+val4+val5+val6+val7”:
movsd xmm0,mmword ptr [val1]
addsd xmm0,mmword ptr [val2]
addsd xmm0,mmword ptr [val3]
addsd xmm0,mmword ptr [val4]
addsd xmm0,mmword ptr [val5]
addsd xmm0,mmword ptr [val6]
addsd xmm0,mmword ptr [val7]
addsd xmm0,mmword ptr [resVal]
movsd mmword ptr [resVal],xmm0
可以看出,编译器只使用一个 xmm0 寄存器,其他时候它从 RAM 中获取值。
两种代码(我的 ASM 代码和 c++ 代码)的答案是相同的,但是 c++ 代码大约需要我的 asm 代码一半的时间来执行!
我读过关于 CPU 寄存器的信息,使用它们比内存快得多。我不认为这个比例是真的。为什么 asm 版本的 C++ 代码性能较低?