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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top