【问题标题】:Determine processor support for SSE2?确定处理器对 SSE2 的支持?
【发布时间】:2011-01-25 02:37:54
【问题描述】:

我需要在安装软件之前确定处理器对 SSE2 的支持。据我了解,我想出了这个:

bool TestSSE2(char * szErrorMsg)
{
    __try 
    {
        __asm 
        {
              xorpd xmm0, xmm0        // executing SSE2 instruction
        }
    }
        #pragma warning (suppress: 6320)
        __except (EXCEPTION_EXECUTE_HANDLER) 
        {
            if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) 
            {
                _tcscpy_s(szErrorMsg,MSGSIZE, _T("Streaming SIMD Extensions 2(SSE2) is not supported by the CPU.\r\n Unable to launch APP"));
                return false;

            }
        _tcscpy_s(szErrorMsg,MSGSIZE, _T("Streaming SIMD Extensions 2(SSE2) is not supported by the CPU.\r\n Unable to launch APP"));
        return false;
        }   
    return true;
}

这行得通吗?我不太确定如何测试,因为我的 CPU 支持它,所以我不会从函数调用中得到错误。

如何确定对 SSE2 的处理器支持?

【问题讨论】:

  • 任何特定的操作系统?
  • 据我所知,您的代码应该可以正常工作。我更喜欢 CPUID 方式,因为它更灵活一些,还可以让您访问一大堆其他 CPU 功能标志。
  • 您可以运行虚拟化操作系统,并让它模拟非 SSE2 CPU。它可能不会很快,但它应该是准确的,不是吗?
  • 对 SSE2 的处理器支持和操作系统支持是两个不同的东西。处理器可能支持 SSE2,因此在 CPUID 之后设置了正确的位。但是,操作系统可能没有启用它(我认为它需要启用 MMX 扩展)。对于 CPU 支持,Ashley 提供了答案。对于 Windows 下的操作系统支持,Timbo 提供了答案。我还没有看到 Linux 下操作系统支持的答案。我认为这些是针对 SSE2 操作系统支持的 GCC 测试:sse-6.c source file.

标签: c++ windows windows-xp sse2


【解决方案1】:

我在MSDN偶然发现了这个:

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

仅限 Windows,但如果您对任何跨平台的东西不感兴趣,非常简单。

【讨论】:

    【解决方案2】:

    使用 eax = 1 调用 CPUID 以将功能标志加载到 edx。如果 SSE2 可用,则设置位 26。一些用于演示目的的代码,使用 MSVC++ 内联汇编(仅适用于 x86,不可移植!):

    inline unsigned int get_cpu_feature_flags()
    {
        unsigned int features;
    
        __asm
        {
            // Save registers
            push    eax
            push    ebx
            push    ecx
            push    edx
    
            // Get the feature flags (eax=1) from edx
            mov     eax, 1
            cpuid
            mov     features, edx
    
            // Restore registers
            pop     edx
            pop     ecx
            pop     ebx
            pop     eax
        }
    
        return features;
    }
    
    // Bit 26 for SSE2 support
    static const bool cpu_supports_sse2 = (cpu_feature_flags & 0x04000000)!=0;
    

    【讨论】:

    • 您最好使用 __cpuid 内在函数,因为 Microsoft AMD64 编译器不再支持内联汇编。
    • 是否有关于在编译时检查哪些内容以了解处理器可用的 SSE 指令集的指南? SSE3、SSE4、SSE4.1 等...
    【解决方案3】:

    您可以使用 _cpuid 函数。所有的解释都在MSDN.

    【讨论】:

      【解决方案4】:

      检查 SSE2 支持的最基本方法是使用 CPUID 指令(在可用的平台上)。使用内联汇编或使用编译器内在函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-11
        • 2021-03-05
        • 2018-08-15
        • 1970-01-01
        • 2010-10-05
        • 2012-03-15
        • 1970-01-01
        相关资源
        最近更新 更多