Второй MPI_Send между родительским и дочерним процессами зависает - PullRequest
0 голосов
/ 17 апреля 2019

Я проверяю связь между родительским и дочерним процессами. Родитель порождает одного ребенка и два сообщения 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 в дочернем процессе, код работает и не зависает.

...