我想了解更多关于使用SSE的知识.
除了显而易见的阅读Intel® 64 and IA-32 Architectures Software Developer's Manuals之外,还有什么学习方法?
主要是我有兴趣和GCC X86 Built-in Functions人一起工作.
我想了解更多关于使用SSE的知识.
除了显而易见的阅读Intel® 64 and IA-32 Architectures Software Developer's Manuals之外,还有什么学习方法?
主要是我有兴趣和GCC X86 Built-in Functions人一起工作.
首先,我不建议使用内置函数--它们不能移植(跨相同ARCH的编译器).
使用intrinsics、GCC does a wonderful job将SSE内部函数优化为更优化的代码.您可以随时查看组件,了解如何充分利用SSE.
内部函数很简单-就像普通函数调用一样:
#include <immintrin.h> // portable to all x86 compilers
int main()
{
__m128 vector1 = _mm_set_ps(4.0, 3.0, 2.0, 1.0); // high element first, opposite of C array order. Use _mm_setr_ps if you want "little endian" element order in the source.
__m128 vector2 = _mm_set_ps(7.0, 8.0, 9.0, 0.0);
__m128 sum = _mm_add_ps(vector1, vector2); // result = vector1 + vector 2
vector1 = _mm_shuffle_ps(vector1, vector1, _MM_SHUFFLE(0,1,2,3));
// vector1 is now (1, 2, 3, 4) (above shuffle reversed it)
return 0;
}
使用_mm_load_ps
或_mm_loadu_ps
从数组加载数据.
当然还有更多的 Select ,SSE真的很强大,而且在我看来相对容易学习.
有关指南的一些链接,请参见https://stackoverflow.com/tags/sse/info.