1

我做了一个函数(见下文),它检测 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];
}
4

1 回答 1

2

您问题第一部分的答案是“出于历史原因”,即即使对于仅多核的处理器,该位仍然存在;细节在这里

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

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

于 2014-08-10T05:57:45.747 回答