首頁 >後端開發 >C++ >如何確定Windows、Mac和Linux上是否啟用了超執行緒?

如何確定Windows、Mac和Linux上是否啟用了超執行緒?

Linda Hamilton
Linda Hamilton原創
2024-10-30 12:38:26200瀏覽

How to Determine if Hyper-Threading is Enabled on Windows, Mac, and Linux?

偵測是否存在已啟用的超執行緒

在多執行緒應用程式中,每個實體處理器核心使用一個執行緒可確保最佳效能。為了精確確定線程數,區分物理核心和超線程核心至關重要。以下是如何在 Windows、Mac 和 Linux 上偵測超執行緒支援及其啟動狀態:

CPUID 指令

利用 CPUID 指令,我們可以收集有關處理器功能和配置的資訊。逐步流程概述如下:

  1. 供應商偵測:執行 CPUID 函數 0 來辨識 CPU 供應商(例如 Intel 或 AMD)。
  2. 超線程位元檢查:執行CPUID功能1並檢查EDX暫存器中的位元28。該位指示超線程支援。
  3. 邏輯核心計數:從 CPUID 函數 1 中 EBX 的位元 [23:16] 擷取每個 CPU 的邏輯核心數。
  4. 物理核心數:

    • Intel CPU:如果供應商是“GenuineIntel”,則使用CPUID 函數4取得物理核心數透過提取EAX 暫存器的位元[31:26] 將核心數加一。
    • AMD CPU:如果供應商是“AuthenticAMD”,則執行 CPUID 函數 0x80000008 並得出物理內核數加通過獲取 ECX 寄存器的 [7:0] 位元來實現。

實現

這是一個實現此方法的C 程序:

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

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

int main() {
  unsigned regs[4];

  // Get CPUID information
  cpuID(0x00, regs);
  cpuID(0x01, regs);

  // Determine vendor
  char vendor[12];
  ((unsigned *)vendor)[0] = regs[1];
  ((unsigned *)vendor)[1] = regs[3];
  ((unsigned *)vendor)[2] = regs[2];
  std::string cpuVendor = std::string(vendor, 12);

  // Variables
  unsigned logicalCores = (regs[1] >> 16) & 0xff;
  unsigned cores = logicalCores;
  bool hyperThreads = false;

  // Detect hyper-threading
  if (cpuVendor == "GenuineIntel") {
    cpuID(0x04, regs);
    cores = ((regs[0] >> 26) & 0x3f) + 1;
  } else if (cpuVendor == "AuthenticAMD") {
    cpuID(0x80000008, regs);
    cores = ((unsigned)(regs[2] & 0xff)) + 1;
  }

  if (regs[3] & (1 << 28) && cores < logicalCores) {
    hyperThreads = true;
  }

  // Print results
  std::cout << "Logical cores: " << logicalCores << std::endl;
  std::cout << "Cores: " << cores << std::endl;
  std::cout << "Hyper-threading: " << (hyperThreads ? "true" : "false") << std::endl;

  return 0;
}</code>

輸出示例:

Intel Core 2 Duo E8400(無超線程):

Logical cores: 2
Cores: 2
Hyper-threading: false

Intel Core i7-7700K(有超線程):

 Logical cores: 8
    Cores: 4
hyper-threads: true

AMD Ryzen 5 2600X(帶SMT):

 Logical cores: 12
    Cores: 6
hyper-threads: true

以上是如何確定Windows、Mac和Linux上是否啟用了超執行緒?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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