【发布时间】:2015-03-22 12:47:22
【问题描述】:
我有一个使用主进程和多个工作进程的 MPI 程序。我想让主进程单独在单个计算节点上运行,而工作进程在另一个节点上运行。工作进程应由套接字分配(例如,使用--map-by-socket 选项完成)。是否有任何选项可以将主进程和工作进程分配给不同的节点,或者通过查询等级来手动分配?
谢谢
【问题讨论】:
我有一个使用主进程和多个工作进程的 MPI 程序。我想让主进程单独在单个计算节点上运行,而工作进程在另一个节点上运行。工作进程应由套接字分配(例如,使用--map-by-socket 选项完成)。是否有任何选项可以将主进程和工作进程分配给不同的节点,或者通过查询等级来手动分配?
谢谢
【问题讨论】:
通过使用 rankfile 可以在绑定的同时将 rank 分配给主机。在您的情况下,假设每个节点都有两个 4 核 CPU,应该这样做(对于 Open MPI 1.7 和更高版本):
rank 0=host1 slots=0-7
rank 1=host2 slots=0:0-3
rank 2=host2 slots=1:0-3
对于旧版本,应该分别使用slots=0-3 和slots=4-7 而不是slots=0:0-3 和slots=1:0-3(假设内核是线性编号的,但情况可能并非如此)。然后通过--rankfile 选项将等级文件提供给mpiexec。它取代了主机文件。
另一种选择是启动 MIMD。在这种情况下,可以将 MPI 作业分成几个部分,并为每个部分提供不同的分布和绑定参数:
mpiexec -H host1 -n 1 --bind-to none ./program : \
-H host2 -n 2 --bind-to socket --map-by socket ./program
【讨论】:
据我所知,最简单的方法是使用 OpenMPI 的 --hostfile 选项。
如果您使用任何不错的批处理系统,您应该在一些简单的文件或环境变量中列出您的主机和插槽,您可以将其解析为主机文件。
如果您“手动”运行应用程序,您可以自己生成这样的列表。
【讨论】: