2010-03-08 2 views
14

Мне нужно определить поддержку процессора для SSE2 перед установкой программного обеспечения. Насколько я понимаю, я придумал следующее:Определить поддержку процессора для 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; 
} 

Будет ли это работать? Я не уверен, как тестировать, так как мой процессор поддерживает его, поэтому я не получаю false из вызова функции.

Как определить поддержку процессора для SSE2?

+0

Любая конкретная операционная система? –

+0

Windows xp или выше. – DogDog

+0

Ваш код должен работать нормально, насколько я могу судить. Я бы предпочел путь CPUID, потому что он немного более гибкий и дает вам доступ к целому ряду других флагов возможностей ЦП. –

ответ

11

Вызовите CPUID с eax = 1, чтобы загрузить флаги функций в edx. Бит 26 устанавливается, если доступен SSE2. Некоторый код для демонстрационных целей, с использованием MSVC++ ассемблерные (только для x86 и не портативный!):

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

Вам лучше использовать встроенный __cpuid, потому что встроенная сборка больше не поддерживается компилятором Microsoft AMD64. –

+0

Есть ли руководство по проверке во время компиляции, чтобы узнать, какие команды SSE наборы процессоров доступны? SSE3, SSE4, SSE4.1 и т. Д. – Alex

10

Самый простой способ проверить поддержку SSE2 - использовать инструкцию (на платформах, где она доступна). Либо использовать встроенную сборку, либо использовать встроенные компиляторы.

8

Вы можете использовать функцию _cpuid. Все объяснено в MSDN.

16

Я нашел это случайно в MSDN:

BOOL sse2supported = ::IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE); 

для Windows-только, но если вы не заинтересованы ни в чем кросс-платформенном, очень простом.

+0

удивительный! Спасибо, что поделился. – cruppstahl

Смежные вопросы