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