Physische Prozessoren und Kerne mit Hyper-Threading-Unterstützung erkennen
Einführung
In Multi- Bei Thread-Anwendungen ist es entscheidend, die Leistung zu optimieren, indem die Anzahl der Threads an die verfügbaren physischen Prozessoren oder Kerne angepasst wird. Um dies zu erreichen, ist es wichtig, zwischen physischen und virtuellen Kernen zu unterscheiden, insbesondere wenn es um Hyper-Threading geht. Dieser Artikel befasst sich mit der Frage: Wie können wir die Anzahl der physischen Prozessoren und Kerne unter Berücksichtigung des potenziellen Vorhandenseins von Hyper-Threading genau ermitteln?
Hyper-Threading verstehen
Hyper-Threading ist eine Technologie, die virtuelle Kerne innerhalb physischer Kerne erstellt. Dadurch kann ein einzelner physischer Kern mehrere Threads verarbeiten, wodurch die Gesamtanzahl der Threads effektiv erhöht wird. Es ist jedoch wichtig zu beachten, dass physische Kerne im Allgemeinen eine bessere Leistung als virtuelle Kerne bieten.
Erkennungsmethode
Um die Anzahl der physischen Prozessoren und Kerne genau zu erkennen, haben wir kann die CPUID-Anweisung verwenden (verfügbar auf x86- und x64-Prozessoren). Diese Anweisung enthält herstellerspezifische Informationen über den Prozessor, einschließlich:
Implementierung
Der folgende C-Code bietet eine plattformunabhängige Methode zur Erkennung physischer Prozessoren und Kerne unter Berücksichtigung von Hyper-Threading:
<code class="cpp">#include <iostream> #include <stdint.h> using namespace std; // Execute CPUID instruction void cpuID(uint32_t functionCode, uint32_t* registers) { #ifdef _WIN32 __cpuid((int*)registers, (int)functionCode); #else asm volatile( "cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]) : "a" (functionCode), "c" (0) ); #endif } int main() { uint32_t registers[4]; uint32_t logicalCoreCount, physicalCoreCount; // Get vendor cpuID(0, registers); string vendor = (char*)(®isters[1]); // Get CPU features cpuID(1, registers); uint32_t cpuFeatures = registers[3]; // Get logical core count cpuID(1, registers); logicalCoreCount = (registers[1] >> 16) & 0xff; cout << "Logical cores: " << logicalCoreCount << endl; // Get physical core count physicalCoreCount = logicalCoreCount; if (vendor == "GenuineIntel") { // Intel cpuID(4, registers); physicalCoreCount = ((registers[0] >> 26) & 0x3f) + 1; } else if (vendor == "AuthenticAMD") { // AMD cpuID(0x80000008, registers); physicalCoreCount = ((unsigned)(registers[2] & 0xff)) + 1; } cout << "Physical cores: " << physicalCoreCount << endl; // Check hyper-threading bool hyperThreads = cpuFeatures & (1 << 28) && (physicalCoreCount < logicalCoreCount); cout << "Hyper-threads: " << (hyperThreads ? "true" : "false") << endl; return 0; }</code>
Ergebnisse
Bei Ausführung auf verschiedenen Intel- und Bei AMD-Prozessoren liefert dieser Code eine Ausgabe ähnlich der folgenden:
Intel Core i5-7200U (2 physische Kerne, 4 logische Kerne):
Logical cores: 4 Physical cores: 2 Hyper-threads: true
AMD Ryzen 7 1700X (8 physische Kerne, 16 logische Kerne):
Logical cores: 16 Physical cores: 8 Hyper-threads: true
Fazit
Durch die Implementierung dieser Erkennungsmethode können Entwickler die Anzahl der Threads in ihren Multithread-Anwendungen genau an die anpassen verfügbare physische Prozessoren und Kerne, wodurch die Leistung auf Windows-, Mac- und Linux-Systemen optimiert wird. Dies gewährleistet eine effiziente Nutzung der zugrunde liegenden Hardwareressourcen, was zu einer verbesserten Leistung und kürzeren Ausführungszeiten führt.
Das obige ist der detaillierte Inhalt vonWie erkennt man physische Prozessoren und Kerne mit Hyper-Threading-Unterstützung genau?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!