禁用所有 AVX512 扩展

n. *_* m. 5 gcc instruction-set avx avx512

我需要禁用 gcc 编译的代码中的所有 AVX512 扩展。原因是 Valgrind 在 AVX512 指令上卡住了。有没有办法用一个标志来做到这一点?

我知道如何单独禁用每个扩展(-mno-avx512f-mno-avx512pf),但这很麻烦,因为不同的 gcc 版本支持这些扩展的不同子集。

我使用CMake。如果有一种方法可以使用 CMake 机器自动化标记,这也对我有用。

Pet*_*des 11

gcc -mno-avx512f也意味着没有其他AVX512 扩展。 AVX512F 是“基础”,禁用它会告诉 GCC 机器不会解码 EVEX 前缀。

同样,-mno-avx禁用 AVX2、FMA3 等,因为它们都是基于 AVX 构建的。(由于 GCC 的工作方式,-mavx512f -mno-avx甚至可能会禁用 AVX512F。)


例如,gcc -march=icelake-client -mno-avx512f将拒绝 AVX512DQ 或 AVX512VL 指令等的内在函数,并且在自动矢量化时不使用它们。