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

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

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的示例代码也可以在链接的whire文件中找到。

一个更完整的答案是,对于2010年之前制造的英特尔处理器,通常可以使用合适的代码。 (我想听听反例的说法!)这种计算程序甚至在2007年(?)左右的英特尔老式演示文稿中给出了https://software.intel.com/en-us/articles /超线程技术和多核处理器检测 (不要让发布日期变得愚蠢;当发布时,英特尔酷睿尚未公开,奔腾至尊版是英特尔的顶级产品。)相当可耻的是,该算法仍在MSDN页面中提供__cpuid,即使是2013版! ( http://msdn.microsoft.com/en-us/library/hskdteyh.aspx )自2008年以来,MSDN示例代码尚未更新…

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

此外,关于AMD的问题部分没有得到回答。 AMD有一种不同的方法,因为它们不支持与英特尔相同的cpuid叶片。 关于AMD(2013年)的最新信息,请访问http://developer.amd.com/resources/documentation-articles/articles-whitepapers/processor-and-core-enumeration-using-cpuid/

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