如何通过Visual Studio编译器检入代码是否启用SSE / SSE2?
我已经尝试了#ifdef __SSE__
,但它没有用。
答案 0 :(得分:4)
有关_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
答案 1 :(得分:3)
<强>
_M_IX86_FP
强>扩展为一个值,指示使用了哪个 / arch 编译器选项:
- 0如果 / arch:IA32 使用。
如果 / arch:使用SSE ,则- 1。
- 2如果使用 / arch:SSE2 。如果未指定 / arch ,则此值为默认值。
我没有看到提及_SSE_
。
答案 2 :(得分:3)
相关的预处理器宏在每端都有两个下划线:
#ifdef __SSE__
#ifdef __SSE2__
#ifdef __SSE3__
#ifdef __SSE4_1__
#ifdef __AVX__
...etc...
UPDATE :显然上面的宏在使用Visual Studio时不会自动为您预先定义(即使它们在我曾经使用过的所有其他x86编译器中),所以您可能需要如果你想用gcc,clang,ICC,等 ...来实现可移植性,你自己定义它们。
答案 3 :(得分:1)
这是一个较晚的答案,但是在MSDN上您可以找到有关__cpuid和__cpuidex的文章。我将该类重定义为一个函数,并检查MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1是否支持。 https://docs.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];
}