Maison >développement back-end >C++ >Comment déterminer le nombre réel de processeurs physiques ou de cœurs dans un système ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 04:28:02572parcourir

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>

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
  • Core 2 Quad Q8400 :

    logical cpus: 4
      cpu cores: 4
    hyper-threads: false
  • Xeon E5520 (packages double processeur) :

    logical cpus: 16
      cpu cores: 8
    hyper-threads: true
  • Pentium 4 3,00 GHz :

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