Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Mary-Kate Olsenasal
2024-11-01 04:28:02508semak imbas

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>

Contoh Output

Apabila dijalankan pada sistem Intel yang berbeza, program mengeluarkan:

  • Core 2 Duo T7500:

    logical cpus: 2
      cpu cores: 2
    hyper-threads: false
  • Teras 2 Quad Q8400:

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

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

    logical cpus: 2
      cpu cores: 1
    hyper-threads: true

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!

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