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

Comment déterminer le nombre réel de processeurs physiques ou de cœurs dans un système ?

Mary-Kate Olsen
Libérer: 2024-11-01 04:28:02
original
507 Les gens l'ont consulté

How to Determine the Actual Number of Physical Processors or Cores in a System?

Détermination du nombre de processeurs physiques/cœurs

Pour des performances optimales, les applications multithread nécessitent un nombre précis de processeurs physiques ou de cœurs. La détection du nombre de processeurs logiques est insuffisante, en particulier compte tenu de l'hyperthreading, où plusieurs threads logiques s'exécutent sur un seul cœur physique.

Détection de la prise en charge et de l'activation de l'hyperthreading

Pour compter avec précision processeurs physiques, il est crucial de déterminer si l'hyperthreading est pris en charge et activé. Cela nécessite d'examiner le bit 28 du registre EDX de l'instruction CPUID. Si ce bit est défini, l'hyperthreading est pris en charge. Cependant, il ne suffit pas de simplement confirmer le soutien ; le bit doit également être actif.

Implémentation à l'aide de l'instruction CPUID

Une solution C complète utilisant l'instruction CPUID est présentée :

<code class="cpp">#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;
  unsigned cores = logical;

  // Determine core count based on vendor
  if (cpuVendor == "GenuineIntel") {
    cpuID(4, regs);
    cores = ((regs[0] >> 26) & 0x3f) + 1;
  } else if (cpuVendor == "AuthenticAMD") {
    cpuID(0x80000008, regs);
    cores = ((regs[2] & 0xff)) + 1;
  }

  // Detect hyper-threads
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;

  // Display results
  cout << " logical cpus: " << logical << endl;
  cout << "    cpu cores: " << cores << endl;
  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}</code>
Copier après la connexion

Exemples de sortie

Lorsqu'il est exécuté sur différents systèmes Intel, le programme génère :

  • Core 2 Duo T7500 :

    logical cpus: 2
      cpu cores: 2
    hyper-threads: false
    Copier après la connexion
  • Core 2 Quad Q8400 :

    logical cpus: 4
      cpu cores: 4
    hyper-threads: false
    Copier après la connexion
  • Xeon E5520 (packages double processeur) :

    logical cpus: 16
      cpu cores: 8
    hyper-threads: true
    Copier après la connexion
  • Pentium 4 3,00 GHz :

    logical cpus: 2
      cpu cores: 1
    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!