使用-mavx和-mfma编译时,防止GCC自动使用AVX和FMA指令

时间:2013-09-18 09:14:53

标签: c++ gcc vectorization avx fma

如何使用AVX和FMA指令禁用自动矢量化?我仍然希望编译器自动使用SSE和SSE2,而不是FMA和AVX。

我的代码使用AVX检查其可用性,但GCC在自动矢量化时不会这样做。因此,如果我使用-mfma进行编译并在Haswell之前的任何CPU上运行代码,我将获得SIGILL。如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

您要做的是为您定位的每个指令集编译不同的目标文件。然后创建一个cpu调度程序,它向CPUID请求可用的指令集,然后跳转到该函数的相应版本。

我已经在几个不同的问题和答案中描述了这个

答案 1 :(得分:2)

您需要将使用AVX的代码分隔为单独的编译单元(换句话说,单独的.cpp文件),并仅使用-mfma或您想要的任何选项进行编译。通常情况下,gcc会使用-march=native,因此会针对“您的处理器”进行编译,如果您需要通用代码,则需要使用-march=x86_64-march=core2,或者类似的东西。