gpt4 book ai didi

x86 - Intel i7 处理器上的 CPUID

转载 作者:行者123 更新时间:2023-12-01 16:11:25 26 4
gpt4 key购买 nike

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

我一定是误解了从 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 会重复此序列。

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

最佳答案

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

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

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

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

关于x86 - Intel i7 处理器上的 CPUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com