首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XNAMath SIMD性能

XNAMath SIMD性能
EN

Stack Overflow用户
提问于 2012-12-08 11:10:09
回答 1查看 366关注 0票数 0

我测试了XNAMath的性能,看起来就像在我的pc版上使用simd,本质上比没有SIMD的性能要低。

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

代码语言:javascript
复制
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;

这包括:

代码语言:javascript
复制
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

在这个循环中:

代码语言:javascript
复制
for (int i = 0; i < 10000000; i++)
{
    volatile XMVECTOR4 d = MVector4Dot(v1, v2);
}

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

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

谢谢。

更新:i用"/arch:SSE2“选项编译程序

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-08 17:46:14

SSE并不是真正设置好的--你正在尝试添加“水平”,这并不适合SIMD。你可以搜索(谷歌或S.O.)更详细的答案是,结构数组与数组结构。我可以告诉您,如果您的处理器支持SSE3,您可以:

代码语言:javascript
复制
/* 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,则可以使用:

代码语言:javascript
复制
v0 = _mm_dp_ps(V1, V2, 0xff); /* dot product splat across all elements. */

如果您的代码以更新的处理器为目标,这可能会产生更好的性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13776903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档