在发行版将GCC升级到5.5.0后,AVX512内在函数标头会产生许多错误

时间:2018-06-12 10:35:21

标签: gcc compiler-errors intrinsics avx512 gcc5

我的Linux发行版将我的GCC版本升级到5.5.0(如果我知道原因,该死的)。现在,当我尝试构建包含avx512fintrin.h的代码时,我遇到了一大堆编译器错误:

/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9220): error: argument of type "const void *" is incompatible with parameter of type "const float *"
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9231): error: argument of type "const void *" is incompatible with parameter of type "const float *"
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9244): error: argument of type "const void *" is incompatible with parameter of type "const double *"
/usr/lib/gcc/x86_64-linux-gnu/5/include/avx512fintrin.h(9255): error: argument of type "const void *" is incompatible with parameter of type "const double *"

等等。为什么会发生这种情况,是否存在解决或绕过这个问题的方法(希望这种方式不是特定的分配)?

PS - 如果重要,我使用GNU / Linux Mint 18.3。

1 个答案:

答案 0 :(得分:2)

显然,涉及GCC错误:

documentation

似乎GCC 5.5附带了一些avx512?intrin.h标头,这些标头切换为使用void*和const void*,,但没有切换内置组件来执行相同操作。这在GCC 5的发布后版本中得到了解决。关于GCC 6.x - 我不确定。

Bug 76731 - [AVX512] _mm512_i32gather_epi32 and other scatter/gather routines have incorrect signature上讨论了解决此问题的方法:从GNU服务器下载修补的标头。

GCC 5脚本:

for f in avx512fintrin.h avx512pfintrin.h avx512vlintrin.h; do
   curl -H "User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" -o $f "https://gcc.gnu.org/viewcvs/gcc/branches/gcc-5-branch/gcc/config/i386/${f}?view=co&revision=245536&content-type=text%2Fplain&pathrev=245536"
done && mv avx512*intrin.h  /usr/lib/gcc/x86_64-linux-gnu/5/include/

实际上,所有3个版本的文件可能都相同,但我没有检查过。

注意:如果您想知道为什么用户代理字符串 - 它是为了避免服务器拒绝客户端,它不喜欢“禁止”响应。当然,它不一定是这个特定的UA字符串。