MSVC /arch:[指令集] - SSE3, AVX, AVX2

MSVC /arch:[instruction set] - SSE3, AVX, AVX2

这是一个 class 示例,它显示了支持的指令集。 https://msdn.microsoft.com/en-us/library/hskdteyh.aspx

我想为一个函数编写三个不同的实现,每个都使用不同的指令集。但是由于标志 /ARCH:AVX2,例如,这个应用程序永远不会 运行 除了在第 4 代以上的英特尔处理器上,所以整个检查点毫无意义。

所以,问题是:究竟这个标志有什么作用?使用提供的指令集启用支持或启用编译器优化?

换句话说,我可以完全删除这个标志并继续使用 immintrin.h、emmintrin.h 等的函数吗?

选项/ARCH:AVX2 的使用允许以最佳方式使用CPU 的YMM 寄存器和AVX2 指令。但是如果CPU不支持这些指令就会导致程序崩溃。如果您使用 AVX2 指令和编译器标志 /ARCH:SSE2,这将降低性能(大约 2 倍)。

因此,当函数的每个实现都使用相应的编译器选项(/ARCH:AVX2、/ARCH:SSE2 等)进行编译时,这是最佳实现。最简单的方法 - 将您的实现(标量、SSE、AVX)放在不同的文件中,然后使用特定的编译器选项编译每个文件。

此外,如果您创建一个单独的文件,您可以在其中检查 CPU 能力并调用您的函数的相应实现,这将是一个好主意。

有一个 library which does CPU checking and calling 已实现函数的示例。