使用带有gcc的SSE指令而不使用内联汇编

pyt*_*nic 12 c gcc sse x86-64 simd

我有兴趣使用x86-64与gcc的SSE向量指令,并且不想为此使用任何内联汇编.有没有办法在C中做到这一点?如果是这样,有人可以举个例子吗?

Pau*_*l R 17

是的,你可以使用内部函数在*mmintrin.h头(emmintrin.h,xmmintrin.h等等,这取决于你想使用什么级别的SSE的).由于许多原因,这通常优于使用汇编程序.

#include <emmintrin.h>

int main(void)
{
    __m128i a = _mm_set_epi32(4, 3, 2, 1);
    __m128i b = _mm_set_epi32(7, 6, 5, 4);
    __m128i c = _mm_add_epi32(a, b);

    // ...

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请注意,此方法适用于各种平台上的大多数x86和x86-64编译器,例如Linux/Mac OS X/Windows上的gcc,clang和Intel的ICC,甚至是Microsoft的Visual C/C++(当然只有Windows).

  • @PaulR更好的是包含`x86intrin.h`,其中包含所有MMX/SSE/AVX以及某些内容,如`bswap`或`ror`,使它们可用作内部函数,并根据以下内容设置`__SSEX__`预处理器宏.给出的体系结构或编译器标志. (8认同)
  • gcc和VC++都支持内在函数. (4认同)

hro*_*tyr 6

*intrin.h在你的 gcc 中找到头文件包含(/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/include/这里)。

也许值得注意的是,immintrin.h根据您允许的功能(使用-msse2-mavx例如),标头包括所有其他内部。


Cra*_*rks 5

你想要的是内在函数,它看起来像库函数但实际上内置在编译器中,因此它们转换为特定的机器代码.

Paul R和hroptatyr描述了在哪里可以找到GCC的文档.微软在其编译器中也有关于内在函数的良好文档 ; 即使你使用的是GCC,你也许会发现MS对这个想法的描述是一个更好的教程.

  • @Warrioricgeek 问题指定 x86-64。ARM 和 NEON 有自己的编译器和内在函数。 (2认同)