0
votes

MPI Anneau Deadlock de la communication

Tout en expérimentant un projet d'école MPI l'a écrit et se demandant pourquoi cela ne fonctionne pas: Ce que je veux faire, c'est simplement transmettre tous les points en points au processus suivant (processus avec Rank Procurant + 1) et recevoir ceux de la précédente. Ensuite, faites la même chose qui reçoit de celui qui envoie à l'itération précédente et à envoyer à la suivante (processID + 2 et ainsi de suite). Bien qu'il s'exécute parfaitement pour 2 processus, lorsque je dois le gérer avec 4,8, .. Processus, il empêche la première itération.

if(processId!=noProcesses-1)
    sending_to=processId+1;
else
    sending_to=0;

if(processId!=0)
    receiving_from=processId-1;
else
    receiving_from=noProcesses-1;

for(l=1;l<noProcesses;l++)
// ring communication with non-blocking methods
{
    printf("PROCESS %d: Iteration %d: sending_to=%d/receiving_from=%d\n",processId,l,sending_to,receiving_from);

    MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
    MPI_Request_free(&req);

    MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

    receiving_from=sending_to;

    if(sending_to==noProcesses-1) {
        sending_to=0;
    } else {
        sending_to++;
    }
}


0 commentaires

3 Réponses :


2
votes

Vous créez un nouveau message d'envoi, libérant-le avant de terminer, puis d'appeler recevoir: xxx pré>

Vous devez libérer la demande après l'envoi du message: P>

MPI_Isend(points, size*DIMS, MPI_FLOAT, sending_to, 0, MPI_COMM_WORLD, &req);
MPI_Recv(query_points, size*DIMS, MPI_FLOAT, receiving_from, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
MPI_Wait(&req);


2 commentaires

Tout simplement MPI_WAIT (& REQ) Après MPI_Recv () . MPI_Barrier () est une overcilleuse et ne garantit même pas que le message sera envoyé. MPI_Request_Free () n'est pas nécessaire ici.


En effet, c'est vrai. Changer la réponse.



0
votes

Je suis désolé les gars, devaient la poster pour découvrir ce qui n'allait pas après. Les identifiants de processus dans la réception_from et l'envoi_to sont mélangés depuis la deuxième itération.


0 commentaires

-1
votes

Je ne sais pas pourquoi il y a une boucle en premier lieu, mais j'espère que votre problème est corrigé.


0 commentaires