56

是否有一个简单的教程让我在 GNU C++ 中快速掌握 SSE、SSE2 和 SSE3?如何在 SSE 中进行代码优化?

4

5 回答 5

62

抱歉不知道教程。

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

开始熟悉 Intel 优化参考手册的内容是一个好主意(参见第 4.3.1.2 节的内在函数示例),SIMD 部分是必不可少的阅读材料。指令集参考手册也很有帮助,因为每条指令的文档都包含它对应的“内在”功能。

一定要花一些时间检查编译器从内在函数生成的汇编程序(你会学到很多东西)和分析/性能测量(你会避免浪费时间 SSE-ing 代码而几乎没有回报)。

2011 年 5 月 31 日更新: Agner Fog 的优化 PDF中有一些非常好的内在函数和矢量化覆盖(谢谢),尽管它有点分散(例如第一个的第 12节和第二个的第 5 节)。这些并不完全是教程材料(实际上有“这些手册不适合初学者”警告),但它们确实正确地将 SIMD(无论是通过 asm、内在函数还是编译器矢量化使用)视为更大优化工具箱的一部分。

2012-10-04 更新:一篇关于 gcc 向量内在函数的Linux Journal 小文章值得一提。比 SSE 更通用(也包括 PPC 和 ARM 扩展)。最后一页有很多参考资料,这让我注意到英特尔的“内在指南”

于 2009-03-19T13:43:18.267 回答
24

最简单的优化是允许 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 Fog 的:http ://agner.org/optimize/ 。我认为他没有内在函数的 SSE 教程,但他有一些非常巧妙的 std-c++ 技巧,并且还提供了很多关于编码 SSE 程序集的信息(通常可以转录为内在函数)。

于 2009-03-24T15:00:54.397 回答
8

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

恐怕任何超出此范围的都是汇编程序的领域。

GCC 在线手册 - i386 和 x86_64 选项

于 2009-03-19T07:37:07.773 回答
4

MSDN 对 SSE 编译器内置插件有很好的描述(这些内置插件是事实上的标准,它们甚至可以在 clang/XCode 中工作)。

该引用的好处是它显示了等效的伪代码,因此您可以了解到ADDPD指令是:

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

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

于 2011-08-18T22:23:19.433 回答
2

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

但是任何关于使用 MMX 或任何版本的 SSE 的信息都将有助于学习,无论是 GCC 还是 ICC 或 VC。

要了解 GCC 的向量扩展,请输入“info gcc”并转到节点:向量扩展。

于 2009-03-19T07:37:52.843 回答