Bestimmen Prozessor-Unterstützung für SSE2?
-
18-09-2019 - |
Frage
ich tun muß Prozessor-Unterstützung für SSE2 vor der Installation einer Software zu bestimmen. Von dem, was ich verstehe, kam ich mit auf den Punkt:
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;
}
Würde das funktionieren? Ich bin mir nicht wirklich sicher, wie zu testen, da meine CPU unterstützt, so dass ich nicht bekommen, falsch aus dem Funktionsaufruf.
Wie kann ich feststellen Prozessor-Unterstützung für SSE2?
Lösung
Rufen CPUID mit EAX = 1 die Funktion Flags um edx zu laden. Bit 26 wird gesetzt, wenn SSE2 zur Verfügung steht. Einige Code zu Demonstrationszwecken mit MSVC ++ Inline-Assembler (nur für x86 und nicht tragbar!):
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;
Andere Tipps
Ich fand diese einen nach dem Unfall in der MSDN :
BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );
nur für Windows, aber wenn Sie nicht daran interessiert sind, etwas plattformübergreifende, sehr einfach.
Die einfachste Art und Weise für SSE2-Unterstützung zu überprüfen, ist durch die CPUID
Anweisung verwendet wird (auf Plattformen, wo es verfügbar ist). Entweder mit Inline-Assembler oder mit Compiler-Spezifika.
Sie können die _cpuid-Funktion verwenden. Alle in der MSDN .