首頁 > 後端開發 > C++ > 考慮到超線程的存在,如何準確地確定係統中物理核心的數量?

考慮到超線程的存在,如何準確地確定係統中物理核心的數量?

Linda Hamilton
發布: 2024-10-30 13:17:03
原創
348 人瀏覽過

How can I accurately determine the number of physical cores in my system, considering the presence of hyper-threading?

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

在旨在實現最高效率的多執行緒應用程式中,了解實體處理器或核心的數量至關重要。創建過多的執行緒會影響效能,尤其是在支援超執行緒的場景下。

超執行緒偵測

要準確決定實體處理器的數量,您需要偵測是否支援並啟用超執行緒。具體操作方法如下:

  1. 識別 CPU 供應商: 使用函數 0 執行 CPUID 指令來擷取 CPU 供應商(例如「GenuineIntel」或「AuthenticAMD」)。
  2. 檢查超線程(Intel):對於 Intel 處理器,從 CPUID 函數 1 檢查 EDX 中的位元 28。如果已設置,則支援超線程。
  3. 檢查超線程(AMD):對於AMD處理器,執行CPUID函數0x80000008以取得ECX[7:0]中的核心數。如果該數字大於零,則支援超線程。

確定實體核心數量

偵測到超執行緒支援後,請依照下列步驟操作確定實體核心數量:

  • 對於Intel 處理器,執行CPUID 函數4 並從EAX[31:26] 1 取得計數。
  • 對於 AMD 處理器,使用先前從 CPUID 函數 0x80000008 取得 ECX[7:0] 值並加 1。

範例實作

以下C 程式示範了超值的偵測執行緒與實體核心的數量:

<code class="cpp">#include <iostream>
#include <string>

using namespace std;

void cpuID(unsigned i, unsigned regs[4]) {
#ifdef _WIN32
  __cpuid((int *)regs, (int)i);
#else
  asm volatile
    ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
     : "a" (i), "c" (0));
#endif
}

int main(int argc, char *argv[]) {
  unsigned regs[4];

  // ... (Code for vendor detection, feature check, and logical core count)
  
  // Hyper-Threading detection
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;

  // ... (Code for physical core count based on vendor)

  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}</code>
登入後複製

結論

透過執行以下步驟,您可以在考慮超執行緒的同時準確偵測實體處理器/核心的數量- 執行緒支援。此資訊對於優化多執行緒應用程式的效能非常寶貴。

以上是考慮到超線程的存在,如何準確地確定係統中物理核心的數量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板