检测Visual Studio中SSE/SSE2指令集的可用性
Detect the availability of SSE/SSE2 instruction set in Visual Studio
如何在代码中检查Visual Studio编译器是否启用了SSE/SSE2?
我试过#ifdef __SSE__
,但没用。
关于_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
来自文档:
_M_IX86_FP
展开为一个值,指示使用了/arch编译器选项:
- 0,如果/arch:IA32被使用
- 如果/arch:SSE,则为1
- 2如果/arch:SSE2被使用。如果未指定/arch,则此值为默认值
我没有看到任何关于_SSE_
的报道。
相关的预处理器宏在每端都有两个下划线:
#ifdef __SSE__
#ifdef __SSE2__
#ifdef __SSE3__
#ifdef __SSE4_1__
#ifdef __AVX__
...etc...
UPDATE:显然,在使用Visual Studio时,上面的宏并不是自动为您预定义的(即使它们在我使用过的所有其他x86编译器中),因此,如果您希望与gcc、clang、ICC、等人进行可移植性,您可能需要自己定义它们。。。
这是一个迟来的答案,但在MSDN上你可以找到一篇关于__cpuid和__cpuidex的文章。我将该类重新划分为一个函数,它检查MMX、SSE、SSE2、SSE3、SSSE3和SSE4.1的支持。https://learn.microsoft.com/en-us/cpp/intrinsics/cpuid-cpuidex?view=vs-2019年
[[nodiscard]] bool CheckSimdSupport() noexcept
{
std::array<int, 4> cpui;
int nIds_{};
std::bitset<32> f_1_ECX_{};
std::bitset<32> f_1_EDX_{};
std::vector<std::array<int, 4>> data_;
__cpuid(cpui.data(), 0);
nIds_ = cpui[0];
for (int i = 0; i <= 1; ++i)
{
__cpuid(cpui.data(), i);
data_.push_back(cpui);
}
if (nIds_ >= 1)
{
f_1_ECX_ = data_[1][2];
f_1_EDX_ = data_[1][3];
}
// f_1_ECX_[0] - SSE3
// f_1_ECX_[9] - SSSE3
// f_1_ECX_[19] - SSE4.1
// f_1_EDX_[23] - MMX
// f_1_EDX_[25] - SSE
// f_1_EDX_[26] - SSE2
return f_1_ECX_[0] && f_1_ECX_[9] && f_1_ECX_[19] && f_1_EDX_[23] && f_1_EDX_[25] && f_1_EDX_[26];
}
相关文章:
- 您选择的 CPU 不支持 x86-64 指令集
- 是否启用了 SSE2 指令?
- 查找首集指令 (ffs) 用于提升多精度uint512_t
- 为新的指令集扩展程序进行了优化的代码的向后兼容性
- SSE交叉平面图的指令集
- 在Visual Studio 2015中检测与C 宏一起使用的SIMD指令集
- 我需要制作多个可执行文件来针对不同的指令集吗
- 链接每个指令集NDK的预构建库
- 指令集如何区分值和引用
- 检测Visual Studio中SSE/SSE2指令集的可用性
- VM解释器-更大指令集/调度循环的加权性能优点和缺点
- 编译器是如何知道我的CPU的指令集的
- 线性代数的CPU指令集
- #error "SSE2 指令集未启用"时包含 <emmintrin.h>
- 指令集模拟器的高效存储器设计
- 英特尔指令集扩展和用户机(AVX, IMCI…)
- 编译器错误-未启用C++SSE3指令集
- 如何检查CPU是否支持SSE3指令集
- SSE/SSE2 指令的打包和解包数据
- 编译成多个指令集时避免重复符号