将AVX与GCC一起使用:__ builtin_ia32_addpd256未声明

Vio*_*ffe 0 c++ gcc avx fma

如果我#include <immintrin.h>收到此错误:

错误:未在此范围内声明'__builtin_ia32_addpd256'

我已定义__AVX____FMA__宏使AVX可用,但显然这还不够.如果我使用编译器标志-mavx而不是宏,则没有错误,但该解决方案是不可接受的.那么,我还应该定义什么才能使用AVX?

Pau*_*l R 5

你不应该定义__AVX____FMA__自己-当您启用了正确的编译器选项,这些都会自动定义的,如

gcc -Wall -mavx ...
Run Code Online (Sandbox Code Playgroud)

如果您有兴趣,可以自己检查:

没有AVX:

$ gcc -dM -E - < /dev/null | egrep "AVX|FMA"
$
Run Code Online (Sandbox Code Playgroud)

AVX:

$ gcc -mavx -dM -E - < /dev/null | egrep "AVX|FMA"
#define __AVX__ 1
$
Run Code Online (Sandbox Code Playgroud)

AVX + FMA:

$ gcc -mavx -mfma -dM -E - < /dev/null | egrep "AVX|FMA"
#define __AVX__ 1
#define __FMA__ 1
$
Run Code Online (Sandbox Code Playgroud)

  • 内在函数不能像那样工作,并且它们不会链接到任何东西 - 一般的想法是它们生成内联代码 - 如果你看看标题,你会看到每个内在映射到编译器中的`__builtin_XXX` turn用于生成相关的内联操作码.如果您不启用AVX,则编译器无法处理`__builtin_XXX. (2认同)