„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie kann festgestellt werden, ob Hyper-Threading unter Windows, Mac und Linux aktiviert ist?

Wie kann festgestellt werden, ob Hyper-Threading unter Windows, Mac und Linux aktiviert ist?

Veröffentlicht am 23.11.2024
Durchsuche:298

How to Determine if Hyper-Threading is Enabled on Windows, Mac, and Linux?

Erkennen des Vorhandenseins von aktiviertem Hyper-Threading

In Multithread-Anwendungen sorgt die Verwendung eines Threads pro physischem Prozessorkern für optimale Leistung. Für eine genaue Bestimmung der Thread-Anzahl ist es wichtig, zwischen physischen Kernen und Hyper-Threading-Kernen zu unterscheiden. So erkennen Sie die Hyper-Threading-Unterstützung und ihren Aktivierungsstatus unter Windows, Mac und Linux:

CPUID-Anweisung

Mithilfe der CPUID-Anweisung können wir Informationen über die Fähigkeiten und die Konfiguration des Prozessors sammeln. Nachfolgend wird ein schrittweiser Prozess beschrieben:

  1. Anbietererkennung: Führen Sie die CPUID-Funktion 0 aus, um den CPU-Anbieter zu identifizieren (z. B. Intel oder AMD).
  2. Hyper-Threading-Bitprüfung: CPUID-Funktion 1 ausführen und Bit 28 im EDX-Register prüfen. Dieses Bit zeigt Hyper-Threading-Unterstützung an.
  3. Logische Kernanzahl: Rufen Sie die Anzahl der logischen Kerne pro CPU aus den Bits [23:16] von EBX in CPUID-Funktion 1 ab.
  4. Physischer Kern Count:

    • Intel CPUs: Wenn der Anbieter „GenuineIntel“ ist, verwenden Sie die CPUID-Funktion 4, um die Anzahl der physischen Kerne plus eins durch Extrahieren von Bits zu erhalten [31:26 ] des EAX-Registers.
    • AMD-CPUs: Wenn der Anbieter „AuthenticAMD“ ist, Führen Sie die CPUID-Funktion 0x80000008 aus und leiten Sie die Anzahl der physischen Kerne plus eins ab, indem Sie die Bits [7:0] des ECX-Registers verwenden.

Implementierung

Hier ist eine C-Programm, das diese Methode implementiert:

#include 
#include 

void cpuID(unsigned i, unsigned regs[4]);

int main() {
  unsigned regs[4];

  // Get CPUID information
  cpuID(0x00, regs);
  cpuID(0x01, regs);

  // Determine vendor
  char vendor[12];
  ((unsigned *)vendor)[0] = regs[1];
  ((unsigned *)vendor)[1] = regs[3];
  ((unsigned *)vendor)[2] = regs[2];
  std::string cpuVendor = std::string(vendor, 12);

  // Variables
  unsigned logicalCores = (regs[1] >> 16) & 0xff;
  unsigned cores = logicalCores;
  bool hyperThreads = false;

  // Detect hyper-threading
  if (cpuVendor == "GenuineIntel") {
    cpuID(0x04, regs);
    cores = ((regs[0] >> 26) & 0x3f)   1;
  } else if (cpuVendor == "AuthenticAMD") {
    cpuID(0x80000008, regs);
    cores = ((unsigned)(regs[2] & 0xff))   1;
  }

  if (regs[3] & (1 

Ausgabebeispiele:

Intel Core 2 Duo E8400 (kein Hyper-Threading):

Logical cores: 2
Cores: 2
Hyper-threading: false

Intel Core i7-7700K (mit Hyper-Threading):

 Logical cores: 8
    Cores: 4
hyper-threads: true

AMD Ryzen 5 2600X (mit SMT):

 Logical cores: 12
    Cores: 6
hyper-threads: true
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3