英特尔编译器无法识别来自gcc的avxintrin.h的标识符

时间:2019-02-07 04:19:38

标签: c++ gcc avx icc

我正在尝试在我的项目中启用AVX指令。我可以使用gcc( gcc -mavx )来构建它,但是不能使用Intel编译器( icpc -maxv )来构建它,该编译器在avxintrin.h gcc标头中失败,并出现以下错误: / p>

  • 没有声明“ __m256d”标识符
  • “ __ builtin_ia32_loadupd256”未定义

仅供参考,这是来自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

1 个答案:

答案 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

gcc8.2中的

avxintrin.h具有# error "Never use <avxintrin.h> directly; include <immintrin.h> instead."的ifdef。也许您的旧版gcc版本缺少该功能。