"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo determinar si Hyper-Threading está habilitado en Windows, Mac y Linux?

¿Cómo determinar si Hyper-Threading está habilitado en Windows, Mac y Linux?

Publicado el 2024-11-23
Navegar:919

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

Detección de la existencia de Hyper-Threading habilitado

En aplicaciones de subprocesos múltiples, la utilización de un subproceso por núcleo de procesador físico garantiza un rendimiento óptimo. Para una determinación precisa del número de subprocesos, es esencial distinguir entre núcleos físicos y de hiperprocesamiento. A continuación se explica cómo detectar la compatibilidad con Hyper-Threading y su estado de activación en Windows, Mac y Linux:

Instrucción CPUID

Utilizando la instrucción CPUID, podemos recopilar información sobre las capacidades y la configuración del procesador. A continuación se describe un proceso paso a paso:

  1. Detección de proveedor: Ejecute la función CPUID 0 para identificar el proveedor de la CPU (por ejemplo, Intel o AMD).
  2. Verificación de bits de Hyper-Threading: Ejecute la función CPUID 1 y verifique el bit 28 en el registro EDX. Este bit indica compatibilidad con hyper-threading.
  3. Recuento de núcleos lógicos: recupera el número de núcleos lógicos por CPU de los bits [23:16] de EBX en la función CPUID 1.
  4. Recuento de núcleos físicos:

    • Intel CPU: si el proveedor es 'GenuineIntel', utilice la función CPUID 4 para obtener el número de núcleos físicos más uno extrayendo bits [31:26] del registro EAX.
    • CPU AMD: Si el proveedor es 'AuthenticAMD', ejecute la función CPUID 0x80000008 y obtenga el número de núcleos físicos más uno tomando bits [7:0] del registro ECX.

Implementación

Aquí hay un programa en 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 

Ejemplos de salida:

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

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

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

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

AMD Ryzen 5 2600X (con SMT):

 Logical cores: 12
    Cores: 6
hyper-threads: true
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3