C / C ++ / Assembly以编程方式检测Windows,Mac和Linux上的超线程是否处于活动状态

时间:2010-05-25 11:55:27

标签: c++ c assembly hyperthreading

我已经可以在所有这三个平台上正确检测到逻辑处理器的数量。

为了能够正确检测物理处理器/核心的数量,我必须检测是否支持超线程并激活(或者如果您愿意,则启用),如果是,则将逻辑处理器的数量除以2以确定数量物理处理器。

Perphaps我应该提供一个例子:

启用超线程的四核英特尔CPU有4个物理内核,但有8个逻辑处理器(超线程创建了4个逻辑处理器)。所以我的当前函数将检测到8而不是所需的4。

因此,我的问题是,是否有办法检测是否支持超线程并启用?

4 个答案:

答案 0 :(得分:4)

Linux的:

物理CPU数量:

grep -i "physical id" /proc/cpuinfo | sort -u | wc -l

逻辑CPU数量:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l

答案 1 :(得分:4)

CPUID指令(在EAX中传递函数1H时)会在EDX寄存器的第28位返回超线程功能标志。我认为多核处理器报告说它们是超线程启用的,即使每个核心只能运行一个线程。

它还返回EBX的第23-16位中每个物理处理器的逻辑处理器数。我认为您必须单独查询每个处理器才能访问系统上的所有处理器。

答案 2 :(得分:4)

在Windows 2003 Server和Windows XP SP3及更高版本中,您可以使用GetLogicalProcessorInformation系统调用来确定此信息。

答案 3 :(得分:3)

在OS X上:

#include <sys/sysctl.h>

int physicalCores;
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0);

有关详细信息,请参阅标题或联机帮助页。 (注意,您可以使用“hw.logicalcpu”字符串以相同的方式获取逻辑cpus的数量)