Как вы определяете количество физических процессоров/ядер в .net?
Определение количества процессоров
Ответ 1
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 возвращает логический (duh!)
Будьте осторожны с тем, что процессоры HyperThreaded идентичны многоядерному процессору, но характеристики производительности очень разные.
Для проверки процессоров с поддержкой HT рассмотрите каждый экземпляр Win32_Processor и сравните эти два свойства.
Win32_Processor.NumberOfLogicalProcessors
Win32_Processor.NumberOfCores
В многоядерных системах это, как правило, одинаковое значение.
Кроме того, имейте в виду системы, которые могут иметь несколько групп процессоров, что часто наблюдается на компьютерах с большим количеством процессоров. По умолчанию .Net будет использовать только первую группу процессоров - это означает, что по умолчанию потоки будут использовать только процессоры из первой группы процессоров, а Environment.ProcessorCount
будет возвращаться только количество процессоров в этой группе. Согласно ответ Alastair Maw, это поведение можно изменить, изменив app.config следующим образом:
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>
Ответ 2
Пока 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
Environment.ProcessorCount также будет включать в себя любые гиперпотоковые процессоры.
Нет способа (по крайней мере, через Windows 2003) отличать гиперпотоковый процессор от одного с двумя ядрами.
Ответ 4
В действительности это зависит от целевой платформы. Ответ Stephbu отлично подойдет на XP SP3 и новее.
Если вы ориентируетесь на более старые платформы, вы можете проверить эту статью. Я написал его около полугода назад, и в нем я обсужу несколько разных способов сделать это, а также отдельные плюсы и минусы каждого метода.
Вы также можете проверить эту статью проекта кода, если вы заинтересованы в дифференциации теневых ядер от гиперпотока от реальных.
Ответ 5
System.Environment.ProcessorCount - это то, что вам нужно
Ответ 6
Environment.ProcessorCount
EDIT: доступен в .NET 2.0, а не в .NET 1.1
Ответ 7
Не хватает реплики для вики, но обратите внимание, что в дополнение к XPSP2 для Windows Server 2003 SP1 и SP2 также требуется исправление для включения этой функции:
Ответ 8
Вы можете использовать PowerShell для доступа к полной информации о процессоре. Например, вы можете запустить следующую команду, чтобы получить количество ядер процессора:
Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores
Гораздо проще исследовать WMI при использовании какого-либо инструмента для исследователей. Поэтому я могу предложить использовать инструмент просмотра WMI (например, WMIExplorer или WMI CIM Studio) для изучения классов, свойств и методов WMI.