【发布时间】: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