2010-05-25 5 views
6

Ich kann die Anzahl der logischen Prozessoren auf allen drei Plattformen bereits richtig erkennen.C/C++/Assembly Programmatisch erkennen, ob Hyper-Threading unter Windows, Mac und Linux aktiv ist

Um die Anzahl der physischen Prozessoren/Cores korrekt erkennen zu können, muss ich erkennen, ob Hyperthreading unterstützt wird UND aktiv (oder aktiviert, wenn Sie bevorzugen) und wenn ja, dividieren Sie die Anzahl der logischen Prozessoren durch 2 Anzahl der physischen Prozessoren.

Perphaps soll ich ein Beispiel nennen:

Ein Quad-Core-Intel-CPUs mit aktiviertem Hyperthreading 4 physischen Kern hat, noch 8 logische Prozessoren (Hyperthreading schafft 4 weiteren logische Prozessoren). Also meine aktuelle Funktion würde 8 statt der gewünschten 4 erkennen.

Meine Frage ist daher, wenn es eine Möglichkeit gibt zu erkennen, ob Hyperthreading unterstützt und aktiviert ist?

Antwort

4

Linux:

Anzahl der physischen CPUs:

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

Anzahl der logischen CPUs:

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

rate ich muss Sie verwenden grep.cpp von Boost-Bibliothek in meinem Programm, um dies zu verwenden. Meine Frage war spezifisch für c/C++/assemler wie im Betreff und Tags erwähnt – HTASSCPP

5

Die CPUID Anweisung (wenn Sie Funktion 1H in EAX passieren) gibt sie Hyper-Threading Merker in Bit 28 des EDX-Registers. Ich denke, dass Multi-Core-Prozessoren berichten, dass sie Hyperthreading aktiviert sind, obwohl jeder einzelne Kern nur einen Thread ausführen kann.

Es gibt auch die Anzahl der logischen Prozessoren pro physischem Prozessor in den Bits 23-16 von EBX zurück. Ich denke, dass Sie jeden Prozessor einzeln abfragen müssen, um alle Prozessoren auf Ihrem System zu treffen.

4

Unter Windows 2003 Server und Windows XP SP3 und höher können Sie diese Informationen mithilfe des Systemaufrufs GetLogicalProcessorInformation ermitteln.

+0

Funktioniert dies auf sagen wir Windows 7 oder Windows Server 2008 RC2? Oder sollte ich dann GetLogicalProcessorInformation verwenden? – HTASSCPP

+0

Die msdn-Seite sagt über das Feld SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags "Wenn der Wert dieses Members 1 ist, teilen die logischen Prozessoren, die durch den Wert des ProcessorMask-Members identifiziert werden, funktionale Einheiten wie Hyperthreading oder SMT Prozessoren teilen keine funktionalen Einheiten. " Aber es sagt auch, dass der Wert vor Windows Vista falsch ist, und dann bedeutet nur, dass die logischen Prozessoren in demselben physischen Paket sind. Es gibt mehr Probleme: Es ist wirklich nicht spezifiziert, dass der Anruf die logischen Prozessoren auf eine nützliche Weise gruppiert. –

3

Auf OS X:

#include <sys/sysctl.h> 

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

Siehe Kopf- oder Manpage für weitere Informationen. (Beachten Sie, dass Sie die Anzahl der logischen CPUs auf die gleiche Weise mit der "hw.logicalcpu" -String erhalten können)

+0

Funktioniert perfekt auf allen Maschinen, die ich getestet habe, danke! – HTASSCPP

Verwandte Themen