便携式硬件位置

可移植硬件位置 (hwloc) 是在 BSD 许可下分发的开放式源代码软件包。 它为现代架构的分层拓扑提供了一个可移植的抽象(跨操作系统、版本、架构等),包括 NUMA 内存节点、插座、共享缓存、内核和同步多线程(SMT)。 hwloc 集成到 LSF 中以检测硬件信息,并且可以支持 LSF 支持的大部分平台。

功能

hwloc 软件包收集各种系统属性 (例如,高速缓存和内存信息) 以及 I/O 设备 (例如,网络接口) 的位置。 它主要旨在帮助应用程序收集有关计算硬件的信息。

当 LIM 启动并且主机拓扑信息已更改时,它还会检测每个主机硬件拓扑。 management 主机 LIM 会检测 management 主机的拓扑。 服务器 主机 LIM 会检测本地主机的拓扑。 它在加入集群或向 管理 主机 LIM 发送拓扑信息以进行主机配置时,会将拓扑信息更新到 管理 主机。 一旦硬件拓扑发生更改,将更新主机拓扑信息。 如果任何 NUMA 内存节点、缓存、插座、内核、PU 等发生变化,硬件拓扑结构也会发生变化。 有时,即使核心号未更改,拓扑信息也会更改。

使用 lim -Tlshosts -T 命令可显示主机拓扑信息。 lim -t 命令显示 NUMA 节点总数,处理器总数,核心总数和线程总数。

拓扑结构

NUMA 节点包含套接字。 每个套接字都包含包含线程的核心 (进程)。 如果没有 hwloc 库,那么 LSF 使用 PCT 逻辑。 某些 AMD CPU 具有相反的结构,其中套接字节点包含 NUMA 节点。 拓扑的层次结构类似于树。 因此,来自 hwloc 的主机拓扑信息(NUMA 内存节点、缓存、插座、内核、PU 等)被组织成一棵树。 每个树节点都有其类型。 类型包括主机, NUMA ,套接字,高速缓存,核心和 pu。 每个树节点还包含其属性。

在以下示例中,hostA有 64 GB 内存和两个 NUMA 节点。 每个插槽节点有一个 NUMA、八个内核、16 个 PU(每个内核两个 PU)和 32 GB 内存。 NUMA 节点和 PU 都按系统提供的序列编号。 LSF 根据它从系统中检测到的级别来显示 NUMA 信息。 输出格式显示为树, NUMA 信息显示为NUMA[ID: memory]。PU 显示为parent_node(ID ID ...),其中parent_node可能是host,NUMA,socket,或core.

在以下示例中,NUMA[0: 32G]表示 NUMA 标识为 0 且具有 32 GB 内存。core0(0 16)表示父核心节点下有两个 PU ,这两个 PU 的标识为 0 和 16。
Host[64G] hostA 
Socket0
  NUMA[0: 32G]
   core0(0 16)
   core1(1 17)
   core2(2 18)
   core3(3 19)
   core4(4 20)
   core5(5 21)
   core6(6 22)
   core7(7 23)
Socket1
 NUMA[1: 32G]
   core8(8 24)
   core9(9 25)
   core10(10 26)
   core11(11 27)
   core12(12 28)
   core13(13 29)
   core14(14 30)
   core15(15 31)

某些 CPU (尤其是旧 CPU) 在缺少 NUMA ,套接字或核心的信息方面可能具有不完整的硬件拓扑。 因此,它们的拓扑不完整。

例如,

  • hostB(具有一个 Intel Pentium 4 CPU) 具有 2G 内存,一个插槽,一个核心和两个每个核心的 PUs。 信息hostB显示如下:
    Host[2G] hostB 
    Socket
          core(0 1)
  • hostC(具有一个 Intel Itanium CPU) 具有 4 GB 内存和两个 PU。 信息hostC显示如下:
    Host[4G] (0 1) hostC

某些平台或操作系统版本将仅报告一部分拓扑信息。

例如,hostD具有与 hostB, 但hostD正在运行 RedHat Linux 4 ,这不会提供核心信息。 因此,关于以下方面的信息:hostD显示如下:
Host[1009M] hostD
Socket (0 1)

动态装入 hwloc

您可以将 LSF 配置为从系统库路径动态装入 hwloc 库,以检测较新的硬件。 这使您能够随时使用最新支持的 ( 2.11.1 )LSFhwloc 集成版本,前提是当前版本的 hwloc 库与 的头文件之间不存在 hwloc兼容性问题。 如果 LSF 无法加载库文件, LSF 则默认使用静态库中的 函数 hwloc

通过在 lsf.conf 文件中启用 LSF_HWLOC_DYNAMIC 参数来启用 hwloc 库的动态装入。