检测 Visual Studio 中 SSE/SSE2 指令集的可用性

use*_*420 5 c++ x86 sse sse2 visual-studio

如何在代码中签入 Visual Studio 编译器是否启用了 SSE/SSE2?

我试过了,#ifdef __SSE__但没有用。

Z b*_*son 6

关于 的一些附加信息_M_IX86_FP

_M_IX86_FP 仅针对 32 位代码定义。64 位 x86 代码至少具有 SSE2。您可以使用 _M_AMD64 或 _M_X64 来确定代码是否为 64 位。

#ifdef __AVX2__
//AVX2
#elif defined ( __AVX__ )
//AVX
#elif (defined(_M_AMD64) || defined(_M_X64))
//SSE2 x64
#elif _M_IX86_FP == 2
//SSE2 x32
#elif _M_IX86_FP == 1
//SSE x32
#else
//nothing
#endif
Run Code Online (Sandbox Code Playgroud)


Car*_*rum 5

文档中:

_M_IX86_FP

扩展为一个值,指示使用了哪个/arch编译器选项:

  • 如果使用/arch:IA32,则为 0 。
  • 如果使用/arch:SSE,则为 1 。
  • 2 如果使用/arch:SSE2 。如果未指定/arch,则此值为默认值。

我没有看到任何提及_SSE_.


Pau*_*l R 5

相关的预处理器宏两端各有两个下划线:

#ifdef __SSE__

#ifdef __SSE2__

#ifdef __SSE3__

#ifdef __SSE4_1__

#ifdef __AVX__

...etc...
Run Code Online (Sandbox Code Playgroud)

更新:显然,使用 Visual Studio 时,上面的宏不会自动为您预定义(即使它们存在于我曾经使用过的所有其他 x86 编译器中),因此如果您希望使用 gcc 实现可移植性,您可能需要自己定义它们, clang、ICC...

  • 根据他们的文档(http://msdn.microsoft.com/en-us/library/b0084kay.aspx),Visual Studio不会设置`__SSEn__`宏(但他们确实设置了`__AVX__`和`__AVX2__`) 。 (3认同)
  • 我想这是典型的——其他人都定义了“__SSEn__”宏,但微软没有。 (3认同)