如何配置MPI实现处理器分组,使不同程序运行在指定数量进程上
解决方案
方案1:直接使用MPI原生MPMD模式(无需修改代码,推荐)
MPI标准支持多程序多数据(MPMD)启动模式,可以直接为不同程序分配指定数量的进程,自动按顺序分配进程编号。
你场景对应的启动命令如下:
mpirun -np 2 ./b.out : -np 2 ./c.out
该命令启动的4个进程中,进程0、1归属./b.out程序,进程2、3归属./c.out程序,完全匹配你需要的分配规则。
方案2:从a.out主程序调度拆分(需要修改代码,适合需预处理的场景)
如果你需要先在a.out中执行全局初始化逻辑再拆分运行不同程序,可以按如下步骤修改代码:
- 初始化MPI后获取全局进程编号
world_rank - 按编号拆分通信子,不同分组的进程通过系统调用替换执行对应的程序
C语言示例代码片段:
#include <mpi.h> #include <unistd.h> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int world_rank; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); if (world_rank < 2) { // 前2个进程替换为b.out char* args[] = {"./b.out", NULL}; execv(args[0], args); } else { // 后2个进程替换为c.out char* args[] = {"./c.out", NULL}; execv(args[0], args); } MPI_Finalize(); return 0; }
编译后仍然可以用你原来的mpirun -np 4 ./a.out命令启动,效果和方案1一致。
注意事项
- 主流MPI实现(Open MPI、MPICH、Intel MPI)均原生支持MPMD模式,方案1适配绝大多数场景
- 如果需要在分组后保留组内通信能力,拆分通信子时可以保留生成的子通信子用于组内MPI调用
内容的提问来源于stack exchange,提问作者d-man
相关产品推荐
相关产品推荐

