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



我有一个英特尔酷睿i5-2450m(2个物理处理器和4个逻辑处理器),我想找到一种方法来计算AMD和英特尔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 );
}

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

来源。

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

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

一个更完整的答案是,对于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和支持叶子0xB的cpu以及…它可以通过EAX[4:0]告诉您APIC id空间中的间隙,并通过EBX准确地告诉您每个级别(包/核心)上存在多少逻辑处理器。新m.m.提供的链接是权威的,尽管相当枯燥。基本上,您所要做的就是调用cpuid, EAX=0xB, ECX=1,然后您将在EBX中返回每个包的逻辑处理器的正确数量。

关于AMD的部分也没有回答。AMD有一个不同的方法,因为他们不支持与英特尔相同的cpu叶。我能找到的关于AMD的最新信息(从2013年开始)是在http://developer.amd.com/resources/documentation-articles/articles-whitepapers/processor-and-core-enumeration-using-cpuid/

顺便说一下,我今天在更新维基百科关于CPUID的页面时发现了所有这些信息。

相关内容

  • 没有找到相关文章

最新更新