2012-07-08 14 views
10

Cosa succede se si utilizza uno dei metodi di comunicazione MPI per far comunicare una classifica con se stessa? Esiste un comportamento ben definito (ad esempio garantito per avere successo o fallire), o dipende da casualità/altre influenze incontrollabili, se il programma continuerà a funzionare o no?Il comportamento della comunicazione MPI di un grado con se stesso è ben definito?

Un esempio potrebbe essere un codice fluidodinamico, in cui ciascun rango determina quali celle della griglia devono essere inviate ai ranghi adiacenti per creare l'alone necessario per lo stencil computazionale. Se la simulazione viene avviata solo su un valore, ci sarà l'invio/ricezione non bloccante del grado 0 con se stesso (invio di informazioni di lunghezza pari a 0).

risposta

12

Mentre è possibile evitare l'auto-messaggistica come da risposta di suszterpatt, l'auto-messaggistica funzionerà e fa parte dello standard MPI. C'è anche un comunicatore di convenienza predefinito MPI_COMM_SELF. Finché le chiamate di invio/ricezione non causano deadlock (ad esempio, vengono utilizzate chiamate non bloccanti), l'invio a self va bene. Ovviamente, i buffer di invio e ricezione non dovrebbero sovrapporsi.

Nota che con OpenMPI è necessario enable the self BTL.


Fonte: MPI 1.1 Section 3.2.4

Source = destinazione è consentita, vale a dire, un processo può inviare un messaggio a se stesso. (Tuttavia, non è sicuro farlo con le operazioni di invio e ricezione bloccate sopra descritte, poiché ciò potrebbe portare a deadlock.) Sezione 3.5. Semantica della comunicazione point-to-point.

+0

Questa è una buona notizia. Puoi indicare il capitolo dell'attuale standard MPI che formula la politica send-to-self? L'ho cercato personalmente e non ho trovato nulla. –

+0

Ho aggiunto la fonte alla risposta. –

1

In una modalità standard di invio (ad esempio MPI_Send()), è compito dell'implementazione MPI determinare se memorizzare il messaggio nel buffer oppure no. È ragionevole presumere che qualsiasi implementazione, o almeno le più popolari, riconoscerà un send to self e deciderà di bufferizzare il messaggio. L'esecuzione continuerà e, una volta effettuata la chiamata di ricezione corrispondente, il messaggio verrà letto dal buffer. Se si desidera essere assolutamente certi, è possibile utilizzare MPI_Bsend(), ma potrebbe essere responsabilità dell'utente gestire il buffer tramite MPI_Buffer_attach() e MPI_Buffer_detach().

Tuttavia, la soluzione ideale per il tuo problema specifico è l'utilizzo di MPI_PROC_NULL nell'argomento di origine/destinazione delle chiamate di invio/ricezione, che causerà l'interruzione della comunicazione da parte di Send e Recv e la restituzione al più presto.

Problemi correlati