5

Visual Studio コンパイラで SSE/SSE2 が有効になっているかどうかをコードでチェックするにはどうすればよいですか?

試してみ#ifdef __SSE__ましたが、うまくいきませんでした。

4

4 に答える 4

6

に関するいくつかの追加情報_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
于 2013-09-02T10:02:12.060 に答える
3

ドキュメントから:

_M_IX86_FP

どの/archコンパイラ オプションが使用されたかを示す値に展開されます。

  • /arch:IA32が使用された場合は 0 。
  • /arch:SSEが使用された場合は 1 。
  • /arch:SSE2が使用された場合は 2 。/archが指定されていない場合、この値がデフォルトになります。

についての言及はありません_SSE_

于 2013-09-01T23:40:32.603 に答える
1

これは遅い回答ですが、MSDN で __cpuid と __cpudex に関する記事を見つけることができます。クラスを関数に作り直して、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];
}
于 2019-08-21T16:10:38.290 に答える