2009-10-29 17 views
5

Sto riscontrando un problema con il mio codice basato su CPUID sui nuovi computer basati su i7. Sta rilevando che la CPU ha un singolo core con 8 unità HT anziché 4 core ciascuna con 2 unità HT.CPUID su processori Intel i7

Devo interpretare erroneamente i risultati delle informazioni CPUID che tornano dalla CPU, ma non riesco a vedere come.

In pratica, eseguo l'iterazione di ciascun processore visibile a Windows, imposta l'affinità del thread su quel thread e quindi eseguo una sequenza di chiamate CPUID.

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

Questa sequenza si ripete per il resto delle CPU nel sistema.

Qualcuno ha affrontato questo prima?

+0

Hey StarPacker, anche se ho paura di non essere in grado di aiutarti con questo specifico problema, ho una domanda correlata: http://stackoverflow.com/questions/1666093/cpuid-implementations-in-c Mi chiedevo se potessi impostarmi sul percorso corretto con un codice di esempio o qualcosa del genere ... Mi piacerebbe davvero avere il supporto X86/X64 per CPUID nella mia app per recuperare informazioni/caratteristiche del processore nei rapporti di arresto anomalo per un app che sto sviluppando e che verrà utilizzata da altri ricercatori (ho eseguito il mio codice su macchine a cui non potrò accedere direttamente). Saluti, Kris – Kris

risposta

5

Domanda interessante - sfortunatamente non ho un i7 con cui giocare, quindi posso solo indovinare qui.

Potrebbe essere utile dare un'occhiata a this article - mentre in linea di massima il tuo approccio sembra corretto, vengono indicati alcuni avvertimenti. Forse hai letto e vedi se in qualsiasi momento qualsiasi tua ipotesi potrebbe essere sbagliata. Utilizzano essenzialmente CPUID.1.EBX [23:16] (max # processori log in un pacchetto fisico), CPUID.4.EAX [31:26] +1 (numero massimo di core in un pacchetto fisico) e CPUID.4 .EAX [25:14] +1 (numero massimo di processori di log in un pacchetto fisico che condivide la cache del livello di destinazione) per dedurre la topologia del processore, che è sulla falsariga di ciò che si sta facendo.

In alternativa, in alternativa, su una CPU che supporta la funzione CPUID EAX = 0Bh (vedere Intel's docs here), è possibile utilizzare questa funzione per ottenere le specifiche desiderate. Forse confrontare i risultati dei due approcci può essere illuminante?

--Edit-- This è un articolo molto utile che copre entrambi gli approcci di cui sopra. Essenzialmente, ho capito che su un i7, CPUID.0B è la variante preferita.

+0

Grazie per questa risposta. Peccato che non sia stato accettato in quanto risponde perfettamente a questa domanda. – ttvd

+0

Sto riscontrando lo stesso problema su un i5-560m, dove CPUID.1.EBX [23:16] sta segnalando 16 processori logici invece di 4. Non ho idea del perché restituisca un risultato errato. Mentre il primo articolo PhiS collegato a potrebbe contenere la risposta, è stato rimosso. Gli altri collegamenti in realtà non forniscono una risposta. Anche se un metodo alternativo funziona, sembra che non ci siano ancora rime o motivi per cui il primo non lo fa. : -/ –

+0

Ah - il secondo articolo in realtà dice perché CPUID.1.EBX [23:16] non funziona: contrariamente a quanto implica l'AP-485, in realtà non restituisce il numero reale di processori logici: "CPUID.1: EBX [23:16] rappresenta il numero massimo di ID indirizzabili (ID APIC iniziale) che possono essere assegnati ai processori logici in un pacchetto fisico. Il valore potrebbe non essere uguale al numero di processori logici che sono presenti nell'hardware di un pacchetto fisico. " Argh, le cose più semplici sono sepolte così profondamente ... come se gli sviluppatori di applicazioni si preoccupassero più del massimo teorico del numero reale di thread. –

Problemi correlati