Есть ли способ надежно обнаружить общее количество сердечников ЦП?
-
24-09-2019 - |
Вопрос
Мне нужен надежный способ обнаружения того, сколько ядер 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?