Comment détectez-vous le nombre de processeurs / cœurs physiques dans .net?
Réponses
Trop de publicités?System.Environment.ProcessorCount
renvoie le nombre de processeurs logiques
http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx
Pour le physique, le nombre de processeurs que vous auriez probablement besoin d'utiliser WMI - les métadonnées suivantes sont prises en charge dans XP/Win2k3 vers le haut (les Fonctionnalités activées dans le PS avant Vista/Win2k8).
Win32_ComputerSystem.NumberOfProcessors retourne décompte physique
Win32_ComputerSystem.NumberOfLogicalProcessors retourne logique (duh!)
Être prudent que Hyperthread Processeurs semblent identiques à multicœur avais un CPU encore les caractéristiques de performance sont très différents.
Pour vérifier HT-enabled Cpu examiner chaque instance de Win32_Processor et de comparer ces deux propriétés.
Win32_Processor.NumberOfLogicalProcessors
Win32_Processor.NumberOfCores
Sur les systèmes multicœurs ces sont généralement de la même valeur.
Alors que Environment.ProcessorCount
permettront en effet d'obtenir le nombre de processeurs virtuels dans le système, ce n'est peut-être pas le nombre de processeurs disponibles pour votre processus. J'ai concocté une petite classe / propriété statique rapide pour obtenir exactement cela:
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;
}
}
}
En fait, cela varie un peu en fonction de la plate-forme cible. Stephbu la réponse sera grand travail sur XP SP3 et versions plus récentes.
Si vous ciblez les anciennes plates-formes, vous pouvez consultez cet article. Je l'ai écrit à propos de la moitié il y a un an et j'y discuter des différentes façons de faire ainsi que les avantages et les inconvénients de chaque méthode.
Vous pouvez également vouloir vérifier ce projet de code de l'article si vous êtes intéressé dans la différenciation de l'ombre cœurs de l'hyperthreading de vrais.