【问题标题】:hyperthreading disabled in BIOS but still shows up in CPUID在 BIOS 中禁用超线程,但仍显示在 CPUID 中
【发布时间】:2014-09-08 15:21:15
【问题描述】:

我创建了一个函数(见下文),用于检测 CPU 内核是否具有超线程。当我在 BIOS 中禁用超线程时,CPUID 仍然报告内核具有超线程。我怎样才能正确地确定是否启用了超线程?

// input:  eax = functionnumber, ecx = 0
// output: eax = output[0], ebx = output[1], ecx = output[2], edx = output[3]
//static inline void cpuid (int output[4], int functionnumber)  

bool hasHyperThreading() {
    int abcd[4];
    cpuid(abcd,1);
    return (1<<28) & abcd[3];
}

【问题讨论】:

  • 简短回答:没有一个 cpuid 位可以满足您的需要。如果处理器支持 HT,您的代码查看的位返回 true,但在 BIOS 中禁用了 HT。这里有一些东西要看:stackoverflow.com/questions/2901694/….
  • @ScottD,这正是我期待的答案。我急忙提出这个问题。我想我现在知道该怎么做了。
  • @ScottD,我调查了一下。这比我想象的要复杂。您发布的链接已过时。它报告我的系统上有 32 个逻辑处理器和 16 个物理内核(应该是 8 个和 4 个)。这解释了它stackoverflow.com/questions/1647190/…
  • @ScottD,我发现 AMD 的一些源代码在我的 Intel 系统上给出了正确的结果:8 个逻辑核心,4 个启用超线程的物理核心和 4 个逻辑核心,4 个物理核心禁用。我认为这也会在 AMD 上给出正确的结果developer.amd.com/resources/documentation-articles/…
  • @ScottD,嗯...刚刚在我的四路服务器上测试了 AMD 代码。它给出了错误数量的物理内核。它完全错误,每个插槽的核心错误,所以它没用。也许是时候我使用图书馆来做到这一点了。

标签: assembly x86 intel intrinsics cpuid


【解决方案1】:

您问题第一部分的答案是“出于历史原因”,即即使对于仅多核的处理器,该位仍处于开启状态;详情是over here

要确定是否启用了 HT,您需要枚举活动的逻辑处理器;如何做到这一点取决于操作系统。然后为每个活动的逻辑处理器获取其 x2APIC id(您需要在其上运行才能获得它,因此您需要能够设置线程到处理器的关联)并测试最后一位。如果没有启用 HT,则不会为任何逻辑处理器设置该位。很好的源代码是provided by Intel。我看到 Z boson 提供了一个替代方案,OpenMP-based method,但是需要一点柚木才能真正回答所问的问题(请参阅我的评论。)

另外,据我所知,AMD 目前没有任何处理器的超线程。

【讨论】:

  • 我的问题是xy problem。我真正想知道的是物理内核的数量,我正在使用超线程来解决这个问题。但是你是对的,通过对我的解决方案进行小的修改来查找内核数量,你可以找出是否存在超线程并在 BIOS 中启用,所以我会给你加一个以防万一有人真的想要知道这一点。
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2020-03-22
  • 2023-01-24
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2018-03-15
相关资源
最近更新 更多