2010-03-08 21 views
14

Bir yazılım yüklemeden önce SSE2 için işlemci desteğini belirlemem gerekir. Anladığım kadarıyla, bununla geldim:SSE2 için işlemci desteğini belirleyin?

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

Bu işe yarar mı? CPU'nun bunu desteklediğinden, nasıl test edeceğime gerçekten emin değilim, bu yüzden işlev çağrısından yanlış anlamıyorum.

SSE2 için işlemci desteğini nasıl belirlerim?

+0

Herhangi bir işletim sistemi? –

+0

Windows xp veya daha üstü. – DogDog

+0

Kodunuz, söyleyebileceğim kadar iyi çalışmalı. CPUID yöntemini tercih ederim çünkü biraz daha esnek ve size diğer birçok CPU yetenek bayraklarına da erişmenizi sağlıyor. –

cevap

11

Özellik işaretlerini edx'e yüklemek için CPUID'yi eax = 1 ile çağırın. SSE2 mevcutsa Bit 26 ayarlanır. MSVC++ satır içi derleme kullanarak gösteri amaçlar için bazı kod (sadece x86 ve taşınabilir değil!):

BOOL sse2supported = ::IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE); 

Windows sadece, ama eğer:

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

Satır içi derleme artık Microsoft AMD64 derleyicisi tarafından desteklenmediğinden, __cpuid intrinsic'i daha iyi kullanmalısınız. –

+0

Bir işlemci mevcut bir SSE komutunun ne olduğunu öğrenmek için derleme zamanında kontrol edilecek bir kılavuz var mı? SSE3, SSE4, SSE4.1 vb ... – Alex

10

SSE2 desteğini denetlemenin en temel yolu CPUID yönergesini kullanmaktır (kullanılabildiği platformlarda). Satır içi derlemeyi veya derleyici iç kullanımını kullanarak.

8

_cpuid işlevini kullanabilirsiniz. Tümü MSDN'da açıklanmıştır.

16

ben MSDN yılında kazara bu bir tane buldum Çapraz platformda hiçbir şeyle ilgilenmiyorsunuz, çok basit.

+0

harika! paylaşım için teşekkürler. – cruppstahl