Есть ли способ надежно обнаружить общее количество сердечников ЦП?

StackOverflow https://stackoverflow.com/questions/2575472

Вопрос

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

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

Это было полезно?

Решение

Видеть Обнаружение количества процессоров

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

Другие советы

От того, что я могу сказать, 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;
    }
}

Вы получаете правильный счетчик процессора, AMD X2 - это настоящий многоядерный процессор. Сердечнее сердечнее сердечника гипертертона лечится окнами в виде процессора Muti-Core. Вы можете узнать, используется ли HyperThreading с WMI, Win32_Processor., Numberofcores vs numberofLogialProcessors.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top