7

コンピューター上にあるCPUコアの数を検出するための信頼できる方法が必要です。数値的に強力なシミュレーションC#アプリケーションを作成しており、実行中のスレッドの最大数をコアとして作成したいと考えています。私は、Environment.ProcessorCountのようなインターネットで提案されている方法の多くを、 WMIを使用して、次のコードで試しました 。何か案は?

編集:Environment.ProcessorCountが正しい数値を返しているようです。間違った番号を返すハイパースレッディングを備えたIntelCPU上にあります。ハイパースレッディングを使用するsignleコアは2を返しますが、1だけである必要があります。

4

4 に答える 4

8

私の知る限り、WOW64で実行すると(64ビットOSで32ビットプロセスとして)、P /Invoke署名が.ではなくEnvironment.ProcessorCountusesに依存しているため、誤った値が返される可能性があります。これは明らかな問題のように思われるので、なぜこの時点で解決されなかったのかわかりません。GetSystemInfoGetNativeSystemInfo

これを試して、問題が解決するかどうかを確認してください。

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;
    }
}
于 2010-04-04T18:44:05.717 に答える
2

プロセッサ数の検出を参照してください

GetLogicalProcessorInformation()または、 Win32 APIを使用します:http: //msdn.microsoft.com/en-us/library/ms683194 (VS.85).aspx

于 2010-04-04T19:21:09.183 に答える
2

正しいプロセッサ数を取得しています。AMDX2は真のマルチコアプロセッサです。Intelハイパースレッドコアは、WindowsではマルチコアCPUとして扱われます。ハイパースレッディングがWMI、 Win32_Processor、NumberOfCoresとNumberOfLogicalProcessorsで使用されているかどうかを確認できます。

于 2010-04-04T19:27:19.007 に答える
-1

NUMBER_OF_PROCESSORS環境変数を確認しましたか?

于 2010-04-04T19:23:19.327 に答える