28

您如何检测 .net 中的物理处理器/内核的数量?

4

8 回答 8

29
System.Environment.ProcessorCount

返回逻辑处理器的数量

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

对于物理处理器数量,您可能需要使用 WMI - XP/Win2k3 以上支持以下元数据(在 Vista/Win2k8 之前的 SP 中启用了功能)。

Win32_ComputerSystem.NumberOfProcessors返回物理计数

Win32_ComputerSystem.NumberOfLogicalProcessors返回逻辑(呃!)

请注意,超线程 CPU 看起来与多核 CPU 相同,但性能特征却大不相同

要检查启用了 HT 的 CPU,请检查 Win32_Processor 的每个实例并比较这两个属性。

Win32_Processor.NumberOfLogicalProcessors

Win32_Processor.NumberOfCores

在多核系统上,这些值通常是相同的。

此外,请注意可能具有多个处理器组的系统,这在具有大量处理器的计算机上很常见。默认情况下, .Net 将仅使用第一个处理器组- 这意味着默认情况下,线程将仅使用第一个处理器组中的 CPU,并且Environment.ProcessorCount仅返回该组中的 CPU 数量。根据Alastair Maw 的回答,可以通过如下更改 app.config 来更改此行为:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>
于 2008-10-09T18:22:14.340 回答
11

虽然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;
        }
    }
}
于 2008-10-09T22:00:51.153 回答
4

这实际上因目标平台而异。Stephbu 的回答将在 XP SP3 和更新版本上运行良好。

如果您的目标是较旧的平台,您可能需要查看这篇文章。我大约半年前写了它,在其中我讨论了几种不同的方法来做到这一点,以及每种方法的优缺点。

如果您对区分影子内核和超线程和真实内核感兴趣,您可能还想查看这篇代码项目文章。

于 2008-10-09T20:13:03.930 回答
3

Environment.ProcessorCount 还将包括任何超线程处理器。

没有办法(至少在 Windows 2003 之前)将超线程处理器与具有两个内核的处理器区分开来。

于 2008-10-09T18:26:21.850 回答
2

System.Environment.ProcessorCount 是你需要的

于 2008-10-09T18:20:15.687 回答
2

Environment.ProcessorCount

编辑:在 .NET 2.0 中可用,在 .NET 1.1 中不可用

于 2008-10-09T18:20:53.827 回答
1

没有足够的 wiki 代表,但请注意,除了 XPSP2,Windows 2003 Server SP1 和 SP2 还需要一个修补程序来启用此功能:

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

于 2009-08-11T13:06:05.177 回答
1

您可以使用 PowerShell 访问全面的处理器信息。例如,您可以运行以下命令来获取 CPU 核心数:

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

使用某种资源管理器工具时,研究 WMI 会容易得多。因此,我可以建议使用 WMI 浏览工具(例如WMIExplorerWMI CIM Studio)来探索 WMI 类、属性和方法。

于 2013-11-20T13:18:58.710 回答