MPI_SEND pára de funcionar após MPI_BARRIER

Eu estou construindo um servidor web distribuído em C / MPI e parece que a comunicação ponto-a-ponto completamente pára de funcionar após o primeiro MPI_BARRIER no meu código. O código C padrão funciona depois da barreira, por isso sei que cada um dos fios passa pela barreira. A comunicação ponto-a-ponto também funciona bem antes da barreira. No entanto, quando copio e colo o mesmo código que funcionou na linha antes da barreira na linha após a barreira, ela para de funcionar completamente. O envio vai apenas esperar para sempre. Quando eu tento usar um ISEND, ele passa pela linha, mas a mensagem nunca é recebida. Eu estive pesquisando muito sobre esse problema e todo mundo que tem problemas com o MPI_BARRIER é informado de que a barreira funciona corretamente e seu código está errado, mas não posso, na minha vida, descobrir por que meu código está errado. O que poderia estar causando esse comportamento?

Aqui está um exemplo de programa que demonstra isso:

<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>

Mover os doisif declarações antes da barreira faz com que este programa seja executado corretamente.

EDITAR - Parece que a primeira comunicação, independentemente do tipo, funciona e todas as comunicações futuras falham. Isso é muito mais geral do que eu pensava no começo. Não importa se a primeira comunicação é uma barreira ou alguma outra mensagem, nenhuma comunicação futura funciona corretamente.

questionAnswers(1)

yourAnswerToTheQuestion