Pergunta

Como você detectar o número de processadores físicos / núcleos em .net?

Foi útil?

Solução

System.Environment.ProcessorCount

retorna o número de processadores lógicos

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

Para contar você provavelmente precisará usar WMI processador físico -. Os seguintes metadados é suportado no XP / Win2k3 para cima (Funcionalidade habilitado de SP antes da Vista / Win2k8)

Win32_ComputerSystem.NumberOfProcessors retornos física count

Win32_ComputerSystem.NumberOfLogicalProcessors retornos lógica (duh!)

Seja cauteloso que HyperThreaded CPUs parecem idênticos para multicore'd CPU ainda as características de desempenho são muito diferente.

Para verificar se há CPUs HT habilitado para examinar cada instância de Win32_Processor e comparar essas duas propriedades.

Win32_Processor.NumberOfLogicalProcessors

Win32_Processor.NumberOfCores

Em multicore sistemas estes são normalmente o mesmo valor.

Além disso, estar ciente de sistemas que podem ter múltiplas Grupos processador , que é muitas vezes visto em computadores com um grande número de processadores. Por padrão .Net só irá usando a primeira grupo de processador - o que significa que, por padrão, threads irá utilizar apenas CPUs do primeiro grupo de processador e Environment.ProcessorCount retornará apenas o número de CPUs neste grupo. De acordo com a Alastair Maw resposta , este comportamento pode ser alterado alterando o app.config da seguinte forma:

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

Outras dicas

Enquanto Environment.ProcessorCount vai realmente obter-lhe o número de processadores virtuais no sistema, que pode não ser o número de processadores disponíveis para o seu processo. Eu chicoteado até um rápido pouco de classe static / propriedade para obter exatamente isso:

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 também incluirá quaisquer processadores hyperthreaded.

Não há nenhuma maneira (pelo menos até meio do Windows 2003) para distinguir um processador hyperthreaded de um com dois núcleos.

Este realmente varia um pouco dependendo da plataforma de destino. A resposta de Stephbu vai funcionar muito bem em XP SP3 e mais recentes.

Se você está direcionando plataformas mais antigas, você pode querer verificar este artigo . Escrevi-o cerca de meio ano atrás e nele eu discuto várias maneiras diferentes de fazer isso, assim como os profissionais individuais e contras de cada método.

Você também pode querer verificar para fora este projecto código do artigo se está interessado em diferenciar núcleos sombra de hyperthreading de reais.

System.Environment.ProcessorCount é o que você precisa

Environment.ProcessorCount

EDIT: disponível em .NET 2.0, não em .NET 1.1

não tem rep suficiente para o wiki, mas nota que, além de XPSP2, Windows 2003 Server SP1 e SP2 também precisa de um hotfix para habilitar essa funcionalidade:

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

Você pode usar o PowerShell para acessar informações abrangentes processador. Por exemplo, você pode executar o seguinte comando para obter o número de núcleos de CPU:

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

É muito mais fácil para pesquisar WMI ao usar algum tipo de ferramenta de explorador. Então, eu posso sugerir o uso de ferramenta de navegação WMI (por exemplo WMIExplorer ou WMI CIM Studio) para explorar WMI classes, propriedades e métodos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top