确定处理器支持SSE2?

在安装软件之前,我需要确定处理器对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; } 

这会工作吗? 我真的不知道如何testing,因为我的CPU支持它,所以我不会从函数调用错误。

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

使用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; 

我在MSDN中偶然发现了这个:

 BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE ); 

只有Windows,但是如果你对跨平台的任何东西都不感兴趣,很简单。

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

您可以使用_cpuid函数。 所有在MSDN中解释。