我正在尝试在我的项目中启用AVX指令。我可以使用gcc( gcc -mavx )来构建它,但是不能使用Intel编译器( icpc -maxv )来构建它,该编译器在avxintrin.h gcc标头中失败,并出现以下错误: / p>
仅供参考,这是来自avxintrin.h的代码:
extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm256_loadu_pd (double const *__P)
{
return (__m256d) __builtin_ia32_loadupd256 (__P);
}
据我了解,这些标识符是gcc中的内置函数,这就是为什么icc无法识别这些标识符的原因;我想我应该以某种方式隐藏icc的avxintrin.h标头,并使其使用其自己的内置函数(“ intrinsics”)。我是正确的,如何使icpc正常工作?
gcc 4.4.7,icpc 17.0
答案 0 :(得分:3)
您为什么要在ICC的旧版gcc中使用标头? GCC 4.4系列早于AVX。 (4.4.7是自2012年以来的,但它仍然相对古老)。当前的GCC为8.2,对于旧的则为7.4。 (如果您关心GCC对现代CPU的调整情况如何,尤其是对于AVX,请使用知道-march=skylake
和-march=znver1
的更新的GCC。)
ICC 确实出于某种原因依赖于GCC标头,显然包括immintrin.h
。 IDK为什么ICC不能完全为Intel内部函数提供自己的定义。
在#include <immintrin.h>
之后,可以正常工作的ICC17安装 知道GCC内置。 https://godbolt.org/z/PKumZx。但是,我认为是最近的immintrin.h
。
与ICC17不同,即使没有声明或包含,ICC19也会为__builtin_ia32_loadupd256(p)
编译double*p
。
ICC抱怨如果您声明自己拥有__m256d
,除非您以正确的顺序放置__attribute__
,依此类推。无论如何,请尝试从较新的gcc中获取标头,您的ICC可能太新了该gcc 。
此外,请勿直接包含avxintrin.h
,而应包含immintrin.h
。
avxintrin.h具有# error "Never use <avxintrin.h> directly; include <immintrin.h> instead."
的ifdef。也许您的旧版gcc版本缺少该功能。