2016-09-14 327 views
1

下面是一个显示支持的指令集的类的例子。 https://msdn.microsoft.com/en-us/library/hskdteyh.aspxMSVC/arch:[指令集] - SSE3,AVX,AVX2

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

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

换句话说,我可以完全删除此标志,并继续使用immintrin.h,emmintrin.h等功能?

+0

MSVC中没有SSE3选项。在64位模式下,唯一的选择是“AVX”和“AVX2”。 “AVX”的要点是告诉MSVC使用vex编码指令。我真的不知道'AVX2'的重点。我认为这主要是从FMA3进行优化。 –

回答

1

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

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

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

有一个library的例子,它是CPU checkingcalling的一个实现函数。

+0

因此,我是否理解正确,基本上,我的需求是:创建3个带有自己实现的库(以及相应的ARCH标志),然后检查处理器功能,然后一次链接它们? –

+0

是的。您可以创建3个库(每个库都有自己的编译器选项)。你也可以为一个库中的每个文件设置单独的编译器选项(Visual Studio允许这样做)。 – ErmIg

+0

谢谢!根据建议,重构了一下,现在它起作用了! –