2013-06-12 5 views
5

Per quanto riguarda MPI_Isend, lo standard MPI dice "Una chiamata di invio non bloccante indica che il sistema può iniziare a copiare i dati dal buffer di invio. Il mittente non deve accedere a nessuna parte del buffer di invio dopo che è stata chiamata un'operazione di invio non bloccante, fino a quando l'invio completa." (http://www.mpi-forum.org/docs/mpi-11-html/node46.html)Ok per chiamare MPI_Isend più volte su un buffer?

Fa riferimento al buffer di invio in un'altra chiamata di invio ok oppure è incluso in "accesso a qualsiasi parte del buffer di invio"?

In altre parole, il seguente codice C per il mittente è corretto?

MPI_Request req[2]; 
MPI_Status statuses[2]; 
... 
MPI_Isend(buf, type, count, dest0, tag, comm, &req[0]); 
MPI_Isend(buf, type, count, dest1, tag, comm, &req[1]); 
MPI_Waitall(2, req, statuses); 
+0

Sto indovinando qui, che è il motivo per cui questo non sta entrando come una risposta completa, che ciò che davvero non vuoi fare è modificare il contenuto del buffer sorgente o leggere il contenuto del buffer di destinazione prima del l'invio è completo. Quindi per me, quello che stai facendo sembra OK. Ma per favore prova. Non credermi sulla parola. –

+0

@ bob.sacamento Certo, è vero. E so che il mio codice sarebbe corretto per l'implementazione MPI che sto usando (guardò il codice sorgente), ma mi piacerebbe sapere se questo è corretto secondo lo standard, cioè lavorare su ogni corretta implementazione di MPI. –

risposta

2

Lo standard MPI consente questo tipo di utilizzo.

Se ci sono più di una "manciata" di ranghi che hanno bisogno dello stesso buffer, o se questo patter di comunicazione verrà ripetuto più di una "manciata" di volte ... quindi creando una comunicazione con i ranghi rilevanti, e usare MPI_Bcast sarebbe preferibile.

EDIT:

Per chiarire la mia risposta. Lo standard MPI 2.0 ha specificamente proibito questo tipo di utilizzo. La restrizione era di ospitare Fortran. Lo standard MPI 2.1 o 2.2 includeva un "chiarimento" che consentiva il riutilizzo di un buffer di invio in più ISends. Vedere la Sezione 16.2.2 dello standard MPI 2.2 per ulteriori informazioni.

+1

Grazie. Quella sezione di MPI 2.2 Standard era illuminante. –

1

Ho appena consultato il MPI 3.0 Standard e hanno trovato le seguenti informazioni:

Una chiamata send non bloccante indica che il sistema può iniziare a copiare i dati dal buffer di invio . Il mittente non deve modificare alcuna parte del buffer di invio dopo che è stata chiamata un'operazione di invio non bloccante , fino al completamento dell'invio.

Tuttavia, molto di recente partecipato ad un tutorial su MPI 3.0 data da alcuni degli sviluppatori della norma ed è stato detto che, a seconda della implementazione MPI (MPICH, LAM, ecc), può essere pericoloso per accedere a un buffer utilizzato in una chiamata di comunicazione non bloccante poiché il buffer può essere modificato dalla procedura di Isend prima che l'invio sia completato. In altre parole, potrebbe non essere garantito che il buffer nel secondo MPI_Isend sia uguale al buffer nella prima trasmissione. Per comprenderlo di sicuro, vorrei consultare il codice sorgente dell'implementazione.

+0

Hmmmm, questo è quello di cui avevo paura. Lo standard specifica che i buffer di invio al momento del completamento dell'invio devono essere "restituiti" all'applicazione non modificati, o che possono essere modificati? Non riesco a vedere come una implementazione ragionevole potrebbe trarre beneficio modificando effettivamente un buffer di invio. –

+1

Non è che l'implementazione debba necessariamente modificare un buffer, ma è necessario assicurarsi che il buffer non venga modificato mentre viene copiato/inviato. –

Problemi correlati