Определение количества процессоров
-
06-07-2019 - |
Вопрос
Как вы определяете количество физических процессоров / ядер в .net?
Решение
System.Environment.ProcessorCount
возвращает количество логических процессоров
http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx
Для подсчета количества физических процессоров вам, вероятно, потребуется использовать WMI - следующие метаданные поддерживаются в XP / Win2k3 и выше (функциональность включена в SP до Vista / Win2k8).
win32_компьютерная система.Количество процессоров возвращает физическое количество
Win32_ComputerSystem.Количество логических процессоров возвращает логический результат (ага!)
Будьте осторожны, поскольку гиперпоточные процессоры выглядят идентично многоядерным процессорам, но их характеристики производительности очень другой.
Чтобы проверить наличие процессоров с поддержкой HT, изучите каждый экземпляр Win32_Processor и сравните эти два свойства.
Win32_Processor.Количество логических процессоров
Win32_Processor.Количество ядер
В многоядерных системах они обычно имеют одинаковое значение.
Кроме того, имейте в виду системы, которые могут иметь несколько Группы процессоров, что часто наблюдается на компьютерах с большим количеством процессоров.По умолчанию .Net будет использовать только первую группу процессоров - что означает, что по умолчанию потоки будут использовать только процессоры из первой группы процессоров, и Environment.ProcessorCount
вернет только количество процессоров в этой группе.Согласно Ответ Аластера Моу, это поведение можно изменить, изменив app.config следующим образом:
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>
Другие советы
Хотя 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;
}
}
}
Environment.ProcessorCount также будет включать в себя любые многопоточные процессоры.
Невозможно (по крайней мере, до Windows 2003) отличить процессор с многопоточным процессором от процессора с двумя ядрами.
На самом деле это немного отличается в зависимости от целевой платформы. Ответ Stephbu будет отлично работать на XP SP3 и новее. Р>
Если вы ориентируетесь на старые платформы, вы можете проверить эта статья . Я написал это около полугода назад, и в нем я обсуждаю несколько различных способов сделать это, а также отдельные плюсы и минусы каждого метода.
Вы также можете зайти в эту статью проекта кода , если вы заинтересованы в том, чтобы отличить теневые ядра от гиперпоточности от реальных.
System.Environment.ProcessorCount - это то, что вам нужно
Окружающая среда.Количество процессов
Редактировать:доступно в .NET 2.0, а не в .NET 1.1
Недостаточно повторений для вики, но учтите, что в дополнение к XPSP2 для Windows 2003 Server SP1 и SP2 также требуется исправление, чтобы включить эту функцию:
Вы можете использовать PowerShell для доступа к полной информации о процессоре. Например, вы можете запустить следующую команду, чтобы получить количество ядер ЦП:
Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores
Исследовать WMI намного проще, если использовать какой-либо инструмент проводника. Поэтому я могу предложить использовать инструмент просмотра WMI (например, WMIExplorer или WMI CIM Studio ) для изучения классов, свойств и методов WMI. р>