Detección del número de procesadores


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

Author: stephbu, 2008-10-09

8 answers

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 recuento físico

Win32_ComputerSystem.NumberOfLogicalProcessors devuelve logical (duh!)

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

Para comprobar si hay CPU habilitadas para HT, examine cada instancia de Win32_Processor y compare estas dos propiedades.

Win32_Processor.Número de procesadores lógicos

Win32_Processor.Número de núcleos

En sistemas multinúcleo estos son típicamente el mismo valor.

También, tenga en cuenta los sistemas que pueden tener múltiples Grupos de procesadores, que a menudo se ve en computadoras con un gran número de procesadores. De forma predeterminada . Net solo utilizará el primer grupo de procesadores - lo que significa que, de forma predeterminada, los subprocesos utilizarán solo CPU del primer grupo de procesadores, y Environment.ProcessorCount devolverá solo el número de CPU en este grupo. De acuerdo con La respuesta de Alastair Maw, este comportamiento se puede cambiar alterando la aplicación.config como sigue:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>
 28
Author: stephbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:01:23

Mientras que Environment.ProcessorCount le dará el número de procesadores virtuales en el sistema, puede que no sea el número de procesadores disponibles para su proceso. Preparé una pequeña clase/propiedad estática 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;
        }
    }
}
 10
Author: Jesse C. Slicer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-28 14:04:25

Entorno.ProcessorCount también incluirá cualquier procesador hyperthreaded.

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

 3
Author: Rob Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 18:26:21

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 se dirige a plataformas más antiguas, es posible que desee revisar este artículo. Lo escribí hace aproximadamente medio año y en él discuto varias maneras diferentes de hacer esto, así como los pros y los contras individuales de cada método.

Es posible que también desee revisar este artículo de code project si está interesado en diferenciar shadow núcleos de hyperthreading de los reales.

 3
Author: Rick Minerich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 20:19:01

Sistema.Ambiente.ProcessorCount es lo que necesita

 2
Author: Tsvetomir Tsonev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 18:20:15

Entorno.ProcessorCount

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

 2
Author: liggett78,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 18:20:53

No tiene suficiente rep para el 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

 1
Author: aristippus303,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-11 13:06:05

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 explorador. Por lo tanto, puedo sugerir el uso de la herramienta de navegación de WMI (por ejemplo, WMIExplorer o WMI CIM Studio) para explorar las clases, propiedades y métodos de WMI.

 1
Author: bahrep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-22 04:54:46