"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment déterminer si l'Hyper-Threading est activé sur Windows, Mac et Linux ?

Comment déterminer si l'Hyper-Threading est activé sur Windows, Mac et Linux ?

Publié le 2024-11-23
Parcourir:734

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

Détection de l'existence d'hyper-threading activé

Dans les applications multithread, l'utilisation d'un thread par cœur de processeur physique garantit des performances optimales. Pour une détermination précise du nombre de threads, il est essentiel de faire la distinction entre les cœurs physiques et hyper-threading. Voici comment détecter la prise en charge de l'hyper-threading et son état d'activation sous Windows, Mac et Linux :

Instruction CPUID

En utilisant l'instruction CPUID, nous pouvons recueillir des informations sur les capacités et la configuration du processeur. Un processus étape par étape est décrit ci-dessous :

  1. Détection du fournisseur : exécutez la fonction CPUID 0 pour identifier le fournisseur du processeur (par exemple, Intel ou AMD).
  2. Vérification des bits Hyper-Threading : exécutez la fonction CPUID 1 et vérifiez le bit 28 dans le registre EDX. Ce bit indique la prise en charge de l'hyper-threading.
  3. Nombre de cœurs logiques : récupérez le nombre de cœurs logiques par processeur à partir des bits [23:16] d'EBX dans la fonction CPUID 1.
  4. Nombre de cœurs physiques :

    • Intel Processeurs : si le fournisseur est « GenuineIntel », utilisez la fonction CPUID 4 pour obtenir le nombre de cœurs physiques plus un en extrayant les bits [31:26] du registre EAX.
    • CPU AMD : si le fournisseur est « AuthenticAMD », exécutez la fonction CPUID 0x80000008 et dérivez le nombre de cœurs physiques plus un en prenant des bits. [7:0] du registre ECX.

Implémentation

Voici un programme C qui implémente cette méthode :

#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 

Exemples de sortie :

Intel Core 2 Duo E8400 (pas d'hyper-threading) :

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

Intel Core i7-7700K (avec hyper-threading) :

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

AMD Ryzen 5 2600X (avec SMT) :

 Logical cores: 12
    Cores: 6
hyper-threads: true
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3