SSE SSE2和SSE3用于GNU C ++

有没有一个简单的教程,以加快在SSE,SSE2和SSE3在GNU C + +? 你怎么能在SSE做代码优化?

对不起,不知道教程。

您最好的select(恕我直言)是通过英特尔提供的“固有”function来使用SSE来包装(通常)单个SSE指令。 这些可通过一组名为* mmintrin.h的包含文件提供,例如xmmintrin.h是原始的SSE指令集。

开始熟悉“英特尔优化参考手册”的内容是个不错的主意(请参阅第4.3.1.2节的内部示例),而SIMD部分是必读内容。 指令集参考手册也非常有用,因为每条指令的文档都包含了它所对应的“内部”function。

花点时间检查一下编译器生成的汇编程序(你会学到很多东西)和分析/性能testing(避免浪费时间在代码上less花钱)。

更新2011-05-31:在Agner Fog的优化PDF中有一些非常好的内在和vector化的覆盖( 谢谢 ),尽pipe它有点传播(例如第一个的第12部分和第二个的第5部分)。 这些不完全是教程材料(事实上有一个“这些手册不适合初学者”的警告),但他们正确地把SIMD(不pipe是通过asm,intrinsics还是编译器vector化)用作更大的优化工具箱的一部分。

更新2012-10-04:关于gccvector内在函数的一篇很好的Linux Journal文章值得一提。 比SSE更普遍(也包括PPC和ARM扩展)。 在最后一页有很多参考资料,这引起了我对英特尔“内部手册”的关注 。

使用最简单的优化是允许gcc发出SSE代码。

标志:-msse,-msse2,-msse3,-march =,-mfpmath = sse

有关386个选项的更简明列表,请参阅http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options ,更准确您的具体编译器版本的文档在那里: http : //gcc.gnu.org/onlinedocs/ 。

为了优化,请检查Agner雾: http ://agner.org/optimize/。 我认为他没有内在函数的SSE教程,但他有一些非常简洁的std-c ++技巧,同时也提供了关于编码SSE程序集(通常可以转录为内部函数)的大量信息。

看看-mtune和-march选项,-msse *和-mfpmath当然。 所有这些使GCC能够进行特定于SSE的优化。

恐怕以外的任何事情都是汇编的境界。

GCC在线手册 – i386和x86_64选项

MSDN对SSE编译器内置插件有很好的描述(而且这些内置插件实际上是标准的,甚至可以在clang / XCode中使用)。

关于这个引用的好处是,它显示了相当的伪代码,所以你可以知道ADDPD指令是:

 r0 := a0 + b0 r1 := a1 + b1 

这里是一个神秘的洗牌指令的很好的描述: http : //www.songho.ca/misc/sse/sse.html

一个简单的教程? 从来没听说过。

但是关于使用MMX或任何版本的SSE的任何信息对于GCC或ICC或VC的学习都是有用的。

要了解GCC的vector扩展,请input“info gcc”并转到Node:Vector Extensions。