MPI RECV d'une source inconnue
-
30-09-2019 - |
Question
Je suis en œuvre dans MPI un programme dans lequel le processus principal (avec rang = 0) devrait être en mesure de recevoir les demandes des autres processus qui demandent des valeurs des variables qui ne sont connues par la racine. Si je fais MPI_Recv (...) par le rang 0, je dois préciser le rang du processus qui envoie la demande à la racine, mais je ne peux pas contrôler que, puisque les processus ne sont pas exécutés dans l'ordre 1,2,3 , .... Comment le nombre de processus d'émission puis-je recevoir la demande de tout rang et utiliser pour envoyer les informations nécessaires?
La solution
Cela suppose que vous utilisez C. Il y a des concepts similaires en C ++ et Fortran. Vous spécifiez simplement MPI_ANY_SOURCE
comme source dans le MPI_recv()
. Le struct d'état contient la source réelle du message.
int buf[32];
MPI_Status status;
// receive message from any source
MPI_recv(buf, 32, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
int replybuf[];
// send reply back to sender of the message received above
MPI_send(buf, 32, MPI_INT, status.MPI_SOURCE, tag, MPI_COMM_WORLD);
Autres conseils
MPI_ANY_SOURCE est la réponse évidente.
Cependant, si tous les rangs vont envoyer une demande de rang 0, MPI_Irecv combiné avec MPI_Testall pourrait aussi fonctionner comme un modèle. Cela permettra aux appels MPI_Send à exécuter dans un ordre quelconque, et les informations peuvent être reçues et traitées dans l'ordre que les appels MPI_Irecv sont adaptés.