开始使用SSE
我想了解更多关于使用SSE的信息 。
除了显而易见的英特尔®64和IA-32架构软件开发人员手册之外,还有什么方法可以学习?
主要是我有兴趣使用GCC X86内置函数 。
首先,我不推荐使用内置函数 – 它们不是可移植的(在同一个arch的编译器上)。
使用内部函数 ,GCC 将 SSE内在函数优化成更加优化的代码。 您可以随时查看程序集,了解如何使用SSE充分发挥潜力。
内在性很容易 – 就像正常的函数调用一样:
#include <xmmintrin.h> __m128 vector1 = _mm_set1_ps(4, 3, 2, 1); // Little endian, stored in 'reverse' __m128 vector2 = _mm_set1_ps(7, 8, 9, 0); // Addition __m128 result = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2 // A more advanced function, called shuffle vector1 = _mm_shuf_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3)); // vector1 is now (1, 2, 3, 4) (above shuffle reversed it)
当然,还有更多的select,上证所是非常强大的,在我看来相对容易学习。
既然你问资源:
在C ++中使用SSE的实用指南 :有关如何有效地使用SSE的概念性概述,以及示例。
编译器内在函数的MSDN列表 :全面的内部需求参考。 这是MSDN,但是这里列出的几乎所有的内部函数都是由GCC和ICC支持的。
Christopher Wright的SSE页面 :快速参考SSE操作码的含义。 我猜英特尔手册可以提供相同的function,但速度更快。
最好是将大部分代码写入内部函数,但是请检查编译器输出的objdump以确保它生成高效的代码。 SIMD代码生成仍然是一项相当新的技术,在某些情况下编译器很可能会出错。
我发现Agner Fog博士的研究和优化指南非常有价值! 他还有一些图书馆和testing工具,我还没有尝试过。 http://www.agner.org/optimize/