【问题标题】:Using SSE instructions with gcc without inline assembly在没有内联汇编的情况下使用带有 gcc 的 SSE 指令
【发布时间】:2012-05-05 20:01:30
【问题描述】:

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

【问题讨论】:

标签: c x86-64 sse simd intrinsics


【解决方案1】:

是的,您可以在 *mmintrin.h 标头中使用 intrinsicsemmintrin.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 编译器,例如Linux/Mac OS X/Windows 上的 gcc、clang 和 Intel 的 ICC,甚至 Microsoft 的 Visual C/C++(当然仅限于 Windows)。

【讨论】:

  • gcc 和 VC++ 都支持内部函数。
  • FTW,icc 也支持这些内在函数
  • 谢谢 - 我在答案中添加了一条注释,说明大多数 x86 C/C++ 编译器都支持这种方法。
  • @PaulR 更好的是包含x86intrin.h,它包含所有MMX/SSE/AVX 和一些像bswapror 这样的东西,使它们可用作内在函数并设置@ 987654328@ 预处理器宏,根据给定的体系结构或编译器标志。
  • @GuntherPiez:x86intrin.h 不能移植到 MSVC,只有 GCC / clang,我认为是 ICC。英特尔定义的immintrin.h 可移植到定义每个英特尔 SIMD 内在函数的所有主流 x86 编译器。此外,__SSEx__ / __AVX__ / 等宏是由编译器本身预先定义的,与标头无关。这就是标题如何知道要定义哪些内在“功能”的方式。 x86intrin.h 使您的编译时间变慢,如果您实际上不需要它,这是另一个不使用它的原因。
【解决方案2】:

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

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

【讨论】:

【解决方案3】:

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

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

【讨论】:

  • ARM架构呢?它支持NEON SIMD吗?或者这仅适用于 x86?
  • @modalgeek 问题指定 x86-64。 ARM 和 NEON 有自己的编译器和内部函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 2020-11-11
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多