Maison >développement back-end >C++ >Comment puis-je déterminer avec précision le nombre de processeurs physiques et de cœurs, en tenant compte des configurations hyper-threading ?

Comment puis-je déterminer avec précision le nombre de processeurs physiques et de cœurs, en tenant compte des configurations hyper-threading ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-29 04:58:29694parcourir

How can I accurately determine the number of physical processors and cores, taking into account hyper-threading configurations?

Détermination du nombre de processeurs physiques et de cœurs avec des considérations sur l'hyper-threading

La détection du nombre de processeurs physiques et de cœurs est cruciale pour optimiser le multithread applications pour fonctionner efficacement. Pour déterminer avec précision ces chiffres, envisagez les dépendances hyper-threading potentiellement activées.

Processus étape par étape :

  1. Identifier le fournisseur de processeur : Exécutez l'instruction CPUID (fonction 0) pour identifier le fournisseur du processeur, soit « GenuineIntel » ou « AuthenticAMD ».
  2. Vérifiez la prise en charge de l'Hyper-Threading (Intel) : Examinez les fonctionnalités du processeur registre (EDX) à partir de la fonction CPUID 1. Si le bit 28 est défini (EDX bit 28 = 1), la prise en charge de l'hyper-threading est active.
  3. Déterminer le nombre de cœurs logiques :Obtenir le cœur logique nombre par cœur physique à partir d'EBX[23:16] du résultat de la fonction CPUID 1.
  4. Distinguer le nombre de cœurs physiques :

    • Si le fournisseur est Intel, le nombre de cœurs physiques est de 1 plus EAX[31:26] de la fonction CPUID 4.
    • Si le fournisseur est AMD, le nombre de cœurs physiques est de 1 plus ECX[7:0] de la fonction CPUID 0x80000008. .

Implémentation C :

Le programme C suivant illustre ces étapes :

<code class="c++">#include <iostream>
#include <string>

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

int main() {
  unsigned regs[4];
  char vendor[12];

  // Get vendor
  cpuID(0, regs);
  ((unsigned *)vendor)[0] = regs[1];
  ((unsigned *)vendor)[1] = regs[3];
  ((unsigned *)vendor)[2] = regs[2];
  string cpuVendor = string(vendor, 12);

  // Get CPU features
  cpuID(1, regs);
  unsigned cpuFeatures = regs[3];

  // Logical core count per CPU
  cpuID(1, regs);
  unsigned logical = (regs[1] >> 16) & 0xff;
  cout << " logical cpus: " << logical << endl;
  unsigned cores = logical;

  if (cpuVendor == "GenuineIntel") {
    // Get DCP cache info
    cpuID(4, regs);
    cores = ((regs[0] >> 26) & 0x3f) + 1;
  } else if (cpuVendor == "AuthenticAMD") {
    // Get NC: Number of CPU cores - 1
    cpuID(0x80000008, regs);
    cores = ((unsigned)(regs[2] & 0xff)) + 1;
  }

  cout << "    cpu cores: " << cores << endl;

  // Detect hyper-threads
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;
  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}</code>

En adhérant Grâce à ces étapes et en utilisant le programme C fourni, les développeurs peuvent déterminer avec précision le nombre de processeurs physiques et de cœurs, en tenant compte des nuances des configurations hyper-threading sur différentes plates-formes.

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