因此,这是我正在尝试完成的。在我的C++项目中,必须使用Microsoft Visual Studio 2015或更高版本进行编译,我需要根据用户的CPU中可用的最新SIMD指令集,有些代码具有不同版本,其中包括:SSE
,SSE2
,SSE3
,SSSE3
,SSE4.1
,SSE4.2
,AVX
,AVX2
和AVX512
。在Visual Studio 2015中检测要与C++宏一起使用的SIMD指令集
由于我在这里寻找的是编译时CPU调度,我的第一个猜测是,它可以很容易地使用编译器宏来完成。但是,令我惊讶的是,在VS2015中找到有关如何使用宏实现这种CPU调度的信息已经相当困难。
例如,前一个问题“Detect the availability of SSE/SSE2 instruction set in Visual Studio”有关于如何检测x86代码的SSE和SSE2的信息,但不包括x64代码的信息。虽然,他们对这个微软的文档的参考:http://msdn.microsoft.com/en-us/library/b0084kay.aspx
在那里,我们只对如何检测是否SSE,SSE2,AVX和AVX2是在编译器中启用信息 - 不正是它们是否会受到CPU支持。另外,对于其他指令集也没有任何意见,例如SSE3,SSSE3,SSE4.1,SSE4.2和AVX512。
因此,我的问题变成:我如何检测用户的CPU是否像其他编译器那样通过宏支持那些指令集,但是使用Microsoft Visual Studio 2015?
除非您只打算在您编译的同一台机器上运行,否则支持的CPU功能集不是编译时常量,因此不能是宏。但是,如果你是,只要做任何MSVC等效的gcc的'-march = native',并看看像'#ifdef __AVX__'通常的目标特征宏'' –
@PeterCordes但这正是问题所在。除'__AVX__'和'__AVX2__'之外没有宏。我的问题的关键在于调查人们如何实现这一目标,因为Vistual Studio似乎缺乏这样的宏。 – AndrewSteer
它还应该定义'__SSE2__','__SSSE3__'等等。我不知道MSVC,但使用gcc,您可以使用'-dM'让预处理器转储所有的宏定义。 (例如'echo | gcc -march = haswell -E - -dM | less')。 '__AVX__'意味着所有英特尔SSE扩展,包括'__SSE4_2__'。不过,如果MSVC没有打算为它们定义宏,那就太奇怪了。 –