c++ - 在 Visual Studio 2015 中检测要与 C++ 宏一起使用的 SIMD 指令集

标签 c++ visual-studio-2015 sse avx instruction-set

所以,这就是我要完成的工作。在我的 C++ 项目中,必须使用 Microsoft Visual Studio 2015 或更高版本编译,我需要一些代码具有不同的版本,具体取决于用户 CPU 中可用的最新 SIMD 指令集,其中: SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2AVXAVX2AVX512

因为此时我正在寻找的是编译时 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?

最佳答案

您面临的问题是,Visual Studio 历来是为软件供应商设计的。编译自己的软件的想法根本不在微软的 DNA 中。

实际结果是,微软几乎不关心构建机器的处理器。这不太可能是用于运行软件的处理器。

从好的方面来说,这也意味着 Microsoft 不会遇到长期存在的 Linux 问题,即假设构建系统库存在于目标机器上。在 Windows 10 for Windows 7 上构建就可以了。

例如,编译器也不允许您启用 SSE4.1。您只能使用 /arch:avx 或什么都不用。此外,该选项仅定义 __AVX__,而不是 gcc/clang/icc 定义的通常宏,如 __SSSE3__,以指示对 AVX 隐含的先前指令集的目标支持。

关于c++ - 在 Visual Studio 2015 中检测要与 C++ 宏一起使用的 SIMD 指令集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40757107/

相关文章:

c# - 如何识别 C# 项目中未使用的类

jenkins - 使用 MSBuild 12 构建 Visual Studio 2015 解决方案

上交所/AVX : Choose from two __m256 float vectors based on per-element min and max absolute value

c++ - 使用 Ivy Bridge 和 Haswell 循环展开以实现最大吞吐量

assembly - 如何将 XMM 128 位寄存器拆分为两个 64 位整数寄存器?

c++ - Opencl atomic_add() 函数返回错误值

c++ - 如何避免重新编译头文件

c++ - 用于在 log(N) 时间内查找连续项目的算法

c++ - 隐藏其他运营商一段时间

c++ - MSBuild 在针对不同配置运行时不必要地运行自定义生成工具