Déterminer le soutien du processeur SSE2?
-
18-09-2019 - |
Question
Je dois faire déterminer le soutien du processeur pour l'installation préalable d'un logiciel SSE2. D'après ce que je comprends, je suis venu avec ceci:
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;
}
Est-ce que ce travail? Je ne suis pas sûr de savoir comment tester, depuis mon CPU prend en charge, donc je ne suis pas faux de l'appel de fonction.
Comment puis-je déterminer le soutien du processeur SSE2?
La solution
Appel CPUID avec EAX = 1 pour charger les indicateurs de fonctionnalité pour EDX. Bit 26 est réglé si SSE2 est disponible. Une partie du code à des fins de démonstration, en utilisant MSVC ++ assembleur en ligne (uniquement pour x86 et non portable!):
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;
Autres conseils
J'ai trouvé celui-ci par hasard dans le MSDN :
BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );
Windows uniquement, mais si vous n'êtes pas intéressé par quoi que ce soit multi-plateforme, très simple.
La façon la plus simple de vérifier le support SSE2 est en utilisant l'instruction CPUID
(sur les plates-formes où il est disponible). Soit en utilisant assemblage en ligne ou en utilisant des valeurs intrinsèques du compilateur.
Vous pouvez utiliser la fonction _cpuid. Tout est expliqué dans le MSDN .