2011-12-19 16 views
5

Sto lavorando al rilevamento della CPU e al codice di rilevamento dell'ambiente generale per il mio sistema operativo per hobby. C'è mai un caso in cui CPUID deve essere chiamato più volte? Cioè se il sistema ha più core, il sistema operativo deve chiamare CPUID su ogni core? Lo stesso per NUMA.CPUID su più core/NUMA

Sia i manuali AMD e Intel CPUID non sono chiari su questo. C'è un articolo sul wiki di osdev che menziona chiamare CPUID chiamato Detecting CPU Topology, ma alla mia lettura non era chiaro quando e quante volte CPUID deve essere chiamato.

+0

Suppongo che una situazione in cui CPUID potrebbe agire in modo insolito è AMD Fusion, che contiene sia una CPU che una GPU sullo stesso chip. Dovresti dare un'occhiata alla documentazione per maggiori informazioni. Oltre a questo, non vedo perché un core della CPU interna mostrerebbe un CPUID diverso da un altro core. – Polynomial

+0

Oltre alla risposta data, un altro motivo per chiamare CPUID più volte è quando si utilizza l'istruzione rdtsc per le misurazioni delle prestazioni. Tipicamente usi cpuid prima di esso poiché cpuid è un'istruzione 'serializzante' e previene il pipelining, ma cpuid ha anche la brutta abitudine di impiegare più tempo per eseguire le prime volte che viene chiamato (secondo il vecchio manuale di intel su rdtsc), quindi è tipico di Chiamalo alcune volte all'avvio per assicurarti che sia velocizzato, quindi usalo prima di tutte le tue chiamate rdtsc. –

risposta

3

Dato che è passata quasi una settimana e nessuno è stato in grado di rispondere a questa domanda (probabilmente a causa delle vacanze), cercherò di rispondere comunque.

Penso che la risposta sia sì. Potrebbe essere necessario chiamare lo CPUID su ciascun core. Una ragione per questo è che non tutti i sistemi (anche x86) oggi sono omogenei.

Ad esempio, ho letto su un forum di overclocking (non riesco a trovare il collegamento) che è possibile mescolare due modelli di processore diversi su alcune schede server dual-socket. La persona aveva un sistema 1366 dual-socket con due diversi processori di velocità. (e diverso modello #s)

Quindi, in questo caso, chiamando CPUID dipenderà da quale processore il filo era - quindi avrete bisogno di chiamare una volta ogni processore per ottenere tutte le informazioni.

Nei manuali di una delle mie schede madri server, si afferma anche che è consentito mescolare processori di modelli diversi (con alcune restrizioni). E certamente, è possibile mixare due diversi steppings dello stesso modello di processore.


Questa ragione da sola (topologia eterogenea), è già motivo di bisogno di chiamare CPUID ogni core.

+0

Ci scusiamo per il lungo tempo di risposta, ma sì, credo che sia corretto. Ogni CPU su un die deve avere le informazioni CPUID estratte e archiviate. – nixeagle

+0

Quindi, cosa succede se chiamate CPUID su ogni core di ogni CPU con set di istruzioni diversi; cioè una CPU ha SSSE3, un altro SSSE4.2. Quindi si utilizzano queste informazioni per decidere di immettere una parte di codice che utilizza le istruzioni SSE4.2. Nel mezzo dell'esecuzione di questo codice, il sistema operativo sostituisce il thread e successivamente viene pianificato che si trova sulla CPU che supporta solo fino a SSSE3. Quindi il codice si blocca eseguendo un'istruzione SSE4.1. Quindi non è sufficiente nemmeno chiamare CPUID su più core, bisogna anche impostare l'affinità del thread dopo averlo fatto. È corretto? – Apriori

+0

@Apriori Sembra estremamente improbabile. Sono a conoscenza di una singola configurazione Intel o AMD x86 che consente di installare diverse CPU di generazioni diverse con set di istruzioni differenti. Ma se volessi essere eccessivamente attento, sì, puoi farlo. Penso che sia eccessivo. – Mysticial