我在没有AVX512支持的情况下编译,但是我注意到immintrin.h拖着吨的loforAVX512。
/usr/lib/gcc/x86_64-linux-gnu/11/include/avx512fintrin.h我试过检查指定行军选项是否有帮助,但似乎没有帮助。
cat avx512_include.cpp
#include <immintrin.h>
int main() {}
g++ -march=core2 -E -P avx512_include.cpp | wc -l
34365
g++ -march=skylake-avx512 -E -P avx512_include.cpp | wc -l
34257我知道理论上我可以绕开gcc的分期付款,并祈祷当我从avx512标题中删除所有内容时,它会起作用,但如果有,我正在寻找一种支持的方式。
我试图查看gcc的头部,看看是否有一些宏检查是否包括avx512头,但它们似乎是无条件包含的。
我试着找gcc的行军牌,找不到,如果有人知道更合适的标签旁边,请评论。
发布于 2022-12-04 21:15:00
GCC/clang支持__attribute__((target("avx512f")))在没有-march=的情况下编译的文件中使用AVX-512的内容,这意味着-mavx512f。因此,immintrin.h仍然必须引入AVX512定义。
但是,如果您尝试使用__m512i v = _mm512_set1_ps(1.0);而不启用它,您仍然会从GCC和clang那里得到编译错误。看见
为了缩短编译时间,可能可以选择预编译头。大多数Linux发行版在默认情况下都不会这样做。
或者在完全不使用AVX-512的项目中,你可以破解一些东西,这样标题就不会被包含,或者至少不会被编译。
最小的干扰可能是在文件第一次包含之前定义GCC的包含保护宏。GCC的预处理器仍将读取文件,但编译器本身不会在文件上花费任何时间。就大小而言,avx512fintrin.h和avx512vlintrin.h是最大的;AMX和VNNI等都是小得多的标题,因此可能只值得使用avx512*.h。
$ grep --no-filename '#define.*_INCLUDED$' /usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/include/avx512*
#define _AVX5124FMAPSINTRIN_H_INCLUDED
#define _AVX5124VNNIWINTRIN_H_INCLUDED
#define _AVX512BF16INTRIN_H_INCLUDED
#define _AVX512BF16VLINTRIN_H_INCLUDED
#define _AVX512BITALGINTRIN_H_INCLUDED
#define _AVX512BWINTRIN_H_INCLUDED
#define _AVX512CDINTRIN_H_INCLUDED
#define _AVX512DQINTRIN_H_INCLUDED
...可能会将其重定向到skip-avx512.h。
避免对这些行进行预处理的更积极的方法是制作/usr/lib/gcc/x86_64-pc-linux-gnu/12.2.0/include/immintrin.h的自定义版本,只需删除avx512*头的所有#include行,以及对于您来说太新而不想使用的avxvnniintrin.h、amx*和shaintrin.h等其他行。
也许叫它"custom_gcc_intrin.h",把它包括进来,而不是immintrin.h?或者称其为immintrin.h,但将其放在特定项目中的某个位置,首先将其作为包含路径查找?
不要修改immintrin.h的系统副本或设置默认情况下使用修改后的版本;这可能会在将来的某个时候咬你一口,当您试图编译具有AVX-512代码路径并具有运行时检测的内容时。如果你忘记这些年前的修改,你会非常困惑为什么你的GCC被打破了。
https://stackoverflow.com/questions/74680139
复制相似问题