CPUID on Intel i7 processors

6

我在新款i7机器上,使用基于CPUID的代码出现了问题。它将CPU检测为具有8个超线程单元的单核心,而不是4个核心,每个核心都有2个超线程单元。

我一定是误解了来自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。

有人以前遇到过这种情况吗?


嘿StarPacker,虽然我恐怕无法帮你解决这个具体的问题,但我有一个相关的问题:https://dev59.com/hnI-5IYBdhLWcg3wy76n我想知道你是否能够用一些示例代码之类的东西将我引导到正确的方向...我真的很想在我的应用程序中为CPUID提供X86/X64支持,以便在崩溃报告中获取处理器信息/功能,该应用程序将被同行研究人员使用(他们将在我无法直接访问的计算机上运行我的代码)。干杯,Kris - Kris
1个回答

5
有趣的问题-不幸的是我没有i7可以操作,所以我只能猜测。
也许看一下 this article 会有帮助-虽然在原则上你的方法似乎是正确的,但他们提出了一些注意事项。也许阅读一下,看看在任何阶段是否存在错误的假设。它们基本上使用CPUID.1.EBX [23:16](物理封装中的最大逻辑处理器数),CPUID.4.EAX [31:26]+1(物理封装中的最大核心数)和CPUID.4.EAX [25:14]+1(共享目标级别高速缓存的最大逻辑处理器数)来推断处理器拓扑结构,这与你正在进行的工作类似。
其次,作为另一种选择,在支持CPUID函数EAX = 0Bh的CPU上(请参见Intel的文档),您可以使用此函数代替以获取所需的规格。也许比较两种方法的结果可能更有启发性?

--编辑-- 这篇非常有用的文章涵盖了上述两种方法。基本上,我认为在i7上,CPUID.0B是首选变体。


谢谢您的答复。可惜它没有被采纳,尽管它完美地回答了这个问题。 - ttvd
我在i5-560m上遇到了同样的问题,其中CPUID.1.EBX [23:16]报告了16个逻辑处理器而不是4个。我不知道为什么会返回错误的结果。虽然PhiS链接的第一篇文章可能包含了答案,但它已经被删除了。其他链接并没有真正提供答案。即使替代方法有效,似乎仍然没有任何原因可以解释为什么第一个方法不起作用。 :-/ - Mike S
啊——第二篇文章实际上解释了为什么CPUID.1.EBX[23:16]不起作用:与AP-485所暗示的相反,它实际上并没有返回逻辑处理器的真实数量: “CPUID.1:EBX[23:16]表示可以分配给物理封装中的逻辑处理器的最大可寻址ID(初始APIC ID)的数量。该值可能与实际存在于物理封装硬件中的逻辑处理器数量不同。” 唉,最简单的东西被深深地埋藏了……仿佛应用程序开发人员更关心理论上的最大线程数而不是真实的线程数。 - Mike S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接