SSE入门

Lir*_*evi 46 c x86 gcc sse simd

我想了解有关使用SSE的更多信息.

除了明显阅读英特尔®64和IA-32架构软件开发人员手册之外,还有哪些方法可以学习?

主要是我有兴趣使用GCC X86内置函数.

Lir*_*una 45

首先,我不建议使用内置函数 - 它们不可移植(在同一个arch的编译器中).

使用内在函数,GCC 在将 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;
}
Run Code Online (Sandbox Code Playgroud)

使用_mm_load_ps_mm_loadu_ps从数组加载数据.

当然有更多的选择,SSE真的很强大,在我看来相对容易学习.

有关指南的一些链接,另请参阅https://stackoverflow.com/tags/sse/info.

  • 提出一个问题,我一定会帮忙:) (6认同)

int*_*nt3 40

既然你要求资源:

使用SSE和C++的实用指南:有关如何有效使用SSE的概念性概述,以及示例.

MSDN Compiler Intrinsics列表:全面参考所有内在需求.它是MSDN,但是这里列出的所有内在函数都支持GCC和ICC.

Christopher Wright的SSE页面:关于SSE操作码含义的快速参考.我想英特尔手册可以提供相同的功能,但速度更快.

最好在内在函数中编写大部分代码,但要检查编译器输出的objdump,以确保它生成有效的代码.SIMD代码生成仍然是一项相当新的技术,在某些情况下编译器很可能会出错.


tom*_*rer 7

我发现Agner Fog博士的研究和优化指南非常有价值!他还有一些我尚未尝试的库和测试工具. http://www.agner.org/optimize/