Maison > développement back-end > C++ > le corps du texte

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

Linda Hamilton
Libérer: 2024-10-30 12:38:26
original
134 Les gens l'ont consulté

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>
Copier après la connexion

Exemples de sortie :

Intel Core 2 Duo E8400 (sans hyper-threading) :

Logical cores: 2
Cores: 2
Hyper-threading: false
Copier après la connexion

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

 Logical cores: 8
    Cores: 4
hyper-threads: true
Copier après la connexion

AMD Ryzen 5 2600X (avec SMT) :

 Logical cores: 12
    Cores: 6
hyper-threads: true
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!