Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menentukan Bilangan Sebenar Pemproses Fizikal atau Teras dalam Sistem?

Bagaimana untuk Menentukan Bilangan Sebenar Pemproses Fizikal atau Teras dalam Sistem?

Mary-Kate Olsen
Lepaskan: 2024-11-01 04:28:02
asal
583 orang telah melayarinya

How to Determine the Actual Number of Physical Processors or Cores in a System?

Menentukan Kiraan Pemproses/Teras Fizikal

Untuk prestasi optimum, aplikasi berbilang benang memerlukan kiraan pemproses atau teras fizikal yang tepat. Mengesan bilangan pemproses logik adalah tidak mencukupi, terutamanya mempertimbangkan hyperthreading, di mana berbilang utas logik berjalan pada satu teras fizikal.

Mengesan Sokongan dan Pengaktifan Hyperthreading

Untuk mengira dengan tepat pemproses fizikal, adalah penting untuk menentukan sama ada hyperthreading disokong dan didayakan. Ini memerlukan pemeriksaan bit 28 daftar EDX arahan CPUID. Jika bit ini ditetapkan, hyperthreading disokong. Walau bagaimanapun, hanya mengesahkan sokongan tidak mencukupi; bit juga mesti aktif.

Pelaksanaan menggunakan Arahan CPUID

Penyelesaian C komprehensif menggunakan arahan CPUID dibentangkan:

<code class="cpp">#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;
  unsigned cores = logical;

  // Determine core count based on vendor
  if (cpuVendor == "GenuineIntel") {
    cpuID(4, regs);
    cores = ((regs[0] >> 26) & 0x3f) + 1;
  } else if (cpuVendor == "AuthenticAMD") {
    cpuID(0x80000008, regs);
    cores = ((regs[2] & 0xff)) + 1;
  }

  // Detect hyper-threads
  bool hyperThreads = cpuFeatures & (1 << 28) && cores < logical;

  // Display results
  cout << " logical cpus: " << logical << endl;
  cout << "    cpu cores: " << cores << endl;
  cout << "hyper-threads: " << (hyperThreads ? "true" : "false") << endl;

  return 0;
}</code>
Salin selepas log masuk

Contoh Output

Apabila dijalankan pada sistem Intel yang berbeza, program mengeluarkan:

  • Core 2 Duo T7500:

    logical cpus: 2
      cpu cores: 2
    hyper-threads: false
    Salin selepas log masuk
  • Teras 2 Quad Q8400:

    logical cpus: 4
      cpu cores: 4
    hyper-threads: false
    Salin selepas log masuk
  • Xeon E5520 (pakej CPU dwi):

    logical cpus: 16
      cpu cores: 8
    hyper-threads: true
    Salin selepas log masuk
  • Pentium 4 3.00GHz:

    logical cpus: 2
      cpu cores: 1
    hyper-threads: true
    Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menentukan Bilangan Sebenar Pemproses Fizikal atau Teras dalam Sistem?. 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