【问题标题】:Assign MPI Processes to Nodes将 MPI 进程分配给节点
【发布时间】:2015-03-22 12:47:22
【问题描述】:

我有一个使用主进程和多个工作进程的 MPI 程序。我想让主进程单独在单个计算节点上运行,而工作进程在另一个节点上运行。工作进程应由套接字分配(例如,使用--map-by-socket 选项完成)。是否有任何选项可以将主进程和工作进程分配给不同的节点,或者通过查询等级来手动分配?

谢谢

【问题讨论】:

    标签: mpi openmpi


    【解决方案1】:

    通过使用 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-3slots=4-7 而不是slots=0:0-3slots=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
    

    【讨论】:

    • 我正在将作业提交到集群。我必须解析 node_file 还是有更简单的方法来查找主机的名称?
    • 集群有什么批处理系统?
    【解决方案2】:

    据我所知,最简单的方法是使用 OpenMPI 的 --hostfile 选项。

    如果您使用任何不错的批处理系统,您应该在一些简单的文件或环境变量中列出您的主机和插槽,您可以将其解析为主机文件。

    如果您“手动”运行应用程序,您可以自己生成这样的列表。

    【讨论】: