2010-03-08 18 views
14

Necesito determinar el soporte del procesador para SSE2 antes de instalar un software. Por lo que entiendo, se me ocurrió esto:¿Determina el soporte del procesador para SSE2?

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

¿Funcionaría? No estoy seguro de cómo probar, ya que mi CPU lo admite, por lo que no obtengo ningún resultado falso de la llamada a la función.

¿Cómo determino el soporte del procesador para SSE2?

+0

¿Algún sistema operativo en particular? –

+0

Windows xp o superior. – DogDog

+0

Su código debería funcionar bien hasta donde yo sé. Preferiría la forma de CPUID porque es un poco más flexible y también le da acceso a muchas otras banderas de capacidades de la CPU. –

Respuesta

11

Llamar CPUID con eax = 1 para cargar los indicadores de función en edx. El bit 26 se establece si SSE2 está disponible. Algo de código para fines de demostración, utilizando MSVC ensamblado 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; 
+5

Debería utilizar mejor el __cpuid intrínseco, porque el ensamblado en línea ya no es compatible con el compilador AMD64 de Microsoft. –

+0

¿Hay alguna guía sobre qué verificar en el momento de la compilación para saber qué opciones de instrucción SSE tiene disponible un procesador? SSE3, SSE4, SSE4.1 etc ... – Alex

10

La forma más básica de comprobar la compatibilidad con SSE2 es mediante el uso de la instrucción CPUID (en plataformas donde está disponible). Ya sea mediante el ensamblaje en línea o el uso de compiladores intrínsecos.

8

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

16

me encontré con este por un 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.

+0

¡increíble! gracias por compartir. – cruppstahl

Cuestiones relacionadas