如何使用AVX和FMA指令禁用自动矢量化?我仍然希望编译器自动使用SSE和SSE2,而不是FMA和AVX。
我的代码使用AVX检查其可用性,但GCC在自动矢量化时不会这样做。因此,如果我使用-mfma
进行编译并在Haswell之前的任何CPU上运行代码,我将获得SIGILL
。如何解决这个问题?
答案 0 :(得分:8)
您要做的是为您定位的每个指令集编译不同的目标文件。然后创建一个cpu调度程序,它向CPUID请求可用的指令集,然后跳转到该函数的相应版本。
我已经在几个不同的问题和答案中描述了这个
答案 1 :(得分:2)
您需要将使用AVX的代码分隔为单独的编译单元(换句话说,单独的.cpp文件),并仅使用-mfma
或您想要的任何选项进行编译。通常情况下,gcc
会使用-march=native
,因此会针对“您的处理器”进行编译,如果您需要通用代码,则需要使用-march=x86_64
或-march=core2
,或者类似的东西。