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

时间:2012-04-25 06:37:07

标签: c gcc x86-64 sse simd

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

3 个答案:

答案 0 :(得分:17)

是的,您可以使用* mmintrin.h标头中的内在函数(emmintrin.hxmmintrin.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;
}

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

答案 1 :(得分:5)

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

Paul R和hroptatyr描述了在哪里可以找到GCC的文档。 Microsoft also has good documentation on the intrinsics in their compiler;即使你正在使用GCC,你也可能会发现MS对这个想法的描述是一个更好的教程。

答案 2 :(得分:4)

在您的gcc中找到*intrin.h标题(/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/include/此处)。

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