Maison  >  Article  >  développement back-end  >  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 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 12:38:26127parcourir

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 :

    • CPU Intel : si le fournisseur est « GenuineIntel », utilisez la fonction CPUID 4 pour obtenir le nombre de cœurs physiques cœurs 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 les bits [7:0] du registre ECX.

Implémentation

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

<code class="cpp">#include <iostream>
#include <string>

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 << 28) && cores < logicalCores) {
    hyperThreads = true;
  }

  // Print results
  std::cout << "Logical cores: " << logicalCores << std::endl;
  std::cout << "Cores: " << cores << std::endl;
  std::cout << "Hyper-threading: " << (hyperThreads ? "true" : "false") << std::endl;

  return 0;
}</code>

Exemples de sortie :

Intel Core 2 Duo E8400 (sans 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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn