【问题标题】:Getting number of cores (*not* HT threads)获取内核数量(*不是* HT 线程)
【发布时间】:2012-09-11 02:15:43
【问题描述】:

我尝试过sysconf(_SC_NPROCESSORS_ONLN)sysconf(_SC_NPROCESSORS_CONF),但它们都返回 (as Intel calls it in their CPU documentation) 线程的总数(如:超线程线程),而不是物理内核(在提到的英特尔网站上称为核心)。

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

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

【问题讨论】:

  • @Anonymous downvoter,需要解释一下吗?

标签: c linux bsd


【解决方案1】:

另一种解决方案是使用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 上进行了测试

【讨论】:

  • 在 Ubuntu 12.04 上,apt-get install libhwloc-dev,并与 -lhwloc 链接。这段代码分别给出了 core2duo e8400 和 i7-3770、2 核和 4 核的正确答案。
  • 在 AMD Piledriver 6380 上,hwloc 报告 16 个内核,从 AMD 的角度来看这是正确的,因为有 16 个整数管道,但只有 8 个浮点管道:AMD architecture。正如@liori 所建议的那样,计算 /proc/cpuinfo 中的唯一(物理 id、核心 id)组合得到 8。在该架构上所谓的“核心”有点模棱两可。
  • @MarkGates 是的,我发现 AMD 所谓的“核心”完全具有误导性。它让我在这个问题上陷入了循环:stackoverflow.com/questions/19780554/…
【解决方案2】:

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

【讨论】:

  • 是的,计算.../cpu&lt;n&gt; 并根据.../cpu&lt;n&gt;/topology/thread_siblings_lists 过滤它似乎比解析/proc/cpuinfo 更容易(或者说“我又在写那个”ish)。一个问题:我目前在 Linux 上,所以我可以看到它得到了很好的支持。 BSD 也支持它吗?
  • /sys 文件系统是由 Linux 内核生成的,因此,如果它没有运行 Linux 内核,或者编译时内核中没有包含特定选项,那么信息不会在那里。我个人对 BSD 没有任何经验(至少最近是这样),所以我不能肯定...
【解决方案3】:

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

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

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

【讨论】:

  • 对,计算应该没有问题。然而,我将等待接受这一点,以防有人在合理的时间内提供一些不那么“愚蠢的文件解析”的解决方案。
猜你喜欢
  • 2011-08-06
  • 2012-10-12
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
相关资源
最近更新 更多