我正在测试父级和子级进程之间的通信。父母产生一个孩子,MPI_Send
产生两个消息。子进程相应地两次来自父进程的MPI_Recv
。根据运行代码的位置,它可以工作(MacOS)还是在第二个MPI_Send
之后挂起(Ubuntu)。
任何帮助将不胜感激。测试代码如下:
master.c
:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
MPI_Comm children;
MPI_Init(&argc, &argv);
MPI_Comm_spawn("worker", MPI_ARGV_NULL, 1,
MPI_INFO_NULL, 0, MPI_COMM_SELF, &children,
MPI_ERRCODES_IGNORE);
int send = 777;
MPI_Send(&send, 1, MPI_INT, 0, 0, children);
printf("Sent: %d\n", send);
send = 111;
MPI_Send(&send, 1, MPI_INT, 0, 0, children);
printf("Sent: %d\n", send);
MPI_Finalize();
return 0;
}
worker.c
:
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
MPI_Comm parent;
MPI_Init(&argc, &argv);
MPI_Comm_get_parent(&parent);
int recv;
MPI_Recv(&recv, 1, MPI_INT, 0, 0, parent, MPI_STATUS_IGNORE);
printf("Received: %d\n", recv);
MPI_Recv(&recv, 1, MPI_INT, 0, 0, parent, MPI_STATUS_IGNORE);
printf("Received: %d\n", recv);
MPI_Finalize();
return 0;
}
我在Open MPI版本:4.0.0、3.0.0和3.1.3上对此进行了测试。该代码使用mpicc master.c -o master
,mpicc worker.c -o worker
进行编译,并使用mpirun -n 1 master
运行。
所需的输出将是:
Sent: 777
Received: 777
Sent: 111
Received: 111
但是,当MPI挂起时,代码将显示:
Sent: 777
Received: 777
可能值得一提的是,如果我在父进程中放入两个MPI_Recv
之间的一个MPI_Send
,并在子进程中放入一个对应的MPI_Send
,则该代码有效且不起作用挂。