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