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?

Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top