我尝试了sysconf(_SC_NPROCESSORS_ONLN)
和sysconf(_SC_NPROCESSORS_CONF)
,但它们都返回了(as Intel calls it in their CPU documentation)个线程的总数(如:超线程线程),而不是物理内核(称为Core on提到英特尔网站)。
有没有办法获得物理内核的数量,而不是逻辑? /proc/cpuinfo
中的条目计数为8,类似于调用sysconf
,我的处理器是上面链接的。
我对使用Linux和BSD的答案感兴趣,最好是以C API的形式。
答案 0 :(得分:6)
另一种解决方案是使用hwloc。这是一个简单的例子:
#include <hwloc.h>
#include <stdio.h>
int main(){
// Allocate, initialize, and perform topology detection
hwloc_topology_t topology;
hwloc_topology_init(&topology);
hwloc_topology_load(topology);
// Try to get the number of CPU cores from topology
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_CORE);
if(depth == HWLOC_TYPE_DEPTH_UNKNOWN)
printf("*** The number of cores is unknown\n");
else
printf("*** %u core(s)\n", hwloc_get_nbobjs_by_depth(topology, depth));
// Destroy topology object and return
hwloc_topology_destroy(topology);
return 0;
}
我在使用GCC 4.1.2运行Red Hat 4.1.2-48的Linux机器上以及运行带有GCC 4.2.1的OS X 10.8.1的Apple上进行了测试
答案 1 :(得分:4)
它不是C API,它可能只适用于Linux。但这就是我所知道的,也许你会觉得这很有用。
/proc/cpuinfo
的CPU描述包含很少的字段:physical id
,它是物理CPU标识符,core id
,它是物理核心标识符。如果您计算唯一(physical id, core id)
对的数量,您就会得到您想要的结果。
您还可以检查列出的每个物理CPU的cpu cores
字段。
答案 2 :(得分:2)
/sys/devices/system/cpu/cpu<n>
中的文件更容易解析此类信息,并包含有关拓扑的其他信息。它仍然不是一个预先包装好的API,但是如果您要查找的只是CPU数量,并且可能哪些线程属于哪些核心属于哪些芯片,那么编写一些内容来解析它也不会太糟糕。我知道有一些库(例如cgroups
东西)已经解析了这个,所以有一些参考点可以找到很好的方法来解决它,甚至可能有一种方法可以使用这些库的部分内容你想要的。