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++; } }
3 Réponses :
Vous créez un nouveau message d'envoi, libérant-le avant de terminer, puis d'appeler recevoir: 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);
Tout simplement MPI_WAIT (& REQ) CODE> Après
MPI_Recv () code>.
MPI_Barrier () CODE> est une overcilleuse et ne garantit même pas que le message sera envoyé.
MPI_Request_Free () code> n'est pas nécessaire ici.
En effet, c'est vrai. Changer la réponse.
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. p>
Je ne sais pas pourquoi il y a une boucle en premier lieu, mais j'espère que votre problème est corrigé. P>