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!