Pregunta

¿Cómo se detecta la cantidad de procesadores / núcleos físicos en .net?

¿Fue útil?

Solución

System.Environment.ProcessorCount

devuelve el número de procesadores lógicos

  

http://msdn.microsoft.com/en -us / library / system.environment.processorcount.aspx

Para el conteo de procesadores físicos, probablemente necesite usar WMI: los siguientes metadatos son compatibles con XP / Win2k3 hacia arriba (Funcionalidad habilitada en SP antes de Vista / Win2k8).

  

Win32_ComputerSystem.NumberOfProcessors devuelve el conteo físico

     

Win32_ComputerSystem.NumberOfLogicalProcessors devuelve lógico (¡duh!)

Tenga cuidado de que las CPU HyperThreaded parezcan idénticas a las CPU multinúcleo, sin embargo, las características de rendimiento son muy diferentes.

Para verificar las CPU con HT habilitado, examine cada instancia de Win32_Processor y compare estas dos propiedades.

  

Win32_Processor.NumberOfLogicalProcessors

     

Win32_Processor.NumberOfCores

En los sistemas multinúcleo, estos suelen ser el mismo valor.

Además, tenga en cuenta los sistemas que pueden tener múltiples Grupos de procesadores , que a menudo se ven en computadoras con una gran cantidad de procesadores. Por defecto, .Net solo utilizando el primer grupo de procesadores , lo que significa que, de forma predeterminada, los subprocesos utilizarán solo las CPU del primer grupo de procesadores y Environment.ProcessorCount devolverá solo el número de CPU en este grupo. De acuerdo con Respuesta de Alastair Maw , este comportamiento se puede cambiar alterando la app.config de la siguiente manera:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

Otros consejos

Si bien Environment.ProcessorCount le proporcionará la cantidad de procesadores virtuales en el sistema, es posible que esa no sea la cantidad de procesadores disponibles para su proceso. Creé una pequeña clase / propiedad estática rápida para obtener exactamente eso:

using System;
using System.Diagnostics;

/// <summary>
/// Provides a single property which gets the number of processor threads
/// available to the currently executing process.
/// </summary>
internal static class ProcessInfo
{
    /// <summary>
    /// Gets the number of processors.
    /// </summary>
    /// <value>The number of processors.</value>
    internal static uint NumberOfProcessorThreads
    {
        get
        {
            uint processAffinityMask;

            using (var currentProcess = Process.GetCurrentProcess())
            {
                processAffinityMask = (uint)currentProcess.ProcessorAffinity;
            }

            const uint BitsPerByte = 8;
            var loop = BitsPerByte * sizeof(uint);
            uint result = 0;

            while (--loop > 0)
            {
                result += processAffinityMask & 1;
                processAffinityMask >>= 1;
            }

            return (result == 0) ? 1 : result;
        }
    }
}

Environment.ProcessorCount también incluirá todos los procesadores hiperprocesados.

No hay forma (al menos hasta Windows 2003) de distinguir un procesador hipertramado de uno con dos núcleos.

Esto en realidad varía bastante dependiendo de la plataforma de destino. La respuesta de Stephbu funcionará muy bien en XP SP3 y posteriores.

Si está apuntando a plataformas más antiguas, puede consultar este artículo . Lo escribí hace aproximadamente medio año y en él analizo varias formas diferentes de hacerlo, así como los pros y los contras individuales de cada método.

También puede consultar este artículo del proyecto de código si están interesados ??en diferenciar los núcleos de sombra del hyperthreading de los reales.

System.Environment.ProcessorCount es lo que necesita

Environment.ProcessorCount

EDITAR: disponible en .NET 2.0, no en .NET 1.1

No tengo suficiente representante para la wiki, pero tenga en cuenta que además de XPSP2, Windows 2003 Server SP1 y SP2 también necesitan una revisión para habilitar esta funcionalidad:

http://support.microsoft.com/kb/932370

Puede usar PowerShell para acceder a información completa del procesador. Por ejemplo, puede ejecutar el siguiente comando para obtener el número de núcleos de CPU:

Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores

Es mucho más fácil investigar WMI cuando se utiliza algún tipo de herramienta de exploración. Por lo tanto, puedo sugerirle que use la herramienta de navegación WMI (por ejemplo, WMIExplorer o WMI CIM Studio ) para explorar las clases, propiedades y métodos de WMI.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top