Cray MPI 直到最近才支持 MPI_Comm_spawn,它为生成的 MPI 作业管理资源的解决方案是独一无二的。使用aprun 启动占位符作业以管理用于托管衍生作业的资源,即将托管衍生 MPI 等级的核心/节点。由占位符作业管理的资源集称为“等级池”,类似于内存池。以下是设置和使用排名池的方法:
rankpool.c
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();
}
spawning_app.c
[ ... 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。