2009-10-29 22 views
5

Ich habe ein Problem mit meinem CPUID-basierten Code auf neueren i7-basierten Rechnern. Es erkennt die CPU als einen einzelnen Kern mit 8 HT-Einheiten anstelle von 4 Kernen mit jeweils 2 HT-Einheiten.CPUID auf Intel i7 Prozessoren

Ich muss die Ergebnisse der CPUID-Informationen, die von der CPU kommen, falsch interpretieren, aber ich kann nicht sehen, wie.

Grundsätzlich durchlaufen ich jeden für Windows sichtbaren Prozessor, legen Threadaffinität für diesen Thread fest und führen dann eine Reihe von CPUID-Aufrufen durch.

args = new CPUID_Args(); 
args.eax = 1; 
executeHandler(ref args); 
if (0 != (args.edx & (0x1 << 28))) 
{ 
    //If the 28th bit in EDX is flagged, this processor supports multiple logical processors per physical package 
    // in this case bits 23:16 of EBX should give the count. 
//** EBX here is 0x2100800 
    logicalProcessorCount = (args.ebx & 0x00FF0000) >> 16; 
//** this tells me there are 16 logical processors (wrong) 
} 
else 
{ logicalProcessorCount = 1; } 
apic = unchecked((byte)((0xFF000000 & args.ebx) >> 24)); 

if (maximumSupportedCPUID >= 4) 
{ 
    args = new CPUID_Args(); 
    args.eax = 4; 
    executeHandler(ref args); 
//EAX now contains 0x1C004121 
    coreCount = 1 + ((args.eax & 0xFC000000) >> 26); 
//This calculates coreCount as 8 
} 
else 
{ coreCount = 1; } 

Diese Sequenz wird für den Rest der CPUs im System wiederholt.

Hat jemand das schon mal gesehen?

+0

Hallo StarPacker, obwohl ich leider nicht in der Lage sein werde, Ihnen mit diesem speziellen Problem zu helfen Ich habe eine verwandte Frage: http://stackoverflow.com/questions/1666093/cpuid-implementations-in-c Ich frage mich, ob Sie mich auf den richtigen Pfad mit etwas Beispielcode oder etwas festlegen könnten ... Ich würde wirklich gerne X86/X64 Unterstützung für CPUID in meiner App haben, um Prozessorinformationen/Funktionen in Absturzberichte für eine zurück zu bekommen App, die ich entwickle und die von Forscherkollegen benutzt wird (ho wird meinen Code auf Maschinen laufen lassen, auf die ich nicht direkt zugreifen kann). Prost, Kris – Kris

Antwort

5

Interessante Frage - leider habe ich keinen i7 zum Spielen, also kann ich hier nur raten.

Es kann nützlich sein, einen Blick auf this article zu werfen - während im Prinzip Ihr ​​Ansatz richtig scheint, geben sie ein paar Vorbehalte an. Vielleicht lesen Sie, ob Ihre Annahmen zu irgendeinem Zeitpunkt falsch sind. Sie verwenden im Wesentlichen CPUID.1.EBX [23:16] (max. # Log-Prozessoren in einem physischen Paket), CPUID.4.EAX [31:26] +1 (max. Anzahl der Kerne in einem physischen Paket) und CPUID.4 .EAX [25:14] +1 (max. Anzahl der Protokollprozessoren in einem physischen Paket, das den Cache der Zielebene gemeinsam nutzt), um die Prozessor-Topologie abzuleiten - was in etwa dem entspricht, was Sie tun.

Zweitens, als Alternative zu einer CPU, die die CPUID-Funktion EAX = 0Bh unterstützt (siehe), können Sie stattdessen diese Funktion verwenden, um die gewünschten Spezifikationen zu erhalten. Vielleicht kann der Vergleich der Ergebnisse der beiden Ansätze aufschlussreich sein?

--Edit-- This ist ein sehr nützlicher Artikel, der beide oben genannten Ansätze abdeckt. Im Wesentlichen nehme ich an, dass auf einem i7 CPUID.0B die bevorzugte Variante ist.

+0

Vielen Dank für diese Antwort. Schade, dass es nicht akzeptiert wurde, da es diese Frage perfekt beantwortet. – ttvd

+0

Ich habe das gleiche Problem auf einem i5-560m, wo CPUID.1.EBX [23:16] 16 logische Prozessoren anstelle von 4 meldet. Ich habe keine Ahnung, warum es ein falsches Ergebnis zurückgibt. Während der erste Artikel, mit dem PhiS verlinkt ist, die Antwort enthalten hat, wurde sie entfernt. Die anderen Links liefern keine Antwort. Selbst wenn eine alternative Methode funktioniert, scheint es immer noch keinen Sinn oder Grund zu geben, warum der erste nicht funktioniert. : -/ –

+0

Ah - der zweite Artikel sagt tatsächlich, warum CPUID.1.EBX [23:16] nicht funktioniert: Im Gegensatz zu dem, was AP-485 impliziert, gibt es nicht die tatsächliche Anzahl logischer Prozessoren zurück: "CPUID.1: EBX [23:16] stellt die maximale Anzahl adressierbarer IDs (anfängliche APIC-ID) dar, die logischen Prozessoren in einem physischen Paket zugewiesen werden können. Der Wert stimmt möglicherweise nicht mit der Anzahl der logischen Prozessoren überein sind in der Hardware eines physischen Pakets vorhanden. " Argh, das einfachste Zeug ist so tief vergraben ... als ob Entwickler sich mehr für das theoretische Maximum als für die tatsächliche Anzahl von Threads interessieren. –