【发布时间】:2013-09-22 23:26:46
【问题描述】:
如何使用 AVX 和 FMA 指令禁用自动矢量化?我仍然希望编译器自动使用 SSE 和 SSE2,而不是 FMA 和 AVX。
我使用 AVX 的代码会检查其可用性,但 GCC 在自动矢量化时不会这样做。因此,如果我使用 -mfma 编译并在 Haswell 之前的任何 CPU 上运行代码,我会得到 SIGILL。如何解决这个问题?
【问题讨论】:
-
你想要的是一个 CPU 调度器。将带有
-msse2的代码编译到一个目标文件中,将-mfma编译到另一个目标文件中,然后创建一个调度程序,询问CPUID 哪些硬件可用,并将函数指针设置为指向SSE2 或AVX/FMA 版本stackoverflow.com/questions/23676426/… -
@Zboson:是的,我就是这么做的。让它成为一个答案,我会接受。
-
最近的 gcc 允许您在没有 -mfma 或 -mavx 的情况下使用内部函数。您还可以指定每个函数的目标。
标签: c++ gcc vectorization avx fma