Intel i7处理器上的CPUID

时间:2009-10-29 23:33:40

标签: cpu cpu-registers cpuid

我在基于i7的新机器上遇到基于CPUID的代码问题。它将CPU检测为具有8个HT单元的单个核心,而不是4个核心,每个核心具有2个HT单元。

我必须误解从CPU返回的CPUID信息的结果,但我看不出如何。

基本上,我遍历Windows可见的每个处理器,为该线程设置线程关联,然后进行一系列CPUID调用。

args = new CPUID_Args();
args.eax = 1;
executeHandler(ref args);
if (0 != (args.edx & (0x1 << 28)))
{
  //If the 28th bit in EDX is flagged, this processor supports multiple logical processors per physical package
  // in this case bits 23:16 of EBX should give the count.
//** EBX here is 0x2100800
  logicalProcessorCount = (args.ebx & 0x00FF0000) >> 16;
//** this tells me there are 16 logical processors (wrong)
}
else
{ logicalProcessorCount = 1; }
apic = unchecked((byte)((0xFF000000 & args.ebx) >> 24));

if (maximumSupportedCPUID >= 4)
{
  args = new CPUID_Args();
  args.eax = 4;
  executeHandler(ref args);
//EAX now contains 0x1C004121
  coreCount = 1 + ((args.eax & 0xFC000000) >> 26);
//This calculates coreCount as 8
}
else
{ coreCount = 1; }

对于系统中的其余CPU重复此序列。

以前有人遇到过这个问题吗?

1 个答案:

答案 0 :(得分:5)

有趣的问题 - 不幸的是我没有i7可以玩,所以我只能在这里猜测。

查看this article可能会有用 - 虽然原则上你的方法似乎是正确的,但他们提出了一些警告。也许有一个阅读,看看在任何阶段你的任何假设是否可能是错误的。它们基本上使用CPUID.1.EBX [23:16](物理包中的最大#log处理器),CPUID.4.EAX [31:26] +1(物理包中的最大核心数)和CPUID.4 .EAX [25:14] +1(共享目标级缓存的物理包中的最大日志处理器数)推断处理器拓扑 - 这与您正在进行的操作一致。

其次,作为替代方案,在支持CPUID函数EAX = 0Bh(参见Intel's docs here)的CPU上,您可以使用此函数来获取所需的规格。也许比较这两种方法的结果可能会有所启发?

- Edit-- This是一篇非常有用的文章,涵盖了上述两种方法。基本上,我在i7上收集它,CPUID.0B是首选变体。