3

我试过sysconf(_SC_NPROCESSORS_ONLN)and ,但它们都返回(英特尔在他们的 CPU 文档中称之为sysconf(_SC_NPROCESSORS_CONF))线程的总数(如:超线程线程),而不是物理内核(在提到的英特尔网站上称为核心)。

有没有办法获得物理核心的数量,而不是逻辑?计数中的条目/proc/cpuinfo给出 8,类似于 call sysconf,我的处理器是上面链接的那个。

我对在 Linux 和 BSD 上工作的答案感兴趣,最好是 C API 的形式。

4

3 回答 3

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;
}

我在一个运行 Red Hat 4.1.2-48 和 GCC 4.1.2 的 Linux 机器上,以及一个运行 OS X 10.8.1 和 GCC 4.2.1 的 Apple 上测试了这个

于 2012-09-18T22:39:39.030 回答
4

它不是 C API,它可能仅适用于 Linux。但这就是我所知道的,也许你会发现这很有用。

/proc/cpuinfo的 CPU 描述有几个字段:physical id是物理 CPU 标识符core id, 是物理内核标识符。如果你计算唯一(physical id, core id)对的数量,你会得到你想要的。

您还可以检查cpu cores列出的每个物理 CPU 的字段。

于 2012-09-18T19:19:50.940 回答
2

中的文件/sys/devices/system/cpu/cpu<n>更容易解析此类信息,并包含有关拓扑的其他信息。它仍然不是预包装的 API,但如果您要查找的只是 CPU 计数以及可能哪些线程属于哪些内核属于哪些芯片,那么编写一些东西来解析它不会太糟糕。我知道有一些库(例如这些cgroups东西)已经解析了这个,所以有一些参考点可以找到解决它的好方法,如果你愿意,甚至可能有一种方法可以只使用这些库的一部分。

于 2012-09-18T20:52:46.060 回答