Hardware Locality

Hardware Locality

查看CPU拓扑与缓存层级的工具

系统官网

应用介绍

跑并行计算或者调服务器性能,「这台机器有 64 个核」这个数字远远不够用:哪些核共享 L3、哪几个属于同一个 NUMA 节点、网卡插在哪个 PCI 域下——这些决定了线程该往哪儿绑,绑错了内存访问要跨节点,性能能差出一截。Hardware Locality(hwloc)把这套结构画成一张树状拓扑图:从机器、NUMA 节点、CPU 插槽,一层层down 到 L3/L2/L1 缓存、物理核和逻辑线程,连 GPU 和网卡挂在哪一支都标出来。

它是 Open MPI 项目下的子项目,本身是一套 C 库加几个命令行工具。lstopo 负责把拓扑画出来(终端文本、图形窗口或者导出成图片),hwloc-bind 用来把进程或线程绑到指定的核或 NUMA 节点上,hwloc-calc 做拓扑对象之间的换算。MPI 实现、OpenMP 运行时和不少调度器底层用的都是它。

跨平台,Linux、Windows、macOS、各 BSD 和 Solaris 都支持,Windows 有编译好的 zip 包解压即用。BSD 协议开源。

软件功能



拓扑可视化:lstopo 把机器的完整层级画出来——NUMA 节点、CPU 插槽、L3/L2/L1 缓存、物理核和超线程,一眼看清谁和谁共享什么。

多种输出形式:可以在终端输出文本树、开图形窗口,也能导出成 PNG、SVG、PDF 或 XML,后者便于把远程机器的拓扑拿回本地分析。

I/O 设备定位:不只是 CPU,GPU、网卡、InfiniBand、NVMe 这些 PCI 设备挂在哪个 NUMA 节点下也会标在树上,做网卡亲和性绑定时用得上。

进程与线程绑定:hwloc-bind 可以把一个进程或线程绑定到指定的核、插槽或 NUMA 节点,并控制内存分配落在哪个节点上。

拓扑计算:hwloc-calc、hwloc-distances 等工具在 CPU 集合、对象编号和物理索引之间换算,写调度脚本时不用自己解析编号规则。

C 编程接口:核心是一套可移植的 C 库,程序可以在运行时查询硬件层级并据此决定线程放置,MPI 和 OpenMP 实现就是这么用它的。

跨平台一致:Linux、Windows、macOS、FreeBSD/NetBSD、Solaris 和 AIX 上提供同一套抽象,程序不用为每个系统写一遍探测代码。

免安装:Windows 版是编译好的 zip 包,解压后 bin 目录里直接有 lstopo 等可执行文件。

BSD 协议:开源且许可宽松,可自由集成进商业软件。

应用截图