MPI_SEND funktioniert nach MPI_BARRIER nicht mehr

Ich baue einen verteilten Webserver in C / MPI auf und es scheint, dass die Punkt-zu-Punkt-Kommunikation nach dem ersten MPI_BARRIER in meinem Code nicht mehr funktioniert. Standard-C-Code funktioniert nach der Barriere, daher weiß ich, dass jeder der Threads es durch die Barriere schafft. Die Punkt-zu-Punkt-Kommunikation funktioniert auch problemlos vor der Barriere. Wenn ich jedoch denselben Code, der die Linie vor der Barriere bearbeitet hat, in die Linie nach der Barriere kopiere, funktioniert er nicht mehr. Der SEND wird nur für immer warten. Wenn ich stattdessen ein ISEND verwende, wird es durch die Leitung geleitet, aber die Nachricht wird nie empfangen. Ich habe dieses Problem viel gegoogelt und allen, die Probleme mit MPI_BARRIER haben, wurde gesagt, dass die Barriere korrekt funktioniert und ihr Code falsch ist, aber ich kann für mein Leben nicht herausfinden, warum mein Code falsch ist. Was könnte dieses Verhalten verursachen?

Hier ist ein Beispielprogramm, das dies demonstriert:

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

Die zwei bewegenif Anweisungen vor der Barriere bewirken, dass dieses Programm korrekt ausgeführt wird.

BEARBEITEN - Es scheint, dass die erste Kommunikation unabhängig vom Typ funktioniert und alle zukünftigen Kommunikationen fehlschlagen. Das ist viel allgemeiner, als ich zuerst dachte. Es ist egal, ob die erste Kommunikation eine Barriere oder eine andere Nachricht ist, keine zukünftige Kommunikation funktioniert ordnungsgemäß.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage