父进程和子进程之间的第二个MPI_Send挂起

时间:2019-04-17 15:59:25

标签: c mpi send spawn recv

我正在测试父级和子级进程之间的通信。父母产生一个孩子,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 mastermpicc 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,则该代码有效且不起作用挂。

0 个答案:

没有答案