获取核心数量(*不是* HT线程)

时间:2012-09-18 19:08:25

标签: c linux bsd

我尝试了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的形式。

3 个答案:

答案 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东西)已经解析了这个,所以有一些参考点可以找到很好的方法来解决它,甚至可能有一种方法可以使用这些库的部分内容你想要的。