Mengesan Pemproses Fizikal dan Teras dengan Sokongan Hyper-Threading
Pengenalan
Dalam pelbagai- aplikasi berulir, adalah penting untuk mengoptimumkan prestasi dengan menjajarkan bilangan utas kepada pemproses atau teras fizikal yang tersedia. Untuk mencapai matlamat ini, adalah penting untuk membezakan antara teras fizikal dan maya, terutamanya apabila hyper-threading terlibat. Artikel ini menjawab soalan: Bagaimanakah kita boleh mengesan bilangan pemproses fizikal dan teras dengan tepat, dengan mengambil kira potensi kehadiran hyper-threading?
Memahami Hyper-Threading
Hyper-threading ialah teknologi yang mencipta teras maya dalam teras fizikal. Ini membolehkan satu teras fizikal mengendalikan berbilang benang, dengan berkesan meningkatkan kiraan keseluruhan benang. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa teras fizikal secara amnya menawarkan prestasi yang lebih baik berbanding dengan teras maya.
Kaedah Pengesanan
Untuk mengesan bilangan pemproses fizikal dan teras dengan tepat, kami boleh menggunakan arahan CPUID (tersedia pada pemproses x86 dan x64). Arahan ini menyediakan maklumat khusus vendor tentang pemproses, termasuk:
Pelaksanaan
Kod C berikut menyediakan kaedah bebas platform untuk mengesan pemproses dan teras fizikal, mempertimbangkan 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>
Keputusan
Apabila dilaksanakan pada pemproses Intel dan AMD yang berbeza, kod ini akan memberikan output yang serupa dengan yang berikut:
Intel Core i5-7200U (2 teras fizikal, 4 teras logik):
Logical cores: 4 Physical cores: 2 Hyper-threads: true
AMD Ryzen 7 1700X (8 teras fizikal, 16 teras logik):
Logical cores: 16 Physical cores: 8 Hyper-threads: true
Kesimpulan
Dengan melaksanakan pengesanan ini kaedah, pembangun boleh menjajarkan dengan tepat bilangan utas dalam aplikasi berbilang benang mereka dengan pemproses dan teras fizikal yang tersedia, mengoptimumkan prestasi pada kedua-dua sistem Windows, Mac dan Linux. Ini memastikan penggunaan cekap sumber perkakasan asas, yang membawa kepada prestasi yang lebih baik dan mengurangkan masa pelaksanaan.
Atas ialah kandungan terperinci Bagaimana untuk Mengesan Pemproses dan Teras Fizikal dengan Tepat dengan Sokongan Hyper-Threading?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!