我的 SSE 代码的性能存在问题。我尝试计算 Pi 数并使用http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80。因此,当我进行 1*10^11 次迭代时,我的性能(-100%)比没有 SSE 的代码更差。如果我进行 1*10^10 次迭代,我的性能比没有 SSE 的代码更好。
我使用 Visual Studio C++ 编译器和英特尔编译器(没有优化!)。当然,我可以使用带有优化的编译器(我会得到完美的结果),但我想了解哪里出了问题。
我尝试对齐数据(你可以看到它),我使用 VS C++ 编译器获得了更好的性能(-40% 而不是 -100%),但是使用英特尔编译器的性能我得到 -85% 而不是 -100 :) 我使用 getTickCount来衡量时间。
我的处理器是 AMD Turon X2 Dual-Core Mobile-RM74。可能是有道理的:)
我的 SSE 代码
double *a = (double*) _mm_malloc(4 * sizeof(double ), 16);
double *i = (double*) _mm_malloc(sizeof(double), 64); //good point
double *k = (double*) _mm_malloc(sizeof(double), 64);
double *result = (double*) _mm_malloc(sizeof(double), 64);
double *temp = (double*) _mm_malloc(sizeof(double), 64);
*temp = 0.0;
*result = 0.0;
*k = 1.0;
a[0] = 1;
a[1] = -1;
for (*i = 1; *i < 100000000000; *i += 2, *k += 4.0) {
a[2] = *k;
a[3] = *k + 2;
__asm {
mov eax, dword ptr a
movapd XMM0, xmmword ptr [eax ]
movapd XMM1, xmmword ptr [eax + 16]
divpd XMM0, XMM1
movapd XMM1, XMM0
psrldq XMM1,8
addpd XMM0,XMM1
mov eax, dword ptr temp;
movsd [eax], XMM0
}
*result += *temp;
}
*result = *result * 4.0;
定时getTickcount。小姐。
intel + O | 942901
intel - O | 1273139
intel + sse + O | 948096
intel + sse - O | 2354382 |(unaligned data)
VS + O | 949079
VS - O | 1106749
VS + SSE + O | 968189
VS + SSE - O | 2180067 | (unaligned data)
VS + SSE - O | 1674201 | (aligned data)
intel + sse - O | 1921437 |(aligned data)