2012-12-07 20 views
6

Wird das erwartet? Ich habe erwartet, dass meine Sandy Bridge-CPU meldet, dass sie MMX-, SSE- und SSE2-Anweisungen verarbeiten kann. Sind diese Bits nicht gesetzt, weil diese "alten" Befehlssätze durch einige der neueren ersetzt wurden?CPU-Befehl auf i5-2500k: MMX, SSE, SSE2-Bits sind nicht gesetzt

Ich habe this code here verwendet, um CPU-Erkennung in meinen Code zu setzen.

#include "CPUID.h" 
int main(int argc, char *argv[]) { 
    CPUID cpuid; 
    cpuid.load(0); 
    printf("CPU: %.4s%.4s%.4s", 
     (const char*)&cpuid.EBX(), 
     (const char*)&cpuid.EDX(), 
     (const char*)&cpuid.ECX() 
    ); 
    char brand[0x30]; 
    cpuid.load(0x80000002); memcpy(brand,&cpuid.EAX(),16); 
    cpuid.load(0x80000003); memcpy(brand+16,&cpuid.EAX(),16); 
    cpuid.load(0x80000004); memcpy(brand+32,&cpuid.EAX(),16); 
    printf("%.48s\n",brand); 
    cpuid.load(1); 
    // tests bit 23 of ECX for popcnt instruction support 
    printf("MMX - %s\n", cpuid.EAX() & (1 << 23) ? "yes" : "no"); 
    printf("SSE - %s\n", cpuid.EAX() & (1 << 25) ? "yes" : "no"); 
    printf("SSE2 - %s\n", cpuid.EAX() & (1 << 26) ? "yes" : "no"); 
    printf("SSE3 - %s\n", cpuid.ECX() & (1 << 0) ? "yes" : "no"); 
    printf("SSSE3 - %s\n", cpuid.ECX() & (1 << 9) ? "yes" : "no"); 
    printf("SSE4.1 - %s\n", cpuid.ECX() & (1 << 19) ? "yes" : "no"); 
    printf("SSE4.2 - %s\n", cpuid.ECX() & (1 << 20) ? "yes" : "no"); 
    printf("AES - %s\n", cpuid.ECX() & (1 << 25) ? "yes" : "no"); 
    printf("AVX - %s\n", cpuid.ECX() & (1 << 28) ? "yes" : "no"); 
    printf("HT - %s\n", cpuid.EAX() & (1 << 28) ? "yes" : "no"); 
    printf("IA64 (emulating x86) - %s\n", cpuid.EAX() & (1 << 30) ? "yes" : "no"); 
    printf("Hypervisor? - %s\n", cpuid.ECX() & (1 << 31) ? "yes" : "no"); 
    printf("popcnt - %s\n", cpuid.ECX() & (1 << 23) ? "yes" : "no"); 
    return 0; 
} 

Ausgang:

CPU: GenuineIntel  Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz 
MMX - no 
SSE - no 
SSE2 - no 
SSE3 - yes 
SSSE3 - yes 
SSE4.1 - yes 
SSE4.2 - yes 
AES - yes 
AVX - yes 
HT - no 
IA64 (emulating x86) - no 
Hypervisor? - no 
popcnt - yes 
+0

Diese Frage könnte auch eine gute Referenz sein: http://stackoverflow.com/questions/6121792/how-to-programmically-check-if-a-cpu-supports-sse3 – Mysticial

Antwort

6

Dumb Fehler. Ich nahm an, dass die erste Zeile in der Tabelle für EAX war, aber für EDX.

Korrekte Ergebnisse werden produziert. Nun, HT wird von diesem Chip nicht unterstützt, aber vielleicht ist dieser immer gesetzt.

Update: stellt sich heraus das "HT" bedeutet> 1 logischen Thread auf Paket (von denen dieser Chip 4 hat).

CPU: GenuineIntel  Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz 
MMX - yes 
SSE - yes 
SSE2 - yes 
SSE3 - yes 
SSSE3 - yes 
SSE4.1 - yes 
SSE4.2 - yes 
AES - yes 
AVX - yes 
HT - yes 
IA64 (emulating x86) - no 
Hypervisor? - no 
popcnt - yes