Есть ли способ надежно определить общее количество ядер ЦП? - PullRequest
6 голосов
/ 04 апреля 2010

Мне нужен надежный способ определения количества ядер процессора на компьютере. Я создаю мощное приложение для моделирования на C # и хочу создать максимальное количество работающих потоков в качестве ядер. Я попробовал многие из методов, предложенных в Интернете, например Environment.ProcessorCount, используя WMI, этот код: http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx Ни один из них, похоже, не считает, что AMD X2 имеет два ядра. Есть идеи?

Редактировать: похоже, что Environment.ProcessorCount возвращает правильный номер. Это на процессоре Intel с гиперпоточностью, которая возвращает неправильный номер. Сигнальное ядро ​​с гиперпоточностью возвращает 2, когда оно должно быть только 1.

Ответы [ 4 ]

6 голосов
/ 04 апреля 2010

Из того, что я могу сказать, Environment.ProcessorCount может возвращать неверное значение при работе под WOW64 (как 32-битный процесс в 64-битной ОС), поскольку подпись P / Invoke, на которую он опирается, использует GetSystemInfo вместо GetNativeSystemInfo. Это похоже на очевидную проблему, поэтому я не уверен, почему она не была бы решена к этому моменту.

Попробуйте и посмотрите, решит ли это проблему:

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;
    }
}
2 голосов
/ 04 апреля 2010

Вы получаете правильное количество процессоров, AMD X2 - настоящий многоядерный процессор. Гиперпоточное ядро ​​Intel рассматривается Windows как многоядерный процессор. Вы можете узнать, используется ли гиперпоточность с WMI, Win32_Processor , NumberOfCores против NumberOfLogicalProcessors.

2 голосов
/ 04 апреля 2010

См. Определение количества процессоров

В качестве альтернативы используйте GetLogicalProcessorInformation() Win32 API: http://msdn.microsoft.com/en-us/library/ms683194(VS.85).aspx

0 голосов
/ 04 апреля 2010

Вы проверили переменную среды NUMBER_OF_PROCESSORS?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...