"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como determinar se o Hyper-Threading está habilitado no Windows, Mac e Linux?

Como determinar se o Hyper-Threading está habilitado no Windows, Mac e Linux?

Publicado em 23/11/2024
Navegar:497

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

Detectando a existência de Hyper-Threading habilitado

Em aplicativos multithread, a utilização de um thread por núcleo do processador físico garante desempenho ideal. Para uma determinação precisa da contagem de threads, é essencial distinguir entre núcleos físicos e hyper-threading. Veja como detectar o suporte a hyper-threading e seu status de ativação no Windows, Mac e Linux:

Instrução CPUID

Utilizando a instrução CPUID, podemos coletar informações sobre os recursos e configuração do processador. Um processo passo a passo é descrito abaixo:

  1. Detecção de fornecedor: execute a função CPUID 0 para identificar o fornecedor da CPU (por exemplo, Intel ou AMD).
  2. Hyper-Threading Bit Check: Execute a função CPUID 1 e verifique o bit 28 no registro EDX. Este bit indica suporte a hyper-threading.
  3. Contagem de núcleos lógicos: recupera o número de núcleos lógicos por CPU dos bits [23:16] de EBX na função CPUID 1.
  4. Contagem de núcleos físicos:

    • Intel CPUs: Se o fornecedor for 'GenuineIntel', use a função CPUID 4 para obter o número de núcleos físicos mais um extraindo bits [31:26] do registro EAX.
    • CPUs AMD: Se o fornecedor for 'AuthenticAMD', execute a função CPUID 0x80000008 e obtenha o número de núcleos físicos mais um usando bits [7:0] do registro ECX.

Implementação

Aqui está um programa C que implementa este método:

#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 

Exemplos de saída:

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

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

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

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

AMD Ryzen 5 2600X (com SMT):

 Logical cores: 12
    Cores: 6
hyper-threads: true
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3