2010-05-25 18 views
6

È possibile rilevare correttamente correttamente il numero di processori logici su tutte e tre queste piattaforme.C/C++/Assembly Rileva automaticamente se Hyper-Threading è attivo su Windows, Mac e Linux

Per poter rilevare correttamente il numero di processori/core fisici, dovrò rilevare se l'hyperthreading è supportato E attivo (o abilitato se si preferisce) e in tal caso dividere il numero di processori logici per 2 per determinare il numero di processori fisici.

Perphaps devo fornire un esempio:

Un quad core Intel CPU con hyperthreading abilitato ha 4 core fisici, eppure 8 processori logici (hyperthreading crea 4 processori più logici). Quindi la mia funzione attuale rileva 8 invece del desiderato 4.

La mia domanda è quindi se c'è un modo per rilevare se l'hyperthreading è supportato E ABILITATO?

risposta

4

Linux:

Numero di CPU fisiche:

grep -i "physical id" /proc/cpuinfo | sort -u | wc -l 

Numero di CPU logiche:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l 
+0

suppongo che dovrò usare grep.cpp dalla libreria boost nel mio programma per usarlo. La mia domanda era specifica per c/C++/assemler come indicato nell'oggetto e nei tag – HTASSCPP

5

L'istruzione CPUID (quando si passa la funzione 1H in EAX) si ritorna hyper threading flag di funzionalità nel bit 28 del registro EDX. Penso che i processori multi-core dichiarino di essere ipertestionati abilitati anche se ogni singolo core può eseguire solo un thread.

Restituisce inoltre il numero di processori logici per processore fisico nei bit 23-16 di EBX. Penso che dovresti interrogare ogni processore individualmente per colpire tutti i processori sul tuo sistema.

4

Su Windows 2003 Server e Windows XP SP3 e versioni successive, è possibile determinare queste informazioni utilizzando la chiamata di sistema GetLogicalProcessorInformation.

+0

Funziona su Windows 7 o Windows Server 2008 RC2? O dovrei usare GetLogicalProcessorInformation allora? – HTASSCPP

+0

La pagina msdn dice del campo SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags "Se il valore di questo membro è 1, i processori logici identificati dal valore del membro ProcessorMask condividono le unità funzionali, come in Hyperthreading o SMT. Altrimenti, la logica identificata i processori non condividono unità funzionali ". Ma dice anche che il valore è sbagliato prima di Windows Vista, e quindi significa solo che i processori logici si trovano nello stesso pacchetto fisico. Ci sono più problemi: in realtà non è specificato che la chiamata raggrupperà i processori logici in un modo utile. –

3

Su OS X:

#include <sys/sysctl.h> 

int physicalCores; 
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0); 

Vedi l'intestazione o pagina di manuale per ulteriori informazioni. (Nota che puoi ottenere il numero di cpus logiche allo stesso modo, usando la stringa "hw.logicalcpu")

+0

Funziona perfettamente su tutte le macchine su cui ho provato, grazie! – HTASSCPP

Problemi correlati