2010-05-25 18 views
6

Ya puedo detectar correctamente el número de procesadores lógicos en las tres plataformas.C/C++/Assembly Programar automáticamente si hyper-threading está activo en Windows, Mac y Linux

Para poder detectar correctamente el número de procesadores/núcleos físicos, tendré que detectar si se admite hyperthreading Y está activo (o habilitado si lo prefiere) y si es así, divida el número de procesadores lógicos por 2 para determinar el cantidad de procesadores físicos.

Perphaps I deberán proporcionar un ejemplo:

Un núcleo quad Intel de CPU con hyperthreading habilitado tiene 4 núcleos físicas, aun 8 procesadores lógicos (hyperthreading crea 4 procesadores más lógico). Entonces mi función actual detectaría 8 en lugar de la deseada 4.

Mi pregunta por lo tanto es si hay una manera de detectar si hyperthreading es compatible Y HABILITADO?

Respuesta

4

Linux:

Número de CPU física:

grep -i "physical id" /proc/cpuinfo | sort -u | wc -l 

Número de CPU lógicas:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l 
+0

Supongo que tendré que usar grep.cpp de la biblioteca de impulso en mi programa para usar esto. Mi pregunta era específica de c/C++/assemler como se indica en el asunto y las etiquetas – HTASSCPP

5

La instrucción CPUID (cuando se pasa 1H función en EAX) devuelve que hyper threading bandera característica en el bit 28 del registro EDX. Creo que los procesadores multi-core informan que están habilitados para hyperthreading aunque cada núcleo individual puede ejecutar solo un hilo.

También devuelve el número de procesadores lógicos por procesador físico en los bits 23-16 de EBX. Creo que tendrías que consultar cada procesador individualmente para poder acceder a todos los procesadores de tu sistema.

4

En Windows 2003 Server y Windows XP SP3 y posterior, puede determinar esta información mediante la llamada al sistema GetLogicalProcessorInformation.

+0

¿Funciona esto, digamos Windows 7 o Windows Server 2008 RC2? ¿O debería usar GetLogicalProcessorInformation? – HTASSCPP

+0

La página msdn dice del campo SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags "Si el valor de este miembro es 1, los procesadores lógicos identificados por el valor del miembro ProcessorMask comparten unidades funcionales, como Hyperthreading o SMT. De lo contrario, la lógica identificada los procesadores no comparten unidades funcionales ". Pero también dice que el valor es incorrecto antes de Windows Vista, y luego solo significa que los procesadores lógicos están en el mismo paquete físico. Hay más problemas: realmente no se especifica que la llamada agrupe los procesadores lógicos de una manera útil. –

3

En OS X:

#include <sys/sysctl.h> 

int physicalCores; 
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0); 

Ver el encabezado o página de manual para más información. (Tenga en cuenta que puede obtener el número de CPU lógica de la misma manera, utilizando la cadena "hw.logicalcpu")

+0

Funciona perfectamente en todas las máquinas en las que he probado esto, ¡gracias! – HTASSCPP

Cuestiones relacionadas