我有兴趣将 x86-64 的 SSE 矢量指令与 gcc 一起使用,并且不想为此使用任何内联汇编。有没有办法在 C 中做到这一点?如果是这样,有人可以给我一个例子吗?
问问题
9258 次
3 回答
18
是的,您可以在 *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;
}
请注意,这种方法适用于各种平台上的大多数 x86 和 x86-64 编译器,例如 Linux/Mac OS X/Windows 上的 gcc、clang 和 Intel 的 ICC,甚至 Microsoft 的 Visual C/C++(当然仅限于 Windows)。
于 2012-04-25T06:45:46.217 回答
6
在您的 gcc 包含(此处)中查找*intrin.h
标题。/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.0/include/
也许值得注意的是,标题immintrin.h
包括根据您允许的功能(使用-msse2
或-mavx
例如)的所有其他内在因素。
于 2012-04-25T06:45:59.363 回答
5
您想要的是内在函数,它们看起来像库函数,但实际上内置在编译器中,因此它们可以转换为特定的机器代码。
Paul R 和 hroptatyr 描述了在哪里可以找到 GCC 的文档。微软在他们的编译器中也有关于内在函数的很好的文档;即使您使用的是 GCC,您也可能会发现 MS 对这个想法的描述是一个更好的教程。
于 2012-04-25T06:49:42.400 回答