Determinar o suporte do processador para SSE2?
-
18-09-2019 - |
Pergunta
Eu preciso fazer determinar o suporte do processador para SSE2 antes da instalação de um software. Pelo que eu entendo, eu vim com isso:
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;
}
Será que isso funciona? Eu não sou realmente certo como teste, já que meu CPU suporta, então eu não entendo falsa da chamada de função.
Como faço para determinar o suporte do processador para SSE2?
Solução
Chamada CPUID com EAX = 1 para carregar os sinalizadores de recurso para EDX. Bit 26 é definido se SSE2 está disponível. Algum código para fins de demonstração, usando MSVC ++ linha de montagem (apenas para x86 e não portátil!):
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;
Outras dicas
Eu encontrei este por acidente no MSDN :
BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );
Windows-only, mas se você não está interessado em qualquer coisa multi-plataforma, muito simples.
A maneira mais básica para verificar se há suporte SSE2 é usando a instrução CPUID
(em plataformas onde está disponível). Quer utilizando linha de montagem ou usando intrínsecos do compilador.
Você pode usar a função _cpuid. Tudo é explicado no MSDN .