Detect SSE / SSE2 Instruction Set Availability in Visual Studio

How can I check the code if SSE / SSE2 is enabled or not by the Visual Studio compiler?

I tried #ifdef __SSE__ , but that didn't work.

+4
c ++ x86 visual-studio sse sse2
source share
4 answers

From the documentation :

_M_IX86_FP

Expands to a value indicating which compiler option / arch was used:

  • 0 if / arch: IA32 was used.
  • 1 if / arch: SSE was used.
  • 2 if / arch: SSE2 was used. This value is the default if / arch is not specified.

I do not see mention of _SSE_ .

+3
source share

Learn more about _M_IX86_FP .

_M_IX86_FP is defined only for 32-bit code. 64-bit x86 code has at least SSE2. You can use _M_AMD64 or _M_X64 to determine if the code is 64-bit.

 #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 
+4
source share

Corresponding preprocessor macros have two underscores at each end:

 #ifdef __SSE__ #ifdef __SSE2__ #ifdef __SSE3__ #ifdef __SSE4_1__ #ifdef __AVX__ ...etc... 

UPDATE Apparently, the above macros are not automatically defined for you when using Visual Studio (although they are in all other x86 compilers I have ever used), so you may need to define them yourself if you want to port using gcc, clang, ICC, etc ...

+3
source share

This is a late answer, but on MSDN you can find an article on __cpuid and __cpuidex. I remade the class into a function and it checks for support for 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]; } 
+1
source share

All Articles