I need a reliable way to detect how many CPU cores are on a computer. I am creating a numerically intense simulation C# application and want to create the maximum number of running threads as cores. I have tried many of the methods suggested around the internet like Environment.ProcessorCount, using WMI, this code: http://blogs.adamsoftware.net/Engine/DeterminingthenumberofphysicalCPUsonWindows.aspx None of them seem to think a AMD X2 has two cores. Any ideas?
Edit: it appears that Environment.ProcessorCount is returning the correct number. It's on a intel CPU with hyperthreading that is returning the wrong number. A signle core with hyperthreading is returning 2, when it should only be 1.
See Detecting the number of processors
Alternatively, use the
GetLogicalProcessorInformation()
Win32 API: http://msdn.microsoft.com/en-us/library/ms683194(VS.85).aspxHave you checked the NUMBER_OF_PROCESSORS environment variable ?
You are getting the correct processor count, AMD X2 is a true multi-core processor. An Intel hyperthreaded core is treated by Windows as a muti-core CPU. You can find out whether or not hyperthreading is used with WMI, Win32_Processor, NumberOfCores vs NumberOfLogicalProcessors.
From what I can tell,
Environment.ProcessorCount
may return an incorrect value when running under WOW64 (as a 32-bit process on a 64-bit OS) because the P/Invoke signature it relies on usesGetSystemInfo
instead ofGetNativeSystemInfo
. This seems like an obvious issue, so I'm not sure why it wouldn't have been resolved by this point.Try this and see if it resolves the issue: