.net - usar - Detectando la cantidad de procesadores
usar todos los procesadores (8)
¿Cómo se detecta la cantidad de procesadores / núcleos físicos en .net?
Environment.ProcessorCount
EDITAR: disponible en .NET 2.0, no en .NET 1.1
Environment.ProcessorCount también incluirá cualquier procesador hyperthreaded.
No hay forma (al menos hasta Windows 2003) para distinguir un procesador de hyperthreaded de uno con dos núcleos.
Esto realmente varía bastante dependiendo de la plataforma objetivo. La respuesta de Stephbu funcionará muy bien en XP SP3 y más reciente.
Si se dirige a plataformas más antiguas, le recomendamos que consulte 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 de proyecto de código si está interesado en diferenciar los núcleos de sombra de hyperthreading de los reales.
System.Environment.ProcessorCount es lo que necesita
No tiene suficientes representantes 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:
Si bien Environment.ProcessorCount
realmente le proporcionará la cantidad de procesadores virtuales en el sistema, esa puede no ser la cantidad de procesadores disponibles para su proceso. Arreglé 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;
}
}
}
Puede usar PowerShell para acceder a la información completa del procesador. Por ejemplo, puede ejecutar el siguiente comando para obtener la cantidad 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 sugerir el uso de la herramienta de navegación WMI (por ejemplo, WMIExplorer o WMI CIM Studio ) para explorar clases, propiedades y métodos de WMI.
System.Environment.ProcessorCount
devuelve la cantidad de procesadores lógicos
http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx
Para el recuento físico del procesador probablemente necesite usar WMI: los siguientes metadatos son compatibles con XP / Win2k3 en adelante (Funcionalidad habilitada en SP antes de Vista / Win2k8).
Win32_ComputerSystem.NumberOfProcessors devuelve el recuento físico
Win32_ComputerSystem.NumberOfLogicalProcessors devuelve lógica (duh!)
Tenga cuidado de que las CPU HyperThreaded sean idénticas a las CPU multinúcleo, pero las características de rendimiento son muy diferentes.
Para comprobar las CPU habilitadas para HT, examine cada instancia de Win32_Processor y compare estas dos propiedades.
Win32_Processor.NumberOfLogicalProcessors
Win32_Processor.NumberOfCores
En sistemas multinúcleo, estos son generalmente el mismo valor.
Además, tenga en cuenta los sistemas que pueden tener múltiples grupos de procesadores , lo que a menudo se ve en computadoras con una gran cantidad de procesadores. De manera predeterminada, .Net solo usará el primer grupo de procesadores , lo que significa que, de manera 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. Según la respuesta de Alastair Maw , este comportamiento se puede modificar alterando el archivo app.config de la siguiente manera:
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>