CPUZと一致しないプロセッサの数

私はCPUコアの数を知りたいので、私はあなたのこのコード

SYSTEM_INFO siSysInfo;
DWORD getProcessorNum()
{
    GetSystemInfo(&siSysInfo);
    return siSysInfo.dwNumberOfProcessors;
}

それは4を返します。しかし、CPUZで私の結果をチェックすると、2Cores 4Thraeds

私はこのコードで__cpuidを試しています

unsigned regs[4];

__cpuid(regs,4);
cores = ((regs[0] >> 26) & 0x3f) + 1;

cout << " cpu cores: " << cores << endl;

それは8コアを返します。

私のコードが間違っていると教えてください。

私はMSVC ++ 2010でこのコードをWin7x64プラットフォームでi3プロセッサで実行します。

2
CPUZは、ハードウェアコアと論理コアの両方を報告します。 Hyper-Threadingがマシン上でオンになり、コア数が2倍になります(2物理 - > 4論理)。
追加された 著者 osgx,
Necrolis、cpuid 4がコアカウントとして8を返した理由を教えてください。
追加された 著者 osgx,
しかし、CPUzは言う: "2Cores 4Thraeds"
追加された 著者 osgx,
@osgx:そのページを信頼しないでください、多くの不正確/曖昧な記述があります。 cpuidを使用しているときは、 __ cpuid(regs、0)から返されたカウントとintel/amdデベロッパーマニュアルのデータを信頼するだけです(編集:
追加された 著者 Necrolis,
@osgx:あなたは私のコメントを誤解しています。これは、有効なcpuidインデックス( __ cpuid(regs、0)がCPU IDと共に使用する有効なインデックスを返します)なぜ彼が8になったのか、i3には4つの実行スレッドがあり、HTによって倍増しています(あなたが言うように)。
追加された 著者 Necrolis,

1 答え

CPUの量をチェックするのは簡単ではありません(主にマルチコア/ソケット/ CPUの設計による)。 GetSystemInfo 呼び出しは、システムが認識する実行スレッドの量を返します.CPUIDはCPUトポロジーによって異なります(インテルの開発者マニュアルを参照してください)。

私はすべての状況を捕らえるために何かを作った、それは役に立つかもしれない:

static void GetProcessorTopology(size_t& nPhysical, size_t& nCores, size_t& nSystemThreads, size_t& nHWThreads, size_t& nThreadsPerCore)
{
    int nInfo[4];
    SYSTEM_INFO pSystemInfo;
    IsWOW64() ? GetNativeSystemInfo(&pSystemInfo) : GetSystemInfo(&pSystemInfo);
    nSystemThreads = pSystemInfo.dwNumberOfProcessors;
    if(TestTopologyLevel(nInfo,0x0,1) || TestTopologyLevel(nInfo,0x1,1))
    {
        nThreadsPerCore = nInfo[1] & 0xFFFF;
        if(TestTopologyLevel(nInfo,0x0,2) || TestTopologyLevel(nInfo,0x1,2))
        {
            nHWThreads = nInfo[1] & 0xFFFF;
            nCores = (nThreadsPerCore == 0) ? GetCoreCount(nInfo) : nHWThreads/nThreadsPerCore;
        }
        else
        {
            nHWThreads = nSystemThreads;
            nCores = GetCoreCount(nInfo);       
        }       
    }
    else
    {
        nThreadsPerCore = 1;
        nHWThreads = nSystemThreads;
        nCores = GetCoreCount(nInfo);
    }

    nPhysical = (nCores == 0) ? 1 : (nSystemThreads/nThreadsPerCore)/nCores;
}

static inline bool TestTopologyLevel(int* pInfo, int nMode, int nLevel)
{
    __cpuidex(pInfo,0xB,nMode);
    return ((pInfo[2] >> 8) & 0xFF) == nLevel;
}

static inline size_t GetCoreCount(int* nInfo)
{
    __cpuid(nInfo,0);
    if(nInfo[0] >= 4)
    {
        __cpuidex(nInfo,0x4,0x0);
        return (nInfo[0] >> 26) + 1;
    }
    else
    {
        __cpuid(nInfo,0x80000000);
        int nCPUID = nInfo[0];
        __cpuid(nInfo,1);                   
        if(nInfo[3] & 0x10000000 && nCPUID >= 0x80000008)
        {
            __cpuid(nInfo,0x80000008);
            return (nInfo[2] & 0xFF) + 1;
            }
        }

    return 1;
}
0
追加された