C++ 确定SSE2的处理器支持?

C++ 确定SSE2的处理器支持?,c++,windows,windows-xp,sse2,C++,Windows,Windows Xp,Sse2,我需要在安装软件之前确定SSE2的处理器支持。据我所知,我得出了以下结论: bool TestSSE2(char * szErrorMsg) { __try { __asm { xorpd xmm0, xmm0 // executing SSE2 instruction } } #pragma warning (suppress: 6320) __

我需要在安装软件之前确定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支持它,所以我不会从函数调用中得到false


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

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

您可以使用\u cpuid函数。所有这些都在。

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


我无意中发现了这个:


仅限Windows操作系统,但如果您对任何跨平台的操作都不感兴趣,则非常简单。

任何特定的操作系统?据我所知,您的代码应该可以正常工作。我更喜欢CPUID方式,因为它更灵活,还允许您访问大量其他CPU功能标志。您可以运行虚拟化操作系统,并让它模拟非SSE2 CPU。它可能不快,但应该准确,不支持处理器和支持SSE2的操作系统是两件不同的事情。处理器可能支持SSE2,因此在CPUID之后设置正确的位。但是,操作系统可能没有启用它(我认为它需要启用MMX扩展)。对于CPU支持,Ashley给出了答案。对于Windows下的操作系统支持,Timbo提供了答案。我还没有看到Linux下操作系统支持的答案。我认为这些是针对SSE2操作系统支持的GCC测试:。您最好使用_cpuid内在函数,因为Microsoft AMD64编译器不再支持内联汇编。是否有关于编译时检查什么以了解处理器可用的SSE指令集的指南?SSE3、SSE4、SSE4.1等。。。
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;
BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );