27 votes

Détection du nombre de processeurs

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

27voto

stephbu Points 4440
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.

9voto

Jesse C. Slicer Points 11750

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;
        }
    }
}
 

3voto

Rob Walker Points 25840

Environment.ProcessorCount inclura également tous les processeurs hyperthreadés.

Il n'y a aucun moyen (au moins jusqu'à Windows 2003) de distinguer un processeur hyperthreadé d'un processeur à deux cœurs.

3voto

Rick Minerich Points 2407

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.

2voto

Tsvetomir Tsonev Points 42030

System.Environment.ProcessorCount est ce dont vous avez besoin

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X