逻辑CPU计数返回16而不是4

时间:2014-06-06 18:56:20

标签: c++ c intel cpuid

我有一个Intel Core i5-2450m(2个物理处理器和4个逻辑处理器),我想找到一种方法来计算AMD和Intel CPU上的逻辑和物理内核。 但是,经过一些搜索,我注意到了一些奇怪我的代码不是返回4个逻辑单元,而是给我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 );
}

2 个答案:

答案 0 :(得分:6)

  

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

Source

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

计算实际逻辑CPU的示例代码也可以在链接的whire文件中找到。

答案 1 :(得分:2)

更完整的答案是,对于2010年之前制造的英特尔处理器,通常可以使用合适的代码。 (我想听听反例的说法!)这种计算程序甚至在2007年(?)左右的英特尔老式演示文稿中给出{?3}}(不要让发布日期愚蠢的你;当这个演示文稿发布时,英特尔酷睿还没有公开,奔腾至尊版是英特尔的顶级产品。)相当可耻的是,该算法仍然在MSDN页面中给出__cpuid ,即使是2013年版! (https://software.intel.com/en-us/articles/hyper-threading-technology-and-multi-core-processor-detection)自2008年以来,MSDN示例代码尚未更新......

2010年初,英特尔推出的Westmere处理器在其APIC ID领域存在差距。因此,这些以及后来的处理器需要一种更精确的计算核心的方法。这些处理器都有x2APIC并且支持cpuid的叶子0xB ......这可以告诉你APIC id空间中的间隙,通过EAX [4:0]以及每个级别确切存在多少个逻辑处理器(package /核心)通过EBX。该链接由上午提供。是权威的,虽然相当干燥。基本上你所要做的就是用EAX = 0xB,ECX = 1调用cpuid,并且你在EBX中返回的每个包的逻辑处理器数量都是正确的。

此外,关于AMD的问题部分未得到回答。 AMD有一种不同的方法,因为它们不支持与英特尔相同的cpuid叶片。我能找到的关于AMD(2013年)的最新信息是http://msdn.microsoft.com/en-us/library/hskdteyh.aspx

顺便说一句,我今天在CPUID上更新维基百科页面时挖出了所有这些信息。