MPI_SEND przestaje działać po MPI_BARRIER

Buduję rozproszony serwer WWW w C / MPI i wygląda na to, że komunikacja punkt-punkt całkowicie przestaje działać po pierwszym MPI_BARRIER w moim kodzie. Standardowy kod C działa za barierą, więc wiem, że każdy z wątków przechodzi przez barierę. Komunikacja punkt-punkt działa również dobrze przed barierą. Jednak gdy skopiuję i wkleję ten sam kod, który działał na linii przed barierą, do linii za barierą przestaje działać całkowicie. SEND będzie po prostu czekać wiecznie. Gdy zamiast tego próbuję użyć ISEND, przechodzi przez linię, ale wiadomość nigdy nie jest odbierana. Często googluję ten problem i każdemu, kto ma problemy z MPI_BARRIER, powiedziano, że bariera działa poprawnie, a ich kod jest nieprawidłowy, ale nie mogę zrozumieć, dlaczego mój kod jest błędny. Co może powodować to zachowanie?

Oto przykładowy program, który to pokazuje:

<code>#include <mpi.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
  int procID;
  int val;
  MPI_Status status;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &procID);
  MPI_Barrier(MPI_COMM_WORLD);

  if (procID == 0)
  {
    val = 4;
    printf("Before send\n");
    MPI_Send(&val, 1, MPI_INT, 1, 4, MPI_COMM_WORLD);
    printf("after send\n");
  }

  if (procID == 1)
  {
    val = 1;
    printf("before: val = %d\n", val);
    MPI_Recv(&val, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
    printf("after: val = %d\n", val);
  }

  MPI_Finalize();
  return 0;
}
</code>

Przesuwanie dwóchif instrukcje przed barierą powodują, że program działa poprawnie.

EDYTOWAĆ - Wydaje się, że pierwsza komunikacja, niezależnie od typu, działa i wszystkie przyszłe komunikaty zawodzą. To jest o wiele bardziej ogólne, co początkowo myślałem. Nie ma znaczenia, czy pierwsza komunikacja jest barierą, czy inną wiadomością, żadna przyszła komunikacja nie działa prawidłowo.

questionAnswers(1)

yourAnswerToTheQuestion