Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menentukan jika Hyper-Threading Didayakan pada Windows, Mac dan Linux?

Bagaimana untuk Menentukan jika Hyper-Threading Didayakan pada Windows, Mac dan Linux?

Linda Hamilton
Linda Hamiltonasal
2024-10-30 12:38:26209semak imbas

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

Mengesan Kewujudan Hyper-Threading Didayakan

Dalam aplikasi berbilang benang, menggunakan satu utas bagi setiap teras pemproses fizikal memastikan prestasi optimum. Untuk penentuan kiraan benang yang tepat, adalah penting untuk membezakan antara teras fizikal dan hyper-benang. Begini cara untuk mengesan sokongan hyper-threading dan status pengaktifannya pada Windows, Mac dan Linux:

Arahan CPUID

Menggunakan arahan CPUID, kami boleh mengumpulkan maklumat tentang keupayaan dan konfigurasi pemproses. Proses langkah demi langkah digariskan di bawah:

  1. Pengesanan Vendor: Laksanakan Fungsi CPUID 0 untuk mengenal pasti vendor CPU (cth., Intel atau AMD).
  2. Semakan Bit Hyper-Threading: Jalankan Fungsi CPUID 1 dan semak bit 28 dalam daftar EDX. Bit ini menunjukkan sokongan hyper-threading.
  3. Kiraan Teras Logik: Dapatkan semula bilangan teras logik bagi setiap CPU daripada bit [23:16] EBX dalam Fungsi CPUID 1.
  4. Kiraan Teras Fizikal:

    • CPU Intel: Jika vendor adalah 'GenuineIntel,' gunakan Fungsi CPUID 4 untuk mendapatkan bilangan fizikal teras tambah satu dengan mengekstrak bit [31:26] daftar EAX.
    • CPU AMD: Jika vendor ialah 'AuthenticAMD,' laksanakan Fungsi CPUID 0x80000008 dan dapatkan bilangan teras fizikal tambah satu dengan mengambil bit [7:0] daftar ECX.

Pelaksanaan

Berikut ialah program C yang melaksanakan kaedah ini:

<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>

Contoh Output:

Intel Core 2 Duo E8400 (tiada hyper-threading):

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

Intel Core i7-7700K (dengan hyper-threading):

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

AMD Ryzen 5 2600X (dengan SMT):

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

Atas ialah kandungan terperinci Bagaimana untuk Menentukan jika Hyper-Threading Didayakan pada Windows, Mac dan Linux?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn