Question

Comment détectez-vous le nombre de processeurs / cœurs physiques dans .net?

Était-ce utile?

La solution

System.Environment.ProcessorCount

renvoie le nombre de processeurs logiques

  

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

Pour le nombre de processeurs physiques, vous devrez probablement utiliser WMI - les métadonnées suivantes sont prises en charge à partir de XP / Win2k3 (fonctionnalité activée dans les SP antérieurs à Vista / Win2k8).

  

Win32_ComputerSystem.NumberOfProcessors renvoie le nombre physique

     

Win32_ComputerSystem.NumberOfLogicalProcessors renvoie une valeur logique (duh!)

Faites attention à ce que les CPU HyperThreaded soient identiques aux CPU multicœurs mais que les performances soient très différentes.

Pour vérifier les processeurs compatibles HT, examinez chaque instance de Win32_Processor et comparez ces deux propriétés.

  

Win32_Processor.NumberOfLogicalProcessors

     

Win32_Processor.NumberOfCores

Sur les systèmes multicœurs, leur valeur est généralement la même.

Sachez également que les systèmes peuvent comporter plusieurs groupes de processeurs , souvent utilisés sur des ordinateurs dotés d'un grand nombre de processeurs. Par défaut, .Net ne fera que utiliser le premier groupe de processeurs - ce qui signifie que par défaut, les threads n'utiliseront que les processeurs du premier groupe de processeurs, et Environment.ProcessorCount ne renverra que le nombre de processeurs de ce groupe. Selon La réponse d'Alastair Maw , ce comportement peut être modifié en modifiant le fichier app.config comme suit:

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

Autres conseils

Bien que Environment.ProcessorCount vous obtienne effectivement le nombre de processeurs virtuels dans le système, il peut ne pas s'agir du nombre de processeurs disponibles pour votre processus. J'ai préparé rapidement une petite classe / propriété statique 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;
        }
    }
}

Environment.ProcessorCount inclura également tous les processeurs hyperthreaded.

Il n’existe aucun moyen (du moins jusqu’à Windows 2003) de distinguer un processeur hyperthreaded d’un processeur à deux cœurs.

Cela varie beaucoup selon la plate-forme cible. La réponse de Stephbu fonctionnera parfaitement sous XP SP3 et plus récent.

Si vous ciblez d'anciennes plates-formes, vous pouvez vérifier cet article . Je l'ai écrit il y a environ un an et j'y expose différentes manières de le faire, ainsi que les avantages et les inconvénients de chaque méthode.

Vous pouvez également consulter cet article de projet de code si vous sont intéressés à différencier les noyaux d'ombres de l'hyperthreading des vrais.

System.Environment.ProcessorCount est ce dont vous avez besoin

Environment.ProcessorCount

EDIT: disponible dans .NET 2.0, pas dans .NET 1.1

Vous n'avez pas assez de représentants pour le wiki, mais notez qu'en plus de XPSP2, Windows 2003 Server SP1 et SP2 ont également besoin d'un correctif pour activer cette fonctionnalité:

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

Vous pouvez utiliser PowerShell pour accéder à des informations complètes sur le processeur. Par exemple, vous pouvez exécuter la commande suivante pour obtenir le nombre de cœurs de la CPU:

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

Il est beaucoup plus facile de rechercher WMI lorsque vous utilisez un outil d’exploration. Je peux donc suggérer d’utiliser un outil de navigation WMI (par exemple, WMIExplorer ou Studio CMI WMI ) pour explorer les classes, propriétés et méthodes WMI.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top