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

Visual c++ MSVC/arch:[指令集]-SSE3、AVX、AVX2,visual-c++,simd,avx,Visual C++,Simd,Avx,下面是一个显示支持的指令集的类的示例 我想为一个函数编写三种不同的实现,每种实现都使用不同的指令集。但由于flag/ARCH:AVX2的原因,这个应用程序除了在第四代以上的英特尔处理器上运行外,在任何地方都不会运行,所以整个检查都是毫无意义的 所以,问题是:这面旗子到底是做什么的?使用提供的指令集启用支持或启用编译器优化 换句话说,我是否可以完全删除此标志并继续使用immintrin.h、emmintrin.h等函数?使用选项/ARCH:AVX2允许以最佳方式使用CPU的YMM寄存器和AVX2指

下面是一个显示支持的指令集的类的示例

我想为一个函数编写三种不同的实现,每种实现都使用不同的指令集。但由于flag/ARCH:AVX2的原因,这个应用程序除了在第四代以上的英特尔处理器上运行外,在任何地方都不会运行,所以整个检查都是毫无意义的

所以,问题是:这面旗子到底是做什么的?使用提供的指令集启用支持或启用编译器优化


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

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

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

另外,如果您创建一个单独的文件来检查CPU能力并调用相应的函数实现,这也是一个好主意


这里有一个例子,一个是CPU,一个是已实现的函数。

那么,我是否理解正确,基本上,我的需求是:创建,比如说3个具有自己实现的库(以及相应的ARCH标志),然后检查处理器能力,然后立即与它们链接?是的。您可以创建3个库(每个库都有自己的编译器选项)。您还可以为一个库中的每个文件设置单独的编译器选项(VisualStudio允许这样做)。谢谢!根据建议进行了一点重构,现在它可以工作了!MSVC中没有SSE3选项。在64位模式下,唯一的选项是
AVX
AVX2
。AVX的要点是告诉MSVC使用vex编码指令。我真的不知道
AVX2
的意义。我认为主要是为了从FMA3进行优化。