当前位置: 首页 > 知识库问答 >
问题:

x86 SIMD内部函数的头文件

濮阳烨然
2023-03-14

哪些头文件为不同的x86 SIMD指令集扩展(MMX、SSE、AVX、...)提供了内在函数?在网上似乎不可能找到这样的列表。如果我错了,请纠正我。

共有3个答案

常茂
2023-03-14

头文件名称取决于您的编译器和目标体系结构。

    < li >对于Microsoft C(针对x86、x86-64或ARM)以及英特尔C/C编译器Windows版,请使用< code>intrin.h < li >对于面向x86/x86-64的gcc/clang/icc,请使用< code>x86intrin.h < li >对于针对带NEON的ARM的gcc/clang/armcc,请使用< code>arm_neon.h < li >对于带WMMX的gcc/clang/armcc目标ARM,请使用< code>mmintrin.h < li >对于针对带VMX(又名Altivec)和/或VSX的PowerPC的gcc/clang/xlcc,请使用< code>altivec.h < li >对于针对带SPE的PowerPC的gcc/clang,请使用< code>spe.h

您可以使用条件预处理指令处理所有这些情况:

#if defined(_MSC_VER)
     /* Microsoft C/C++-compatible compiler */
     #include <intrin.h>
#elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__))
     /* GCC-compatible compiler, targeting x86/x86-64 */
     #include <x86intrin.h>
#elif defined(__GNUC__) && defined(__ARM_NEON__)
     /* GCC-compatible compiler, targeting ARM with NEON */
     #include <arm_neon.h>
#elif defined(__GNUC__) && defined(__IWMMXT__)
     /* GCC-compatible compiler, targeting ARM with WMMX */
     #include <mmintrin.h>
#elif (defined(__GNUC__) || defined(__xlC__)) && (defined(__VEC__) || defined(__ALTIVEC__))
     /* XLC or GCC-compatible compiler, targeting PowerPC with VMX/VSX */
     #include <altivec.h>
#elif defined(__GNUC__) && defined(__SPE__)
     /* GCC-compatible compiler, targeting PowerPC with SPE */
     #include <spe.h>
#endif
禄光霁
2023-03-14
匿名用户

GCC / clang上,如果您只使用

#include <x86intrin.h>

它将包括所有根据编译器开关启用的SSE/AVX头文件,如< code>-march=haswell或< code>-march=native。此外,一些特定于x86的指令,如< code>bswap或< code>ror可以作为内部函数使用。

此标头< code >的MSVC等效项

如果您只是想要便携式SIMD,请使用< code>#include

MSVC、ICC和gcc/clang(我想还有Sun等其他编译器)都支持英特尔唯一的内部函数查找器/搜索工具所记录的SIMD内部函数的这个头文件:https://software . Intel . com/sites/landing page/IntrinsicsGuide/

苏星宇
2023-03-14

现在,您通常应该只包含<code>

GCC 和 clang 将阻止您在编译时将内部函数用于尚未启用的指令(例如,使用 -march=native-mavx2 -mbmi2 -mpopcnt -mfma -mcx16 -mtune=znver1 或其他)。

MSVC和ICC将允许您在编译时使用内部函数而无需启用任何内容,但您仍然应该在使用AVX内部函数之前启用AVX。

历史上(在<code>imintrin.h

这对于 MSVC 和 ICC 可能仍然很有用,可以阻止自己使用不需要的指令集。

<mmintrin.h>  MMX
<xmmintrin.h> SSE
<emmintrin.h> SSE2
<pmmintrin.h> SSE3
<tmmintrin.h> SSSE3
<smmintrin.h> SSE4.1
<nmmintrin.h> SSE4.2
<ammintrin.h> SSE4A
<wmmintrin.h> AES
<immintrin.h> AVX, AVX2, FMA

将其中一个拉入所有以前的拉入(除AMD外,仅SSE4A:imIntrin.h不拉入)

一些编译器也有

 类似资料:
  • 我以为我理解了和箭头函数之间的关系,但是下面的代码片段让我怀疑我的理解。 我知道箭头函数捕获包含上下文的值。我原以为是对象,但它是。 有人能帮我理解为什么会这样吗?

  • 严格说来,Ruby中没有函数.但Kernel模块中定义的方法(可以在任何地方用做函数,因此)可被其他语言当做函数来调用.若您对这些方法进行再定义时,就必需考虑到对其他方面的影响. `str 把字符串str当做外部命令来运行,并以字符串方式返回命令的输出.使用`str`形式来调用该方法(还可以使用%x(...)表示法进行调用.请参考命令输出). 可以使用$?来了解命令的结束状态. 若您只想执行命令,

  • 我试图运行一个简单的mapdb示例,但出现了以下错误: 我的班级: 我的pomx.xml 我跑得很快-

  • 这4个函数具有混合匹配的函数语法。调用嵌套函数时,func:with arrow函数返回空格。

  • 我刚刚开始学习React和JavaScript。在我阅读了留档和教程之后,我看了一下示例项目,并试图整理我还没有得到的内容。 然后我看到有一些函数是在函数内部定义的,还有一些函数是在函数外部定义的。 例如,在之外: 和内部render()。。。 为什么它们看起来如此不同,为什么你想在内部和外部有一些函数? 编辑: 之外的函数的另一个示例: EDIT2:在另一个线程中,有人回答说,如果函数背后的逻辑