Мне нужен надежный способ обнаружить, сколько ядер процессора находится на компьютере. Я создаю численно интенсивное моделирование приложение C# и хочу создать максимальное количество выполнения потоков как ядра. Я попробовал многие методы, предложенные вокруг Интернета как Среда. ProcessorCount, с помощью WMI, этого кода: http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx Ни один из них, кажется, не думает AMD X2, имеет два ядра. Какие-либо идеи?
Править: это появляется та Среда. ProcessorCount возвращает корректное число. Именно на intel CPU с гиперпоточностью возвращает неправильное число. Единственное ядро с гиперпоточностью возвращается 2, когда это должно только быть 1.
См. Определение количества процессоров
В качестве альтернативы используйте GetLogicalProcessorInformation ()
Win32 API: http : //msdn.microsoft.com/en-us/library/ms683194 (VS.85) .aspx
Вы получаете правильное количество процессоров, AMD X2 - настоящий многоядерный процессор. Гиперпоточное ядро Intel рассматривается Windows как многоядерный процессор. Вы можете узнать, используется ли гиперпоточность с WMI, Win32_Processor , NumberOfCores против NumberOfLogicalProcessors.
Насколько я могу судить, 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;
}
}