SSE指令在哪里优于正常指令

x86-64的SSE指令(向量指令)在哪里优于正常指令.因为我所看到的是,执行SSE指令所需的频繁加载和存储会使由于向量计算而产生的任何增益无效.那么有人可以给我一个示例SSE代码,它比普通代码表现更好.

也许是因为我分别传递了每个参数,就像这样……

__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?(实现峰值处理器性能的人为实例)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...