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 回答
4

相关的预处理器宏在每一端都有两个下划线:

#ifdef __SSE__

#ifdef __SSE2__

#ifdef __SSE3__

#ifdef __SSE4_1__

#ifdef __AVX__

...etc...

更新:显然,在使用 Visual Studio 时,上述宏不会自动为您预定义(即使它们在我曾经使用过的所有其他 x86 编译器中),所以如果您想要使用 gcc 的可移植性,您可能需要自己定义它们,铿锵声、ICC...

于 2013-09-02T05:33:57.660 回答
3

文档中

_M_IX86_FP

扩展为指示使用了哪个/arch编译器选项的值:

  • 如果使用了/arch:IA32,则为 0。
  • 如果使用了/arch:SSE,则为 1。
  • 2 如果使用了/arch:SSE2。如果未指定/arch ,则此值为默认值。

我没有看到任何提及_SSE_.

于 2013-09-01T23:40:32.603 回答
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];
}
于 2019-08-21T16:10:38.290 回答