2013-07-10 22 views
18

So che MPI_Send() è una chiamata di blocco, che attende finché non è sicuro modificare il buffer dell'applicazione per il riutilizzo. Per fare in modo che la chiamata di invio sia sincrona (dovrebbe esserci un handshake con il ricevitore), dobbiamo usare MPI_Ssend(). Voglio sapere la differenza tra i due. Supponiamo di dover inviare una quantità fissa di byte tra i processi, quale si suppone richieda più tempo?
Con me il codice funziona bene con la chiamata MPI_Send() ma attende indefinitamente per MPI_Send(). Quali potrebbero essere le possibili ragioni?differenza tra MPI_Send() e MPI_Send()?

E la cosa più importante è che sono abbastanza sicuro che i dati vengano ricevuti nel processo di ricezione quando si utilizza MPI_Send(), quindi questa inferenza non porta nulla a favore dell'attesa per l'handshake quando si utilizza MPI_Ssend().

Oppure posso concludere: con MPI_Send() è possibile inviare i dati all'autoprocesso ma non è possibile utilizzare MPI_Ssend()?

risposta

28

C'è una piccola ma importante differenza tra i due (lo puoi trovare nel documento MPI Standard nella Sezione 3.4). Con un normale MPI_SEND, l'implementazione ritorna all'applicazione quando il buffer è disponibile per il riutilizzo. Questo potrebbe essere prima che il processo di ricezione abbia effettivamente pubblicato la ricezione. Ad esempio, potrebbe essere quando un piccolo messaggio è stato copiato in un buffer interno e il buffer dell'applicazione non è più necessario. Tuttavia, per i messaggi di grandi dimensioni che potrebbero non essere memorizzati internamente, la chiamata potrebbe non essere restituita finché non è stato inviato un numero sufficiente di messaggi al processo remoto che il buffer non è più necessario.

La differenza tra questo e MPI_SSEND è che quest'ultimo sarà sempre attendere fino a quando la ricezione è stata pubblicata sul lato ricevente. Anche se il messaggio è piccolo e può essere memorizzato internamente, attenderà ancora che il messaggio abbia iniziato a essere ricevuto dall'altro lato.

MPI_SSEND è un modo per garantire che entrambi i processi abbiano raggiunto un determinato punto della loro esecuzione senza dover eseguire uno MPI_BARRIER, ad esempio. Se la tua richiesta è inviata e ricevuta dallo stesso rango, non è sicuro fare MPI_SEND O MPI_SSEND, come uno dei blocco indefinitamente. Invece, dovresti usare MPI_ISEND e MPI_IRECV in modo che le chiamate tornino immediatamente e l'invio/ricezione effettivo possa essere fatto allo stesso tempo (nella chiamata a MPI_WAITALL.

+0

E la cosa più importante è, sono abbastanza sicuro che i dati vengono ricevuti nel processo di ricezione quando si utilizza MPI_Send(), quindi questa inferenza non porta nulla a favore dell'attesa dell'handshake quando si utilizza MPI_Send(). Il mio codice funziona bene con MPI_Send() ma attende indefinitamente con MPI_Send(). pensare a tutti i possibili motivi? –

+0

Dipenderà interamente dal codice. Se per qualche ragione il tuo codice non raggiunge la chiamata corrispondente a 'MPI_RECV' senza progressione da' MPI_SEND' per qualche motivo, ciò potrebbe causare il deadlock, ma non c'è modo di dirlo senza vedere il codice. –

+0

http://stackoverflow.com/questions/ 17820445/openmpi-hello-world-on-cluster puoi rispondere per favore? –