我已经可以在所有这三个平台上正确检测逻辑处理器的数量。
为了能够正确检测物理处理器/内核的数量,我必须检测是否支持超线程并且处于活动状态(或者如果您愿意,可以启用),如果是,则将逻辑处理器的数量除以 2 以确定物理处理器的数量.
也许我应该提供一个例子:
启用了超线程的四核 Intel CPU 有 4 个物理内核,还有 8 个逻辑处理器(超线程创建了 4 个逻辑处理器)。所以我当前的功能将检测到 8 而不是所需的 4。
因此,我的问题是是否有办法检测是否支持和启用超线程?
我已经可以在所有这三个平台上正确检测逻辑处理器的数量。
为了能够正确检测物理处理器/内核的数量,我必须检测是否支持超线程并且处于活动状态(或者如果您愿意,可以启用),如果是,则将逻辑处理器的数量除以 2 以确定物理处理器的数量.
也许我应该提供一个例子:
启用了超线程的四核 Intel CPU 有 4 个物理内核,还有 8 个逻辑处理器(超线程创建了 4 个逻辑处理器)。所以我当前的功能将检测到 8 而不是所需的 4。
因此,我的问题是是否有办法检测是否支持和启用超线程?
在 Windows 2003 Server 和 Windows XP SP3 及更高版本上,您可以使用GetLogicalProcessorInformation系统调用来确定此信息。
CPUID指令(当您在 EAX 中传递函数 1H 时)在 EDX 寄存器的第 28 位返回它们的超线程功能标志。我认为多核处理器报告说它们启用了超线程,即使每个单独的内核只能运行一个线程。
它还在 EBX 的第 23-16 位中返回每个物理处理器的逻辑处理器数。我认为您必须单独查询每个处理器才能访问系统上的所有处理器。
Linux:
物理 CPU 数量:
grep -i "physical id" /proc/cpuinfo | sort -u | wc -l
逻辑 CPU 数量:
grep -i "processor" /proc/cpuinfo | sort -u | wc -l
在 OS X 上:
#include <sys/sysctl.h>
int physicalCores;
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0);
有关更多信息,请参见标题或手册页。(请注意,您可以使用“hw.logicalcpu”字符串以相同的方式获取逻辑cpu的数量)