2

I have a Intel Core i5-2450m (2 physical processors and 4 logical processors) and I want to find a way to count logical and physical cores on AMD and Intel CPUs. But, after some searches I noticed something strange. Instead of returning 4 logical units, my code give me 16.

static int8_t LogicalProcCount(void)
{
    if ( !Hyperthreading )
        return 1;

    uint32_t unused, ebx;
    CPUID(1, unused, ebx, unused, unused);

    return (int8_t) ( (ebx >> 16 ) & 0xFF );
}
4

2 回答 2

6

CPUID.1:EBX[23:16]表示可以分配给物理包中的逻辑处理器的可寻址 ID(初始 APIC ID)的最大数量。

来源

所以 16 与逻辑 CPU 的实际数量无关。在我的机器上CPUID.1:EBX[23:16]也返回 16,尽管它有 8 个逻辑 CPU。

计算实际逻辑 CPU 的示例代码也可以在链接的白皮书中找到。

于 2014-06-06T19:35:35.980 回答
2

一个更完整的答案是,对于 2010 年之前制造的英特尔处理器,这种代码通常是可以的。(不过,我想听听反例!)这种计数程序甚至在可追溯到 2007 年(?)左右的旧英特尔演示文稿中给出了https://software.intel.com/en-us/articles /hyper-threading-technology-and-multi-core-processor-detection(不要让发布日期欺骗了您;当该演示文稿发布时,英特尔酷睿尚未公开,而奔腾至尊版是英特尔的顶级产品.) 相当可耻的是,该算法仍然在 MSDN 页面中提供了关于 __cpuid,即使是他们的 2013 版!( http://msdn.microsoft.com/en-us/library/hskdteyh.aspx ) MSDN 示例代码自 2008 年以来一直没有更新...

2010 年初,英特尔推出了在 APIC id 空间中存在缺口的 Westmere 处理器。因此,这些和后来的处理器需要一种更精细的计算内核的方法。这些处理器都具有 x2APIC 并且还支持 cpuid 的叶子 0xB...它可以通过 EAX[4:0] 告诉您 APIC id 空间中的间隙以及每个级别存在多少逻辑处理器(包/核心)通过EBX。nm提供的链接是权威的,虽然比较枯燥。基本上,您所要做的就是使用 EAX=0xB, ECX=1 调用 cpuid,并且您将在 EBX 中返回每个包的正确数量的逻辑处理器。

此外,关于 AMD 的部分问题也没有得到回答。AMD 有不同的方法,因为它们不支持与 Intel 相同的 cpuid 叶。我能找到的关于 AMD 的最新信息(从 2013 年开始)位于http://developer.amd.com/resources/documentation-articles/articles-whitepapers/processor-and-core-enumeration-using-cpuid/

顺便说一句,我今天在更新 CPUID 上的 Wikipedia 页面时挖掘了所有这些信息。

于 2014-07-11T18:26:24.383 回答