将特定 MPI 等级分组到单个处理单元

Group specific MPI ranks to a single processing unit

我有一个 MPI 应用程序(比方说 -np 6),其中我提前知道 MPI 等级 0, 2,and 3 与等级 1, 4, and 5 相比在计算上非常轻,我想通过将等级 0, 2, and 3 固定到同一个物理处理单元来节省资源。然后将每个等级 1, 4, and 5 固定到它们自己的各个物理处理单元。

我知道 MPI 有很多种,语法也各不相同,但是我找不到任何东西可以实际规定各个等级的位置,而不仅仅是指定统一的 2 ppn 或类似的东西。但我必须想象这是可能的,我只是不确定它落在哪里,固定?捆绑?映射?等等

感谢您的帮助!

Open MPI 支持所谓的等级文件,这些文件指定每个等级到主机和该主机上的处理元素的映射。您可以在 man page for mpiexec 中看到更多内容(link 是 v2.1 的文档,例如 Ubuntu 18.04 LTS,但在新版本中也基本相同),但是假设你 运行 一台主机上的所有东西都至少有 4 CPU 个核心,rankfile 看起来像:

rank 0=hostname slot=0
rank 1=hostname slot=1
rank 2=hostname slot=0
rank 3=hostname slot=0
rank 4=hostname slot=2
rank 5=hostname slot=3

其中 hostname 是主机名,可能 localhost

这是一个例子:

首先,显示当前 MPI 等级的 CPU 亲和力的小实用程序脚本 show_affinity

#!/bin/bash

echo "$OMPI_COMM_WORLD_RANK: $(grep Cpus_allowed_list /proc/self/status)"

二、样例rankfile:

rank 0=localhost slot=0
rank 1=localhost slot=1
rank 2=localhost slot=0
rank 3=localhost slot=0
rank 4=localhost slot=2
rank 5=localhost slot=3

MPI 使用该排名文件 show_affinity 启动:

$ mpiexec -H localhost -rf rankfile ./show_affinity
0: Cpus_allowed_list:   0-1
1: Cpus_allowed_list:   2-3
2: Cpus_allowed_list:   0-1
3: Cpus_allowed_list:   0-1
4: Cpus_allowed_list:   4-5
5: Cpus_allowed_list:   6-7

CPU 启用了超线程,因此每个等级都绑定到两个硬件线程。