簡體   English   中英

在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編譯器選項:

  • 如果使用/ arch:IA32 ,則為0。
  • 如果使用/ arch:SSE ,則為1。
  • 如果使用/ arch:SSE2 ,則為2。 如果未指定/ arch,則此值為默認值。

我沒有提到_SSE_

相關的預處理器宏在每一端都有兩個下划線:

#ifdef __SSE__

#ifdef __SSE2__

#ifdef __SSE3__

#ifdef __SSE4_1__

#ifdef __AVX__

...etc...

更新 :顯然,使用Visual Studio時,上述宏不是自動為您預定義的(即使它們在我使用過的所有其他x86編譯器中),因此,如果您想使用gcc進行移植,則可能需要自己定義它們, clang,ICC

這是一個較晚的答案,但是在MSDN上您可以找到有關__cpuid和__cpuidex的文章。 我將該類重定義為一個函數,並檢查MMX,SSE,SSE2,SSE3,SSSE3,SSE4.1是否支持。 https://docs.microsoft.com/zh-cn/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];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM