Существует ли способ надежно обнаружить общее количество ядер процессора?

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

Править: это появляется та Среда. ProcessorCount возвращает корректное число. Именно на intel CPU с гиперпоточностью возвращает неправильное число. Единственное ядро с гиперпоточностью возвращается 2, когда это должно только быть 1.

7
задан John Sheares 4 April 2010 в 19:12
поделиться

4 ответа

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

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

2
ответ дан 7 December 2019 в 01:19
поделиться

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

-1
ответ дан 7 December 2019 в 01:19
поделиться

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

2
ответ дан 7 December 2019 в 01:19
поделиться

Насколько я могу судить, 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;
    }
}
7
ответ дан 7 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: