Domanda

Io sono attuando in MPI un programma in cui il processo principale (con rango = 0) dovrebbe essere in grado di ricevere richieste da altri processi che chiedono per i valori delle variabili che sono conosciuti solo dal root. Se faccio MPI_Recv (...) dalla posizione in classifica 0, devo specificare il grado del processo che invia la richiesta alla radice, ma non posso controllare che dal momento che i processi non vengono eseguite nell'ordine 1,2,3 , .... Come posso ricevere la richiesta di qualunque grado e utilizzare il numero del processo che emette per inviare le informazioni necessarie?

È stato utile?

Soluzione

Ciò presuppone che si sta utilizzando C. Ci sono concetti simili in C ++ e Fortran. Si sarebbe solo specificare MPI_ANY_SOURCE come origine nella MPI_recv(). La struct stato contiene la vera fonte del messaggio.

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

Altri suggerimenti

MPI_ANY_SOURCE è la risposta ovvia.

Tuttavia, se tutti i ranghi saranno inviando una richiesta al rango 0, poi MPI_Irecv combinato con MPI_Testall potrebbe anche funzionare come un modello. Ciò consentirà alle chiamate MPI_Send da eseguire in qualsiasi ordine, e le informazioni possono essere ricevuti ed elaborati nell'ordine in cui le chiamate MPI_Irecv sono abbinati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top