Open MPI中MPI_Comm_spawn与MPI_Init触发段错误问题求助
MPI_Comm_spawn子进程MPI_Init触发段错误问题
我有两个程序文件:parent.cpp和child.cpp,其中parent.cpp通过MPI_Comm_spawn调用child.cpp生成的可执行文件启动子进程,操作流程及遇到的问题如下:
1. 编译命令
>> mpicc -o parent parent.cpp >> mpicc -o parent child.cpp
2. 运行命令及现象
执行mpirun -np 1 parent时,程序输出5次"Child spawned"后触发段错误,错误信息:
... Signal: segmentation fault (11) Signal code: Address not mapped (1) ...
但执行mpirun -np 2 parent时,父进程可成功启动子进程并正常终止。
3. 问题定位
通过printf语句排查,段错误发生在child.cpp的MPI_Init(...)调用处。
4. 环境及已尝试解决方式
使用Open MPI 4.0.1版本,已查阅谷歌、ChatGPT、BARD及相关Open MPI GitHub Issue,但未找到有效解决方案,请求帮助。
完整代码
parent.cpp
#include <iostream> #include <mpi.h> int main() { int i, a, b, nprocs, nWorker, myrank, flag, ierr; MPI_Request req; MPI_Status status; MPI_Comm parent, children, intercomm; char worker_program[100] = "child"; MPI_Init(NULL, NULL); MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); nWorker = 5; MPI_Comm_spawn("child", MPI_ARGV_NULL, nWorker, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm, MPI_ERRCODES_IGNORE); if (intercomm == MPI_COMM_NULL) printf("children spawn failed\n"); if (myrank == 0) { int a = 101; for (i = 0; i < nWorker; i++) { MPI_Send(&a, 1, MPI_INT, i, 0, intercomm); printf("Message sent\n"); } MPI_Comm_free(&intercomm); } MPI_Finalize(); return 0; }
child.cpp
#include <iostream> #include <mpi.h> int main() { int i, a, b, nprocs, nWorker, myrank, flag, ierr; MPI_Status status; MPI_Comm parent; std::cout << "Child spawned\n"; MPI_Init(NULL, NULL); std::cout << "Child MPI_Init()\n"; MPI_Comm_size(MPI_COMM_WORLD, &nprocs); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_get_parent(&parent); MPI_Recv(&a, 1, MPI_INT, 0, 0, parent, &status); MPI_Finalize(); return 0; }
内容的提问来源于stack exchange,提问作者San Kim
相关产品推荐
相关产品推荐

