Domanda

Come si rileva il numero di processori / core fisici in .net?

È stato utile?

Soluzione

System.Environment.ProcessorCount

restituisce il numero di processori logici

  

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

Per il conteggio dei processori fisici probabilmente dovresti usare WMI: i seguenti metadati sono supportati da XP / Win2k3 in poi (Funzionalità abilitata in SP prima di Vista / Win2k8).

  

Win32_ComputerSystem.NumberOfProcessors restituisce il conteggio fisico

     

Win32_ComputerSystem.NumberOfLogicalProcessors restituisce la logica (duh!)

Fai attenzione che le CPU HyperThreaded appaiano identiche alle CPU multicore ma che le caratteristiche di prestazione sono molto diverse.

Per verificare la presenza di CPU abilitate HT, esaminare ogni istanza di Win32_Processor e confrontare queste due proprietà.

  

Win32_Processor.NumberOfLogicalProcessors

     

Win32_Processor.NumberOfCores

Su sistemi multicore, questi sono generalmente gli stessi del valore.

Inoltre, tieni presente i sistemi che possono avere più gruppi di processori , che spesso vengono visualizzati su computer con un numero elevato di processori. Per impostazione predefinita .Net sarà solo utilizzando il primo gruppo di processori - ciò significa che, per impostazione predefinita, i thread utilizzeranno solo le CPU del primo gruppo di processori e Environment.ProcessorCount restituirà solo il numero di CPU in questo gruppo. Secondo La risposta di Alastair Maw , questo comportamento può essere modificato modificando app.config come segue:

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

Altri suggerimenti

Mentre Environment.ProcessorCount ti consentirà di ottenere il numero di processori virtuali nel sistema, che potrebbe non essere il numero di processori disponibili per il tuo processo. Ho creato una piccola classe / proprietà statica per ottenere esattamente questo:

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 includerà anche tutti i processori hyperthreaded.

Non c'è modo (almeno fino a Windows 2003) di distinguere un processore hyperthreaded da uno con due core.

Questo in realtà varia un po 'a seconda della piattaforma di destinazione. La risposta di Stephbu funzionerà perfettamente su XP SP3 e versioni successive.

Se stai prendendo di mira piattaforme precedenti, potresti voler dare un'occhiata a questo articolo . L'ho scritto circa mezzo anno fa e in esso discuto diversi modi per farlo, nonché i singoli pro e contro di ciascun metodo.

Potresti anche dare un'occhiata a questo articolo di progetto di codice se tu sono interessati a differenziare i core d'ombra dall'hyperthreading da quelli reali.

System.Environment.ProcessorCount è ciò di cui hai bisogno

Environment.ProcessorCount

EDIT: disponibile in .NET 2.0, non in .NET 1.1

Non ho abbastanza rappresentante per il wiki, ma nota che oltre a XPSP2, Windows 2003 Server SP1 e SP2 necessitano anche di un aggiornamento rapido per abilitare questa funzionalità:

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

È possibile utilizzare PowerShell per accedere a informazioni complete sul processore. Ad esempio, è possibile eseguire il comando seguente per ottenere il numero di core della CPU:

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

È molto più semplice ricercare WMI quando si utilizza un qualche tipo di strumento di esplorazione. Quindi, posso suggerire di utilizzare lo strumento di navigazione WMI (ad es. WMIExplorer o WMI CIM Studio ) per esplorare classi, proprietà e metodi WMI.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top