Определение количества процессоров - PullRequest
28 голосов
/ 09 октября 2008

Как определить количество физических процессоров / ядер в .net?

Ответы [ 8 ]

28 голосов
/ 09 октября 2008
System.Environment.ProcessorCount

возвращает количество логических процессоров

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

Для подсчета физических процессоров вам, вероятно, потребуется использовать WMI - следующие метаданные поддерживаются в XP / Win2k3 и более поздних версиях (функциональность включена в SP до Vista / Win2k8).

Win32_ComputerSystem.NumberOfProcessors возвращает физический счетчик

Win32_ComputerSystem.NumberOfLogicalProcessors возвращает логическое (дух!)

Будьте осторожны, так как HyperThreaded CPU кажутся идентичными многоядерным CPU, но характеристики производительности очень отличаются.

Чтобы проверить ЦП с поддержкой HT, изучите каждый экземпляр Win32_Processor и сравните эти два свойства.

Win32_Processor.NumberOfLogicalProcessors

Win32_Processor.NumberOfCores

В многоядерных системах это, как правило, одинаковое значение.

Также следует помнить о системах, которые могут иметь несколько групп процессоров , что часто наблюдается на компьютерах с большим числом процессоров. По умолчанию .Net будет использовать только первую группу процессоров - это означает, что по умолчанию потоки будут использовать только процессоры из первой группы процессоров, а Environment.ProcessorCount будет возвращать только количество процессоров в этой группе. Согласно ответу Аластера Мо , это поведение можно изменить, изменив app.config следующим образом:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>
10 голосов
/ 10 октября 2008

Хотя Environment.ProcessorCount действительно даст вам количество виртуальных процессоров в системе, это может быть не то количество процессоров, которое доступно вашему процессу. Я быстро выбрал небольшой статический класс / свойство, чтобы получить именно это:

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;
        }
    }
}
3 голосов
/ 10 октября 2008

На самом деле это немного отличается в зависимости от целевой платформы. Ответ Stephbu будет отлично работать на XP SP3 и новее.

Если вы ориентируетесь на старые платформы, вы можете проверить эту статью . Я написал это около полугода назад, и в нем я обсуждаю несколько различных способов сделать это, а также отдельные плюсы и минусы каждого метода.

Вы также можете проверить эту статью проекта кода , если вы заинтересованы в том, чтобы отличить теневые ядра от гиперпоточности от реальных.

3 голосов
/ 09 октября 2008

Environment.ProcessorCount также будет включать в себя любые многопоточные процессоры.

Нет способа (по крайней мере, до Windows 2003) отличить процессор с гиперпоточностью от одного с двумя ядрами.

2 голосов
/ 09 октября 2008

Environment.ProcessorCount

РЕДАКТИРОВАТЬ: доступно в .NET 2.0, а не в .NET 1.1

2 голосов
/ 09 октября 2008

System.Environment.ProcessorCount - это то, что вам нужно

1 голос
/ 20 ноября 2013

Вы можете использовать PowerShell для доступа к полной информации о процессоре. Например, вы можете запустить следующую команду, чтобы получить количество ядер ЦП:

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

Гораздо проще исследовать WMI при использовании какого-либо инструмента проводника. Поэтому я могу предложить использовать инструмент просмотра WMI (например, WMIExplorer или WMI CIM Studio ) для изучения классов, свойств и методов WMI.

1 голос
/ 11 августа 2009

Недостаточно повторений для вики, но обратите внимание, что в дополнение к XPSP2 для Windows 2003 Server SP1 и SP2 также требуется исправление, чтобы включить эту функцию:

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

...