MPI_SEND, MPI_ISEND, MPI_RECV, MPI_IRECV,
MPI_WAIT
Di seguito mostro la sintassi delle funzioni di comunicazione punto a punto:
MPI_SEND(variabile,
quanti, tipo, destinazione, tag, comunicatore, ierr)
MPI_ISEND(variabile,
quanti, tipo, destinazione, tag, comunicatore, richiesta, ierr)
MPI_RECV(variabile,
quanti, tipo, sorgente, tag, comunicatore, stato, ierr)
MPI_IRECV(variabile,
quanti, tipo, sorgente, tag, comunicatore, richiesta, ierr)
MPI_WAIT(richiesta,
stato, ierr)
dove:
-
variabile
si riferisce all'indirizzo iniziale di memoria di una serie di dati contigui
(al limite solo uno) che devono essere spediti o ricevuti
-
quanti
il quantitativo di questi dati (è una variabile intera)
-
tipo
il loro tipo
-
destinazione
è l'intero che caratterizza il processo che deve ricevere il messaggio
-
mentre sorgente
è l'intero che caratterizza il processo che ha spedito il messaggio;
può essere usata la variabile MPI_ANY_SOURCE
che indica al processo ricevente che può accettare il messaggio
da qualunque sorgente
-
tag
è un qualunque intero (tra 0 e 2 elevato alla 32) che serve ad identificare
il messaggio; può essere usata la variabile MPI MPI_ANY_TAG
che permette di non caratterizzare il messaggio con un particolare tag
-
comunicatore
è il gruppo a cui appartiene il processo destinazione (o sorgente)
a cui spedire (o da cui si riceve) il messaggio
-
stato
vettore (da dichiarare con la riga di codice: dimension
nome_stato(MPI_STATUS_SIZE)) contenente
informazioni sui dati ricevuti come chi li ha spediti e il loro tag; queste
informazioni possono essere rilevanti nel caso si siano utilizzate le variabili
MPI: MPI_ANY_SOURCE,
MPI_ANY_TAG
-
richiesta è
una variabile intera che identifica la richiesta di una operazione non
bloccante e che permette quindi alla funzione MPI_WAIT
di bloccare il processo fino a che la copiatura dei dati da o verso la
memoria di sistema non è stata completata
-
ierr
intero di controllo
Le funzioni bloccanti e non bloccanti possono essere
tranquillamente usate anche in modo incrociato come vedremo ad esempio
nella descrizione delle comunicazioni unidirezionali.
Il processo ricevente va incontro ad un errore
(buffer overflow) se gli viene spedito un quantitativo di dati superiore
a quello che si aspetta, mentre non protesta se il quantitativo è
inferiore alle aspettative.
Qui di seguito si riporta un esempio di utilizzo
delle funzioni bloccanti:
program esempio6
include 'mpif.h'
integer nprocs, mype, ierr, itag, imesg
integer istatus
dimension istatus(MPI_STATUS_SIZE)
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, mype, ierr)
itag = 1
imesg = mype
if(mype.eq.1) then
call MPI_SEND(imesg,1,MPI_INTEGER,0,itag,MPI_COMM_WORLD,ierr)
elseif(mype.eq.0) then
call MPI_RECV(imesg,1,MPI_INTEGER,1,itag,MPI_COMM_WORLD,
+
istatus,ierr)
write(6,*) 'messaggio = ', imesg
endif
call MPI_FINALIZE(ierr)
end |