Détection des processeurs physiques et des cœurs avec prise en charge de l'Hyper-Threading
Introduction
En multi- Pour les applications threadées, il est crucial d'optimiser les performances en alignant le nombre de threads sur les processeurs physiques ou les cœurs disponibles. Pour y parvenir, il est essentiel de distinguer les cœurs physiques des cœurs virtuels, notamment lorsqu’il s’agit d’hyper-threading. Cet article répond à la question : Comment pouvons-nous détecter avec précision le nombre de processeurs physiques et de cœurs, compte tenu de la présence potentielle de l'hyper-threading ?
Comprendre l'hyper-threading
L'hyper-threading est une technologie qui crée des cœurs virtuels au sein de cœurs physiques. Cela permet à un seul cœur physique de gérer plusieurs threads, augmentant ainsi le nombre global de threads. Cependant, il est important de noter que les cœurs physiques offrent généralement des performances supérieures par rapport aux cœurs virtuels.
Méthode de détection
Pour détecter avec précision le nombre de processeurs physiques et de cœurs, nous peut utiliser l'instruction CPUID (disponible sur les processeurs x86 et x64). Cette instruction fournit des informations spécifiques au fournisseur sur le processeur, notamment :
Mise en œuvre
Le code C suivant fournit une méthode indépendante de la plate-forme pour détecter les processeurs physiques et les cœurs, en tenant compte de l'hyper-threading :
<code class="cpp">#include <iostream> #include <stdint.h> using namespace std; // Execute CPUID instruction void cpuID(uint32_t functionCode, uint32_t* registers) { #ifdef _WIN32 __cpuid((int*)registers, (int)functionCode); #else asm volatile( "cpuid" : "=a" (registers[0]), "=b" (registers[1]), "=c" (registers[2]), "=d" (registers[3]) : "a" (functionCode), "c" (0) ); #endif } int main() { uint32_t registers[4]; uint32_t logicalCoreCount, physicalCoreCount; // Get vendor cpuID(0, registers); string vendor = (char*)(®isters[1]); // Get CPU features cpuID(1, registers); uint32_t cpuFeatures = registers[3]; // Get logical core count cpuID(1, registers); logicalCoreCount = (registers[1] >> 16) & 0xff; cout << "Logical cores: " << logicalCoreCount << endl; // Get physical core count physicalCoreCount = logicalCoreCount; if (vendor == "GenuineIntel") { // Intel cpuID(4, registers); physicalCoreCount = ((registers[0] >> 26) & 0x3f) + 1; } else if (vendor == "AuthenticAMD") { // AMD cpuID(0x80000008, registers); physicalCoreCount = ((unsigned)(registers[2] & 0xff)) + 1; } cout << "Physical cores: " << physicalCoreCount << endl; // Check hyper-threading bool hyperThreads = cpuFeatures & (1 << 28) && (physicalCoreCount < logicalCoreCount); cout << "Hyper-threads: " << (hyperThreads ? "true" : "false") << endl; return 0; }</code>
Résultats
Quand exécuté sur différents processeurs Intel et AMD, ce code fournira un résultat similaire à celui-ci :
Intel Core i5-7200U (2 cœurs physiques, 4 cœurs logiques) :
Logical cores: 4 Physical cores: 2 Hyper-threads: true
AMD Ryzen 7 1700X (8 cœurs physiques, 16 cœurs logiques) :
Logical cores: 16 Physical cores: 8 Hyper-threads: true
Conclusion
En implémentant cette détection Grâce à cette méthode, les développeurs peuvent aligner avec précision le nombre de threads dans leurs applications multithread avec les processeurs physiques et les cœurs disponibles, optimisant ainsi les performances sur les systèmes Windows, Mac et Linux. Cela garantit une utilisation efficace des ressources matérielles sous-jacentes, conduisant à des performances améliorées et à des temps d'exécution réduits.
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!