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

Posted

技术标签:

【中文标题】MSVC /arch:[指令集] - SSE3、AVX、AVX2【英文标题】:MSVC /arch:[instruction set] - SSE3, AVX, AVX2 【发布时间】:2016-09-14 06:59:29 【问题描述】:

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

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

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

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

【问题讨论】:

MSVC 中没有 SSE3 选项。在 64 位模式下,唯一的选项是 AVXAVX2AVX 的重点是告诉 MSVC 使用 vex 编码指令。我真的不知道AVX2 的意义。我认为这主要是为了从 FMA3 进行优化。 【参考方案1】:

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

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

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

有一个 library 的示例,它执行 CPU checking 和 calling 一个已实现的功能。

【讨论】:

所以,我是否理解正确,基本上,我的需求是:创建,比如说 3 个具有自己实现(和相应的 ARCH 标志)的库,然后检查处理器功能,然后将它们全部链接一次? 是的。您可以创建 3 个库(每个库都有自己的编译器选项)。您还可以为一个库中的每个文件设置单独的编译器选项(Visual Studio 允许这样做)。 谢谢!重构了一下,按照建议,现在可以了!

以上是关于MSVC /arch:[指令集] - SSE3、AVX、AVX2的主要内容,如果未能解决你的问题,请参考以下文章

CPU支持SSE3有啥作用?对游戏有好处吗?

新P4有SSE3指令,是不是需要其他硬件支持。

SSE3指令有啥功能?

指令集的相关问题!

使用 Intel Core i7 的 AVX 上的非法指令

如何在运行时检测 NEON 和 Helium 指令集的可用性