2009-10-29 26 views
5

Tengo un problema con mi código basado en CPUID en las máquinas más nuevas basadas en i7. Está detectando que la CPU tiene un único núcleo con 8 unidades HT en lugar de 4 núcleos cada uno con 2 unidades HT.CPUID en procesadores Intel i7

Debo estar malinterpretando los resultados de la información del CPUID que regresa de la CPU, pero no puedo ver cómo.

Básicamente, repito a través de cada procesador visible para Windows, establezco la afinidad de la hebra a esa hebra y luego hago una secuencia de llamadas a la CPUID.

args = new CPUID_Args(); 
args.eax = 1; 
executeHandler(ref args); 
if (0 != (args.edx & (0x1 << 28))) 
{ 
    //If the 28th bit in EDX is flagged, this processor supports multiple logical processors per physical package 
    // in this case bits 23:16 of EBX should give the count. 
//** EBX here is 0x2100800 
    logicalProcessorCount = (args.ebx & 0x00FF0000) >> 16; 
//** this tells me there are 16 logical processors (wrong) 
} 
else 
{ logicalProcessorCount = 1; } 
apic = unchecked((byte)((0xFF000000 & args.ebx) >> 24)); 

if (maximumSupportedCPUID >= 4) 
{ 
    args = new CPUID_Args(); 
    args.eax = 4; 
    executeHandler(ref args); 
//EAX now contains 0x1C004121 
    coreCount = 1 + ((args.eax & 0xFC000000) >> 26); 
//This calculates coreCount as 8 
} 
else 
{ coreCount = 1; } 

Esta secuencia se repite para el resto de las CPU en el sistema.

¿Alguien ha enfrentado esto antes?

+0

Hola StarPacker, aunque me temo que no podré ayudarte con este problema específico, tengo una pregunta relacionada: http://stackoverflow.com/questions/1666093/cpuid-implementations-in-c Me preguntaba si podría establecerme en la ruta correcta con algún código de ejemplo o algo ... Realmente me gustaría tener compatibilidad con X86/X64 para CPUID en mi aplicación para obtener información/funciones del procesador en informes de fallas para una aplicación que estoy desarrollando y que será utilizada por otros investigadores (ho ejecutaré mi código en máquinas a las que no podré acceder directamente). Cheers, Kris – Kris

Respuesta

5

Pregunta interesante: desafortunadamente no tengo un i7 para jugar, así que solo puedo adivinarlo aquí.

Puede ser útil echar un vistazo a this article - aunque en principio su enfoque parece correcto, establecen algunas advertencias. Tal vez leer y ver si en algún momento cualquiera de sus suposiciones puede ser incorrecta. Básicamente utilizan CPUID.1.EBX [23:16] (max # procesadores de registro en un paquete físico), CPUID.4.EAX [31:26] +1 (número máximo de núcleos en un paquete físico) y CPUID.4 .EAX [25:14] +1 (número máximo de procesadores de registro en un paquete físico que comparte el caché de nivel objetivo) para inferir la topología del procesador, que es similar a lo que está haciendo.

En segundo lugar, como alternativa, en una CPU que admita la función CPUID EAX = 0Bh (consulte Intel's docs here), puede utilizar esta función para obtener las especificaciones que desee. Tal vez la comparación de los resultados de los dos enfoques puede ser esclarecedor?

- Editar - This es un artículo muy útil que cubre los dos enfoques anteriores. Esencialmente, deduzco que en un i7, CPUID.0B es la variante preferida.

+0

Gracias por esta respuesta. Lástima que no fue aceptado, ya que responde a esta pregunta a la perfección. – ttvd

+0

Tengo este mismo problema en un i5-560m, donde CPUID.1.EBX [23:16] informa 16 procesadores lógicos en lugar de 4. No tengo idea de por qué está devolviendo un resultado incorrecto. Mientras que el primer artículo relacionado con PhiS puede contener la respuesta, se ha eliminado. Los otros enlaces realmente no proporcionan una respuesta. Incluso si funciona un método alternativo, todavía no parece haber ninguna razón o razón para que el primero no lo haga. : -/ –

+0

Ah - el segundo artículo de hecho dice por qué CPUID.1.EBX [23:16] no funciona: Al contrario de lo que implica el AP-485, en realidad no devuelve el número real de procesadores lógicos: "CPUID.1: EBX [23:16] representa el número máximo de identificadores direccionables (ID APIC inicial) que se pueden asignar a procesadores lógicos en un paquete físico. El valor puede no ser el mismo que el número de procesadores lógicos que están presentes en el hardware de un paquete físico ". Argh, lo más simple está enterrado tan profundamente ... como si los desarrolladores de aplicaciones se preocupen más por el número máximo teórico que por el número real de subprocesos. –

Cuestiones relacionadas