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
Lepaskan: 2024-10-30 12:38:26
asal
202 orang telah melayarinya

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>
Salin selepas log masuk

Contoh Output:

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

Logical cores: 2
Cores: 2
Hyper-threading: false
Salin selepas log masuk

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

 Logical cores: 8
    Cores: 4
hyper-threads: true
Salin selepas log masuk

AMD Ryzen 5 2600X (dengan SMT):

 Logical cores: 12
    Cores: 6
hyper-threads: true
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan