«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как определить, включена ли Hyper-Threading в Windows, Mac и Linux?

Как определить, включена ли Hyper-Threading в Windows, Mac и Linux?

Опубликовано 23 ноября 2024 г.
Просматривать:887

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

Обнаружение наличия включенной гиперпоточности

В многопоточных приложениях использование одного потока на каждое физическое ядро ​​процессора обеспечивает оптимальную производительность. Для точного определения количества потоков важно различать физические ядра и ядра с гиперпоточностью. Вот как определить поддержку Hyper-Threading и статус ее активации в Windows, Mac и Linux:

Инструкция CPUID

Используя инструкцию CPUID, мы можем собрать информацию о возможностях и конфигурации процессора. Пошаговый процесс описан ниже:

  1. Определение поставщика: выполните функцию CPUID 0, чтобы идентифицировать поставщика ЦП (например, Intel или AMD).
  2. Проверка бита гиперпоточности: выполните функцию CPUID 1 и проверьте бит 28 в регистре EDX. Этот бит указывает на поддержку гиперпоточности.
  3. Количество логических ядер: извлекает количество логических ядер на процессор из битов [23:16] EBX в функции CPUID 1.
  4. Физическое ядро Count:

    • ЦП Intel: если поставщиком является «GenuineIntel», используйте функцию CPUID 4, чтобы получить количество физических ядер плюс одно путем извлечения битов [31:26 ] регистра EAX.
    • ЦП AMD: если поставщик «AuthenticAMD» выполняет функцию CPUID 0x80000008 и получает количество физических ядер плюс одно, взяв биты [7:0] регистра ECX.

Реализация

Вот программа на C, которая реализует это метод:

#include 
#include 

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 

Примеры вывода:

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
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3