2014-11-12 21 views
5

mi sono leggermente confuso riguardo al concetto di sincrono - asincrono nel contesto di bloccare & operazioni non bloccanti (in OpenMPI) da qui:immidiate vs comunicazione sincrona in openmpi

  • link 1 : MPI_Isend è non necessariamente asincrono (in modo che possa sincrona?)

  • link 2 : The MPI_Isend() e MPI_Irecv() sono la comunicazione pri ASYNCHRONOUS miti di MPI.

ho già superato il precedente di sincronizzazione - asincrono - blocco - domande non bloccanti su StackOverflow (asynchronous vs non-blocking), ma erano di nessun aiuto per me. Per quanto ne so:

così come & perché MPI_ISEND potrebbe bloccare (link 1), così come non bloccante (link 2)? cioè, che cosa si intende per asincrono & sincrono MPI_ISEND qui? nasce

confusione simili riguardo MPI_SSEND & MPI_ISSEND, poiché la S in MPI_ S SEND significa sincrono (o blocco) e: -

  • MPI_SSEND: blocco di trasmissione sincrona fino alla ricezione dei dati processo remoto & ack è ricevuto dal mittente,
  • MPI_ISSEND: significa sincro sincrono se ND

anche la mmediate I è non-blocking, Quindi, come si può MPI_ IS SEND essere S ynchronous & ritorno ho ubito?

Immagino che sia necessaria maggiore chiarezza in sincrono & nel contesto del blocco & non bloccante comunicazione OpenMPI. Un esempio pratico o analogia a questo riguardo sarà molto utile.

+0

Stavo cercando di capire la stessa cosa, e ho finito per scrivere esempi per ciascuna modalità di invio, qui: https://gist.github.com/deborasetton/9f8597d85a4d314ace17. A volte è utile guardare il codice reale per vedere le differenze. – dsetton

risposta

9

Esiste una distinzione tra il ritorno delle chiamate di funzione MPI (blocco rispetto a non blocco) e quando l'operazione corrispondente viene completata (standard, sincrono, bufferizzato, pronto).

Chiamate senza blocco MPI_I... restituiscono immediatamente, indipendentemente dal completamento dell'operazione. L'operazione continua in background o in modo asincrono. Le chiamate di blocco non vengono restituite a meno che l'operazione non sia stata completata. Le operazioni non bloccanti sono rappresentate dall'handle che può essere utilizzato per eseguire un'attesa di blocco (MPI_WAIT) o un test non bloccante (MPI_TEST) per il completamento.

Il completamento di un'operazione significa che il buffer di dati fornito non è più accessibile da MPI e potrebbe quindi essere riutilizzato. I buffer di invio diventano liberi per essere riutilizzati sia dopo che il messaggio è stato inserito nella sua interezza sulla rete (compreso il caso in cui parte del messaggio potrebbe essere ancora memorizzato dal dispositivo di rete e/o dal driver), oppure è stato memorizzato in un buffer dal Implementazione MPI. Il caso bufferizzato non richiede che il ricevitore abbia registrato un'operazione di ricezione corrispondente e quindi non sia sincronizzato - la ricezione potrebbe essere postata in un momento successivo. L'invio sincrono di blocco MPI_SSEND non ritorna a meno che il destinatario non abbia inviato un'operazione di ricezione, quindi sincronizza entrambi i ranghi. L'invio sincrono non bloccante MPI_ISSEND restituisce immediatamente, ma l'operazione asincrona (in background) non verrà completata a meno che il destinatario non abbia inviato una ricezione corrispondente.

Un'operazione di blocco è equivalente a una non bloccante immediatamente seguita da un'attesa. Ad esempio:

MPI_Ssend(buf, len, MPI_TYPE, dest, tag, MPI_COMM_WORLD); 

è equivalente a:

MPI_Request req; 
MPI_Status status; 

MPI_Issend(buf, len, MPI_TYPE, dest, tag, MPI_COMM_WORLD, &req); 
MPI_Wait(&req, &status); 

La mandata standard (MPI_SEND/MPI_ISEND) completa dopo che il messaggio è stato costruito e il buffer di dati fornito come primo parametro può essere riutilizzato . Non c'è garanzia di sincronizzazione: il messaggio potrebbe essere bufferizzato localmente o in remoto. Con la maggior parte delle implementazioni, di solito c'è una soglia di dimensione: i messaggi fino a quella dimensione vengono bufferizzati mentre i messaggi più lunghi vengono inviati in modo sincrono. La soglia è dipendente dall'implementazione.

Le mandate bufferizzate memorizzano sempre i messaggi in un buffer intermedio fornito dall'utente, eseguendo essenzialmente un'operazione di copia di memoria più complessa. La differenza tra il blocco (MPI_BSEND) e la versione non bloccante (MPI_IBSEND) è che il primo non viene restituito prima che tutti i dati del messaggio siano stati memorizzati nel buffer.

L'invio pronto è un tipo di operazione molto speciale. Viene completato correttamente solo se il rango di destinazione ha già pubblicato l'operazione di ricezione entro il momento in cui il mittente effettua la chiamata di invio. Potrebbe ridurre la latenza delle comunicazioni eliminando la necessità di eseguire una sorta di stretta di mano.

+0

Come follow-up, cosa significa 'MPI_Send' dato che hai già spiegato' MPI_SSend' e 'MPI_ISend'? – baibo

+0

'MPI_Send' è la cosiddetta operazione _standard_ send - o bufferizza il messaggio o lo invia nello stesso modo di' MPI_Ssend'. Diversamente da 'MPI_Ssend', non garantisce che il ricevitore abbia iniziato a ricevere il messaggio, solo che il messaggio è entrato nella libreria MPI e che il buffer di dati può essere ulteriormente riutilizzato. –

+0

Grazie mille :) – baibo