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>