9

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

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

4

2 回答 2

9

您要做的是为您所针对的每个指令集编译不同的目标文件。然后创建一个 cpu 调度程序,它向 CPUID 询问可用的指令集,然后跳转到函数的适当版本。

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

于 2014-09-18T11:55:00.287 回答
2

您需要将使用 AVX 的代码分离到一个单独的编译单元(换句话说,一个单独的 .cpp 文件)中,并仅使用-mfma您想要的选项或任何选项编译该代码。通常,gcc将使用-march=native,因此它将为“您的处理器”编译,如果您想要通用代码,您将需要使用-march=x86_64or-march=core2或类似的东西。

于 2013-09-18T09:18:32.133 回答