Heim > Backend-Entwicklung > C++ > Wie erkennt man physische Prozessoren und Kerne mit Hyper-Threading-Unterstützung genau?

Wie erkennt man physische Prozessoren und Kerne mit Hyper-Threading-Unterstützung genau?

DDD
Freigeben: 2024-11-01 08:17:30
Original
490 Leute haben es durchsucht

How to Accurately Detect Physical Processors and Cores with Hyper-Threading Support?

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:

  1. CPU-Anbieter: Dies identifiziert den Hersteller des Prozessors (z. B. Intel, AMD).
  2. CPU-Funktionen: Dazu gehört eine Bitmaske, die Hyper-Threading-Unterstützung und andere anzeigt Funktionen.
  3. Logische Kernanzahl: Dies stellt die Gesamtzahl der Kerne im Prozessor dar, einschließlich virtueller Kerne.
  4. Physische Kernanzahl: Dies gibt die Anzahl der physischen Kerne im an Prozessor.

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*)(&registers[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>
Nach dem Login kopieren

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
Nach dem Login kopieren

AMD Ryzen 7 1700X (8 physische Kerne, 16 logische Kerne):

Logical cores: 16
Physical cores: 8
Hyper-threads: true
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage