尝试将 Open MPI 等级绑定到 NUMA 节点计算机上的每个核心。 该机器有 2 个节点,每个节点有 12 个核心。 节点没有名称,所以我无法做到
--host a:12,b:12
另外,我想将额外的排名确定性地绑定到特定的核心上,超额订阅时如何做到这一点?
第一个问题是:如何将24个rank绑定到NUMA节点核心上?每个核心一个等级
mpirun -n 24 --bind-to numa --report-bindings ./app
这个命令将返回 There are not enough slots available in the system
,而如果我这样做 lscpu
,输出会显示 CPU(s): 24, NUMA node(s): 2
第二个问题是:如果我想在同一台 NUMA 机器上绑定 27 个Rank(超额订阅),如何确定性地进行? 当我想要超额订阅 3 个Rank 时,如何做到这一点,以便每次运行应用程序时,额外的 3 个Rank 始终绑定到相同的 3 个核心?
如何将24个rank绑定到NUMA节点核心上?每个核心一个等级
首先,正如 @Gilles 指出的:确保您的 24 个核心是实际的物理核心,而不是超线程。
最安全(也是最繁琐)的是将有序处理器列表提供给
mpirun
命令。
对你来说,那就是:
mpirun -np 24 --report-bindings --cpu-list 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 --bind-to cpu-list:ordered ./app
这使您可以完全控制在何处生成哪个进程,这在某些进程进行大量通信时非常有用。您可以确保它们从硬件角度彼此接近。或者您想避免使用某些核心,因为其他作业正在其上运行。
如果我想在同一台 NUMA 机器上绑定 27 个Rank(超额订阅),如何确定地做到这一点?
首先,这是生产代码中通常应该避免的事情。特别是对于代码,每个进程都执行相同的操作。它会降低你的效率,因为你的程序只能与最慢的核心一样快!
也就是说,您应该能够使用排名文件,进一步描述here和here
例如,假设您想在核心 0 上固定 4 个进程:
rankfile
:
rank 0=localhost slot=0:0
rank 1=localhost slot=0:0
rank 2=localhost slot=0:0
rank 3=localhost slot=0:0
然后
mpirun -np 4 --report-bindings -rf rankfile ./app