Maison >développement back-end >C++ >Comment puis-je déterminer avec précision le nombre de cœurs physiques de mon système, compte tenu de la présence d'hyper-threading ?

Comment puis-je déterminer avec précision le nombre de cœurs physiques de mon système, compte tenu de la présence d'hyper-threading ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 13:17:03351parcourir

How can I accurately determine the number of physical cores in my system, considering the presence of hyper-threading?

Détection du nombre de processeurs/cœurs physiques avec prise en charge de l'hyper-threading

Dans les applications multithread qui visent une efficacité maximale, connaître le Le nombre de processeurs physiques ou de cœurs est crucial. La création excessive de threads peut nuire aux performances, en particulier dans les scénarios où l'hyper-threading est pris en charge.

Détection de l'hyper-threading

Pour déterminer avec précision le nombre de processeurs physiques, vous avez besoin pour détecter si l'hyper-threading est pris en charge et activé. Voici comment procéder :

  1. Identifier le fournisseur du processeur : Exécutez l'instruction CPUID avec la fonction 0 pour récupérer le fournisseur du processeur (par exemple, "GenuineIntel" ou "AuthenticAMD").
  2. Vérifier l'hyper-threading (Intel) : Pour les processeurs Intel, vérifiez le bit 28 dans EDX à partir de la fonction CPUID 1. S'il est défini, l'hyper-threading est pris en charge.
  3. Vérifier l'Hyper-Threading (AMD) : Pour les processeurs AMD, exécutez la fonction CPUID 0x80000008 pour obtenir le nombre de cœurs dans ECX[7:0]. Si ce nombre est supérieur à zéro, l'hyper-threading est pris en charge.

Détermination du nombre de cœurs physiques

Une fois la prise en charge de l'hyper-threading détectée, suivez ces étapes pour déterminer le nombre de cœurs physiques :

  • Pour les processeurs Intel, exécutez la fonction CPUID 4 et obtenez le nombre de EAX[31:26] 1.
  • Pour les processeurs AMD, utilisez le valeur ECX[7:0] précédemment obtenue à partir de la fonction CPUID 0x80000008 et ajoutez 1.

Exemple d'implémentation

Le programme C suivant démontre la détection d'hyper- threading et le nombre de cœurs physiques :

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

using namespace std;

void cpuID(unsigned i, unsigned regs[4]) {
#ifdef _WIN32
  __cpuid((int *)regs, (int)i);
#else
  asm volatile
    ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
     : "a" (i), "c" (0));
#endif
}

int main(int argc, char *argv[]) {
  unsigned regs[4];

  // ... (Code for vendor detection, feature check, and logical core count)
  
  // Hyper-Threading detection
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;

  // ... (Code for physical core count based on vendor)

  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}</code>

Conclusion

En suivant ces étapes, vous pouvez détecter avec précision le nombre de processeurs/cœurs physiques tout en tenant compte de l'hyper -prise en charge du filetage. Ces informations sont précieuses pour optimiser les performances de vos applications multithread.

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