在BIOS中禁用超线程但仍显示在CPUID中

时间:2014-07-17 16:27:38

标签: assembly x86 intel intrinsics cpuid

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

1 个答案:

答案 0 :(得分:1)

问题的第一部分的答案是&#34;由于历史原因&#34;,即即使对于只有多核的处理器,该位仍然是开启的;详情为over here

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

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