2012-06-04 9 views
12

Quando si utilizza MPI_Isend, il parametro MPI_Request può essere un puntatore nullo (quando al mittente non interessa il messaggio dopo l'invio)?Parametro richiesta MPI_Isend

+1

Provalo? Dovrebbe dare un segfault se non può. – aztaroth

+0

Ok, ho provato e la risposta è no: MPI controlla che il puntatore della richiesta non sia nullo e altrimenti stampa un errore. – sunmat

risposta

23

Risposta breve no - il parametro di gestione richiesta non può essere NULL.

MPI_Isend() avvia un'operazione di invio asincrona. Tutte le operazioni asincrone sono dati una maniglia richiesta che deve essere agito in un secondo momento in uno dei seguenti modi:

  • blocco e attendere che l'operazione per finire con MPI_Wait() e gli amici
  • prova l'operazione per il completamento con MPI_Test() e gli amici fino a quando il test risulta positivo
  • libera la maniglia con MPI_Request_free()

Entrambe le funzioni di attesa e la prova libera la richiesta una volta che è stata completata. Puoi anche liberarlo immediatamente dopo che è stato restituito da MPI_Isend(). Questo non annulla l'operazione, ma contrassegna la richiesta di cancellazione non appena è finita. Non sarai in grado di ottenere lo stato dell'operazione di invio.

Se non vi interessa circa l'esito dell'operazione asincrona (ad esempio, stato di completamento, messaggio di ricevere lo status, il codice di errore, ecc), la cosa giusta da fare è la seguente:

MPI_Request req; 
... 
MPI_Isend(..., &req); 
MPI_Request_free(&req); 
... 

Caveat : funziona per mandate asincrone poiché è possibile escogitare un altro metodo per verificare che l'operazione di invio sia stata completata, ad es il processo di destinazione potrebbe rispondere dopo aver ricevuto il messaggio. Ma non si dovrebbe mai liberare una richiesta di ricezione asincrona e si dovrebbe attendere o testare per il completamento, in quanto non ci sarà modo di sapere quando l'operazione è stata completata.

+2

Questo è corretto. Volevo solo aggiungere che c'è un motivo per completare un 'MPI_Request' in qualche modo. È possibile che un'implementazione MPI differisca il lavoro effettivo di invio di un messaggio fino alla chiamata 'MPI_Wait' (o equivalente). Se una richiesta viene avviata e mai completata, è possibile che il messaggio non venga mai inviato. –

+0

Grazie! Ho ampliato la parola "risultato" per riflettere meglio ciò che avevo in mente. –

Problemi correlati