首頁 >後端開發 >C++ >如何準確檢測具有超線程支援的實體處理器和核心?

如何準確檢測具有超線程支援的實體處理器和核心?

DDD
DDD原創
2024-11-01 08:17:30490瀏覽

How to Accurately Detect Physical Processors and Cores with Hyper-Threading Support?

偵測具有超執行緒支援的實體處理器和核心

簡介

簡介

在多-對於線程應用程序,透過將線程數量與可用的物理處理器或核心對齊來優化性能至關重要。為了實現這一目標,必須區分物理核心和虛擬核心,特別是在涉及超線程時。本文解決了以下問題:考慮到超線程的潛在存在,我們如何準確地檢測物理處理器和核心的數量?

了解超執行緒

超執行緒是一種在實體核心中建立虛擬核心的技術。這允許單一物理核心處理多個線程,從而有效地增加總線程數。但需要注意的是,與虛擬核心相比,實體核心通常具有更優越的效能。

偵測方法
  1. 為了準確偵測實體處理器和核心的數量,我們可以利用 CPUID 指令(在 x86 和 x64 處理器上可用)。此指令提供有關處理器的特定於供應商的信息,包括:
  2. CPU 供應商:這標識了處理器的製造商(例如 Intel、AMD)。
  3. CPU 功能:這包括指示超線程支援和其他功能的位元遮罩。
  4. 邏輯核心計數:這表示處理器中的核心總數處理器,包括虛擬核心。

實體核心計數:這表示處理器中的實體核心數量。

實作
<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*)(&registers[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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn