也许是因为我分别传递了每个参数,就像这样……
__m128i a = _mm_set_epi32(pa[0],pa[1],pa[2],pa[3]);__m128i b = _mm_set_epi32(pb[0],pb[1],pb[2],pb[3]);__m128i res = _mm_add_epi32(a,b);for( i = 0; i < 4; i++ ) po[i] = res.m128i_i32[i];
有没有办法我可以一次性传递所有4个整数,我的意思是一次性传递整个128字节的pa?并一次性将res.m128i_i32分配给po?
解决方法 总结回答的评论:你基本上陷入了捕获大多数初次使用者的陷阱.基本上你的例子有两个问题:
>您滥用_mm_set_epi32().
>您的计算/负载存储比率非常低. (在您的示例中为1到3)
_mm_set_epi32()是一种非常昂贵的内在函数.虽然使用起来很方便,但它不能编译成单个指令.使用_mm_set_epi32()时,某些编译器(如VS2010)可能会生成性能很差的代码.
相反,由于您正在加载连续的内存块,因此应使用_mm_load_si128().这要求指针对齐16个字节.如果你不能保证这种对齐方式,你可以使用_mm_loadu_si128() – 但性能会受到影响.理想情况下,您应该正确对齐数据,以便不需要使用_mm_loadu_si128().
使用SSE真正高效,您还需要最大化计算/负载存储比率.我拍摄的目标是每个存储器访问3-4个算术指令.这是一个相当高的比例.通常,您必须重构代码或重新设计算法以增加代码.结合数据传递是一种常见的方法.
当您拥有具有长依赖关系链的大型循环体时,通常需要循环展开以最大化性能.
成功使用SSE实现加速的SO问题的一些示例.
> C code loop performance(非矢量化)
> C code loop performance [continued](矢量化)
> How do I achieve the theoretical maximum of 4 FLOPs per cycle?(实现峰值处理器性能的人为实例)
以上是内存溢出为你收集整理的SSE指令在哪里优于正常指令全部内容,希望文章能够帮你解决SSE指令在哪里优于正常指令所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)