2010-04-04 16 views
6

Necesito una manera confiable de detectar cuántos núcleos de CPU hay en una computadora. Estoy creando una aplicación C# de simulación numéricamente intensa y quiero crear la cantidad máxima de hilos en ejecución como núcleos. He intentado muchos de los métodos sugeridos en Internet como Environment.ProcessorCount, usando WMI, este código: http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx Ninguno de ellos parece pensar que un AMD X2 tiene dos núcleos. ¿Algunas ideas?¿Hay alguna manera de detectar de manera confiable la cantidad total de núcleos de CPU?

Editar: parece que Environment.ProcessorCount está devolviendo el número correcto. Está en una CPU Intel con hyperthreading que está devolviendo el número incorrecto. Un núcleo signle con hyperthreading está devolviendo 2, cuando debería ser solo 1.

+0

Su enlace no funciona ... – ChristopheD

+0

¿Cuántos procesadores ve en Taskmgr.exe, pestaña Rendimiento? –

+0

El enlace estaba funcionando el otro día. –

Respuesta

6

Por lo que puedo decir, Environment.ProcessorCount puede devolver un valor incorrecto cuando se ejecuta en WOW64 (como un proceso de 32 bits en un sistema operativo de 64 bits) porque la firma P/Invoke en la que se basa utiliza GetSystemInfo en lugar de GetNativeSystemInfo. Esto parece un problema evidente, por lo que no estoy seguro de por qué no se habría resuelto en este punto.

probar esto y ver si se resuelve el problema:

private static class NativeMethods 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    internal struct SYSTEM_INFO 
    { 
     public ushort wProcessorArchitecture; 
     public ushort wReserved; 
     public uint dwPageSize; 
     public IntPtr lpMinimumApplicationAddress; 
     public IntPtr lpMaximumApplicationAddress; 
     public UIntPtr dwActiveProcessorMask; 
     public uint dwNumberOfProcessors; 
     public uint dwProcessorType; 
     public uint dwAllocationGranularity; 
     public ushort wProcessorLevel; 
     public ushort wProcessorRevision; 
    } 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo); 
} 

public static int ProcessorCount 
{ 
    get 
    { 
     NativeMethods.SYSTEM_INFO lpSystemInfo = new NativeMethods.SYSTEM_INFO(); 
     NativeMethods.GetNativeSystemInfo(ref lpSystemInfo); 
     return (int)lpSystemInfo.dwNumberOfProcessors; 
    } 
} 
-1

¿Ha comprobado la variable de entorno NUMBER_OF_PROCESSORS?

+0

Esto muestra 8 en mi i7, por lo que los núcleos hyperthreading se cuentan allí –

2

Obtiene el recuento de procesador correcto, AMD X2 es un verdadero procesador de varios núcleos. Un núcleo de Intel Hyperhreaded es tratado por Windows como una CPU de núcleo muti. Puede averiguar si hyperthreading se usa o no con WMI, Win32_Processor, NumberOfCores vs NumberOfLogicalProcessors.

Cuestiones relacionadas