有没有办法可靠地检测CPU核心的总数?

时间:2010-04-04 18:36:32

标签: c# .net multithreading cpu-cores

我需要一种可靠的方法来检测计算机上有多少CPU核心。我正在创建一个数字密集的模拟C#应用程序,并希望创建最大数量的运行线程作为核心。我已经尝试了很多围绕互联网建议的方法,比如Environment.ProcessorCount,使用WMI,这段代码:http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx他们似乎都不认为AMD X2有两个内核。有任何想法吗?

编辑:看起来Environment.ProcessorCount正在返回正确的数字。它位于具有超线程的英特尔CPU上,返回错误的数字。超线程的一个核心是2,当它应该只有1时。

4 个答案:

答案 0 :(得分:6)

据我所知,Environment.ProcessorCount在WOW64(在64位操作系统上作为32位进程)运行时可能返回不正确的值,因为它依赖的P / Invoke签名使用{{3而不是GetSystemInfo。这似乎是明显的问题,所以我不确定为什么它不会在这一点上得到解决。

试试这个,看看它是否解决了这个问题:

private static class NativeMethods
{
    [StructLayout(LayoutKind.Sequential)]
    internal struct SYSTEM_INFO
    {
        public ushort wProcessorArchitecture;
        public ushort wReserved;
        public uint dwPageSize;
        public IntPtr lpMinimumApplicationAddress;
        public IntPtr lpMaximumApplicationAddress;
        public UIntPtr dwActiveProcessorMask;
        public uint dwNumberOfProcessors;
        public uint dwProcessorType;
        public uint dwAllocationGranularity;
        public ushort wProcessorLevel;
        public ushort wProcessorRevision;
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    internal static extern void GetNativeSystemInfo(ref SYSTEM_INFO lpSystemInfo);
}

public static int ProcessorCount
{
    get
    {
        NativeMethods.SYSTEM_INFO lpSystemInfo = new NativeMethods.SYSTEM_INFO();
        NativeMethods.GetNativeSystemInfo(ref lpSystemInfo);
        return (int)lpSystemInfo.dwNumberOfProcessors;
    }
}

答案 1 :(得分:2)

请参阅Detecting the number of processors

或者,使用GetLogicalProcessorInformation() Win32 API:http://msdn.microsoft.com/en-us/library/ms683194(VS.85).aspx

答案 2 :(得分:2)

您获得的处理器数量正确,AMD X2是真正的多核处理器。英特尔超线程核心被Windows视为多核CPU。您可以了解超线程是否与WMI,Win32_Processor,NumberOfCores与NumberOfLogicalProcessors一起使用。

答案 3 :(得分:-1)

您是否检查过NUMBER_OF_PROCESSORS个环境变量?