首頁 >後端開發 >C++ >如何在考慮超線程配置的情況下準確地確定實體處理器和核心的數量?

如何在考慮超線程配置的情況下準確地確定實體處理器和核心的數量?

Patricia Arquette
Patricia Arquette原創
2024-10-29 04:58:29688瀏覽

How can I accurately determine the number of physical processors and cores, taking into account hyper-threading configurations?

考慮超執行緒確定實體處理器和核心數量

偵測實體處理器和核心的數量對於最佳化多執行緒至關重要應用程式高效運作。要準確地確定這些計數,請考慮可能啟用的超線程依賴項。

逐步流程:

  1. 辨識CPU 供應商:執行CPUID指令(函數0)來辨識CPU供應商,「 GenuineIntel”或“AuthenticAMD”。
  2. 檢查超線程支援(Intel):檢查CPU的功能來自 CPUID 函數 1 的暫存器 (EDX)。如果設定了位元 28(EDX 位元 28 = 1),則超執行緒支援處於活動狀態。
  3. 確定邏輯核心計數: 取得邏輯核心來自 CPUID 函數 1 結果的 EBX[23:16] 的每個實體核心計數。
  4. 區分物理核心計數:

    • 如果供應商如果是Intel,則物理核心數為1 加上CPUID 函數4 中的EAX [31:26]。
    • 如果供應商是AMD,則實體核心數為1 加上CPUID 函數0x80000008 中的ECX[7:0] .

<code class="c++">#include <iostream>
#include <string>

void cpuID(unsigned i, unsigned regs[4]);

int main() {
  unsigned regs[4];
  char vendor[12];

  // Get vendor
  cpuID(0, regs);
  ((unsigned *)vendor)[0] = regs[1];
  ((unsigned *)vendor)[1] = regs[3];
  ((unsigned *)vendor)[2] = regs[2];
  string cpuVendor = string(vendor, 12);

  // Get CPU features
  cpuID(1, regs);
  unsigned cpuFeatures = regs[3];

  // Logical core count per CPU
  cpuID(1, regs);
  unsigned logical = (regs[1] >> 16) & 0xff;
  cout << " logical cpus: " << logical << endl;
  unsigned cores = logical;

  if (cpuVendor == "GenuineIntel") {
    // Get DCP cache info
    cpuID(4, regs);
    cores = ((regs[0] >> 26) & 0x3f) + 1;
  } else if (cpuVendor == "AuthenticAMD") {
    // Get NC: Number of CPU cores - 1
    cpuID(0x80000008, regs);
    cores = ((unsigned)(regs[2] & 0xff)) + 1;
  }

  cout << "    cpu cores: " << cores << endl;

  // Detect hyper-threads
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;
  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}</code>

C 實作:以下C 程式舉例說明了這些步驟:透過堅持透過這些步驟並利用提供的C 程序,開發人員可以準確地確定實體處理器和核心的數量,同時考慮不同平台上超線程配置的細微差別。

以上是如何在考慮超線程配置的情況下準確地確定實體處理器和核心的數量?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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