偵測具有超執行緒支援的實體處理器和核心
簡介
簡介在多-對於線程應用程序,透過將線程數量與可用的物理處理器或核心對齊來優化性能至關重要。為了實現這一目標,必須區分物理核心和虛擬核心,特別是在涉及超線程時。本文解決了以下問題:考慮到超線程的潛在存在,我們如何準確地檢測物理處理器和核心的數量?
了解超執行緒超執行緒是一種在實體核心中建立虛擬核心的技術。這允許單一物理核心處理多個線程,從而有效地增加總線程數。但需要注意的是,與虛擬核心相比,實體核心通常具有更優越的效能。
偵測方法實體核心計數:這表示處理器中的實體核心數量。
實作<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>
以下C 程式碼提供了一種獨立於平台的方法,用於偵測實體處理器和核心(考慮超執行緒):
結果何時在不同的Intel 和AMD 處理器上執行,此程式碼將提供類似於以下內容的輸出:
Logical cores: 4 Physical cores: 2 Hyper-threads: true
Intel Core i5-7200U(2 個實體內核,4 個邏輯內核):
Logical cores: 16 Physical cores: 8 Hyper-threads: true
AMD Ryzen 7 1700X(8 個物理核心,16 個邏輯核心):
結論透過實作此偵測透過此方法,開發人員可以精確地將多執行緒應用程式中的執行緒數與可用的實體處理器和核心相匹配,從而優化Windows、Mac 和Linux 系統上的效能。這確保了底層硬體資源的有效利用,從而提高效能並減少執行時間。以上是如何準確檢測具有超線程支援的實體處理器和核心?的詳細內容。更多資訊請關注PHP中文網其他相關文章!