Determinare il supporto del processore per SSE2?
-
18-09-2019 - |
Domanda
Ho bisogno di fare di determinare il supporto del processore per SSE2 prima installazione di un software. Da quello che ho capito, mi si avvicinò con questo:
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;
}
Sarebbe questo lavoro? Io non sono davvero sicuro di come prova, dal momento che la mia CPU supporta, in modo da non ottengo falso dalla chiamata di funzione.
Come faccio a determinare il supporto del processore per SSE2?
Soluzione
Chiama CPUID con EAX = 1 per caricare le funzionalità bandiere a edx. Bit 26 viene impostato se SSE2 è disponibile. Alcuni di codice a scopo dimostrativo, usando MSVC assemblaggio ++ inline (solo per x86 e non portatile!):
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;
Altri suggerimenti
Ho trovato questo uno per incidente nel MSDN :
BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );
solo per Windows, ma se non siete interessati a qualcosa di cross-platform, molto semplice.
Il modo più semplice per verificare il supporto SSE2 è quello di utilizzare l'istruzione CPUID
(su piattaforme in cui è disponibile). Sia utilizzando l'assembly inline o utilizzando intrinseci compilatore.
È possibile utilizzare la funzione _cpuid. Tutto è spiegato in MSDN .