Pregunta

Necesito hacer determinar el apoyo procesador para SSE2 instalación antes de un software. Por lo que sé, se me ocurrió esto:

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;
}

Que este trabajo? No estoy muy seguro de cómo poner a prueba, ya que mi CPU es compatible con él, así que no entiendo falsa de la llamada a la función.

¿Cómo determino soporte de procesadores para SSE2?

¿Fue útil?

Solución

Llamada CPUID con eax = 1 para cargar los señalizadores de característica para EDX. El bit 26 se establece si SSE2 está disponible. Algo de código para fines de demostración, utilizando MSVC ++ ensamblaje en línea (sólo para x86 y no 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;

Otros consejos

Me pareció que éste era por accidente en el MSDN :

BOOL sse2supported = ::IsProcessorFeaturePresent( PF_XMMI64_INSTRUCTIONS_AVAILABLE );

sólo para Windows, pero si usted no está interesado en nada multiplataforma, muy simple.

La forma más sencilla de comprobar si hay SSE2 es mediante el uso de la instrucción CPUID (en plataformas donde está disponible). Ya sea usando ensamblado en línea o usando intrínsecos del compilador.

Puede utilizar la función _cpuid. Todo se explica en la MSDN .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top