0

我测试了 XNAMath 性能,看起来在我的带有 SIMD 内在函数的 pc 版本上的性能低于没有 simd 的性能。

我使用计算点积的函数。我在没有 simd 的情况下测试了这段代码:

XMVECTOR4 Result;
Result.m128_f32[0] =
Result.m128_f32[1] =
Result.m128_f32[2] =
Result.m128_f32[3] = V1.m128_f32[0] * V2.m128_f32[0] + V1.m128_f32[1] * V2.m128_f32[1] + V1.m128_f32[2] * V2.m128_f32[2] + V1.m128_f32[3] * V2.m128_f32[3];
return Result;

这与:

XMVECTOR4 vTemp2 = V2;
XMVECTOR4 vTemp = _mm_mul_ps(V1,vTemp2);
vTemp2 = _mm_shuffle_ps(vTemp2,vTemp,_MM_SHUFFLE(1,0,0,0)); // Copy X to the Z position and Y to the W position
vTemp2 = _mm_add_ps(vTemp2,vTemp);          // Add Z = X+Z; W = Y+W;
vTemp = _mm_shuffle_ps(vTemp,vTemp2,_MM_SHUFFLE(0,3,0,0));  // Copy W to the Z position
vTemp = _mm_add_ps(vTemp,vTemp2);           // Add Z and W together
return XM_PERMUTE_PS(vTemp,_MM_SHUFFLE(2,2,2,2));    // Splat Z and return

在这个循环中:

for (int i = 0; i < 10000000; i++)
{
    volatile XMVECTOR4 d = MVector4Dot(v1, v2);
}

在发布模式下,没有 simd 的版本大约需要 9 毫秒,大约 20 毫秒。

哪些原因可能会影响 SIMD 性能?

谢谢。

更新:我用“/arch:SSE2”选项编译程序

4

1 回答 1

1

SSE 并没有真正为此设置 - 您正在尝试添加不适合 SIMD 的“水平”。您可以搜索(Google 或 SO)array-of-structures 与 structure-of-arrays,以获得更详细的答案。我可以告诉你,如果你的处理器支持 SSE3,你有:

/* apologies - this is 'C' ... */

v0 = _mm_mul_ps(V1, V2);
v0 = _mm_hadd_ps(v0, v0);
v0 = _mm_hadd_ps(v0, v0); /* dot product splat across all elements. */

同样,“haddps”的延迟非常高——指令更少,但可能比没有 SIMD 的代码慢。一旦开始交错操作,就有可能隐藏延迟。如果您的处理器支持 SSE 4.1,您可以使用:

v0 = _mm_dp_ps(V1, V2, 0xff); /* dot product splat across all elements. */

如果您的代码针对更新的处理器,这可能会产生更好的性能。

于 2012-12-08T17:46:14.957 回答