假设我有一个主程序,它基本上是一个1级的mpi,它使用MPI生成以生成5个辅助程序。
现在,如果我使用以下命令执行我的主服务器
aprun -n 1 -N 1 master
生成后的等级总数为6。但是,所有6个等级是否都将在同一节点上运行?无论如何,我可以在三个节点之间分配6个吗?
我可以精确复制一份主流程和5个工作流程。
答案 0 :(得分:3)
Cray MPI直到最近才支持MPI_Comm_spawn,并且它为生成的MPI作业管理资源的解决方案是唯一的。使用aprun
启动占位符作业,以管理用于托管生成的作业的资源,即将托管生成的MPI等级的核心/节点。类似于存储池,由占位符作业管理的资源集称为“等级池”。这是设置和使用排名池的方法:
int main(int argc, char **argv) {
MPI_Init(&argc, &argv);
/* Name this rank pool "all_nodes", which will be
* used by MPI_Comm_spawn to identify it. */
MPIX_Comm_rankpool(MPI_COMM_WORLD, "all_nodes", /* 60 seconds timeout */ 60);
MPI_Finalize();
}
[ ... code goes here ... ]
MPI_Info_create(&info);
/* key = "rankpool", value = "all_nodes" */
MPI_Info_set(info, "rankpool", "all_nodes");
MPI_Comm_spawn("master", argv, num_ranks,
info, 0, comm, &child_comm,
MPI_ERRCODES_IGNORE);
[ ... more code ... ]
如果要在三个节点上分配6个等级,则可以使用aprun -n 6 -N 2
启动等级池,这样您就可以拥有6个等级,每个节点2个等级。
如果要为生成的等级使用更特定的布局,可以对传递给MPIX_Comm_rankpool
的传播者中的等级进行重新排序,以获得这种效果。例如,如果您的主作业生成了各个子作业,每个子作业具有4个等级,并且您希望每个子作业的等级均匀分布在节点上,则可以通过以下方式在MPI_COMM_WORLD
中对等级进行重新排序:
MPI_COMM_WOLRD
--------------
node 1 node 2 node 3 node 4
ranks 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
对此:
reordered_comm
--------------
node 1 node 2 node 3 node 4
ranks 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 15
MPIX_Comm_rankpool
将尝试为每个子作业分配一组连续的等级,因此,子作业通常在每个节点上具有一个等级。
有关这一切如何工作的更多详细信息,请参见Cray的动态流程管理whitepaper。