C 父进程和子进程之间的第二次MPI_发送挂起

C 父进程和子进程之间的第二次MPI_发送挂起,c,mpi,send,spawn,recv,C,Mpi,Send,Spawn,Recv,我正在测试父进程和子进程之间的通信。父级生成一个子级,MPI_发送两条消息。子进程从父进程相应地执行两次MPI_Recv。根据我运行代码的位置,它要么工作(MacOS),要么在第二次MPI\u发送后挂起(Ubuntu) 任何帮助都将不胜感激。测试代码如下所示: master.c: #include <mpi.h> #include <stdio.h> int main(int argc, char *argv[]) { MPI_Comm children;

我正在测试父进程和子进程之间的通信。父级生成一个子级,MPI_发送两条消息。子进程从父进程相应地执行两次MPI_Recv。根据我运行代码的位置,它要么工作(MacOS),要么在第二次
MPI\u发送后挂起(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; 
}
#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; 
} 
我在开放MPI版本4.0.0、3.0.0和3.1.3上对此进行了测试。代码是用mpicc master.c-o master、mpicc worker.c-o worker编译的,并用mpirun-n1 master运行

所需的输出将是:

Sent: 777
Received: 777
Sent: 111
Received: 111
但是,当MPI挂起时,代码将打印:

Sent: 777
Received: 777

可能值得一提的是,如果我将两个
MPI\u Send
之间的一个
MPI\u Recv
放入父进程,并在子进程中放入相应的
MPI\u Send
,则代码工作且不会挂起。

尝试选择一个TCP接口。例如,
mpirun--mca-pml-ob1--mca-btl-tcp,self--mca-btl-u-tcp\u如果包含192.168.0.0/24-np 1./master
起作用,也就是说,为MPI通信设置一个设备解决了问题(对于我来说
mpirun--mca-btl-u-tcp\u如果包含127.0.0.1/131-np 1 master
已经完成了)。谢谢尝试选择一个TCP接口。例如,
mpirun--mca-pml-ob1--mca-btl-tcp,self--mca-btl-u-tcp\u如果包含192.168.0.0/24-np 1./master
起作用,也就是说,为MPI通信设置一个设备解决了问题(对于我来说
mpirun--mca-btl-u-tcp\u如果包含127.0.0.1/131-np 1 master
已经完成了)。谢谢