COMUNICAZIONI PUNTO A PUNTO
Quando vengono usate le funzioni di comunicazione punto
a punto, devono essere comprese sia le caratteristiche
delle chiamate bloccanti
e di quelle non bloccanti,
sia lo possibilità di generare punti
morti all'interno dell'esecuzione.
Quando un singolo messaggio viene spedito dal
processo 0 (ad esempio) al processo 1 esistono diversi passi che caratterizzano
la comunicazione. Questi passaggi avvengono in modo temporalmente ordinato:
-
il dato è copiato in una variabile dal processo
0
-
il processo 0 chiama una delle funzioni di
send dell'MPI
-
il sistema operativo copia il dato dalla variabile
ad una zona di memoria apposita che chiameremo variabile di sistema
-
il sistema operativo spedisce il dato presente nella
variabile di sistema al processo 1
Cio' che segue accade invece durante il processo
di ricezione:
-
il processo 1 chiama una delle funzioni di ricezione
MPI
-
il sistema operativo riceve il dato dal processore
0 e lo copia in una variabile di sistema
-
il sistema operativo copia il dato dalla variabile
di sistema alla variabile del processo1
-
il processo 1 usa il dato presente nella variabile
Quando un processo spedisce un dato, il processo
non deve o non dovrebbe riutilizzare la variabile relativa fino a che il
sistema operativo non ha copiato il dato dalla variabile alla variabile
di sistema; allo stesso modo, quando un processo riceve un dato,
questo non e' pronto fino a che il sistema operativo non completa la
copiatura dalla variabile di sistema alla variabile del processo.
Con l'MPI si hanno due tipi di comunicazioni
punto a punto: bloccanti
e non bloccanti.
Quando si usano funzioni di comunicazioni bloccanti
come MPI_SEND
ed MPI_RECV,
il processo non uscirà dalla chiamata di queste funzioni fino a
che non sarà stata liberata la memoria relativa alla variabile di
sistema (perchè il messaggio è stato spedito o perchè
è stato copiato nella variabile del processo); alternativamente
se vengono usate le funzioni di comunicazioni non bloccanti quali MPI_ISEND
ed MPI_IRECV,
il processo completa immediatamente la chiamata non appena quindi la copiatura
verso o dalla variabile di sistema è incominciata. Per essere
sicuri di aver completato la chiamata è necessario introdurre quindi
una nuova chiamata con la funzione MPI_WAIT.
Il vantaggio di poter usare le funzioni di comunicazione
non bloccanti risiede nella possibilità di inserire delle istruzioni
tra le chiamate MPI_ISEND
ed MPI_IRECV
e le chiamate della funzione MPI_WAIT
e
quindi di eseguire ulteriori parti di codice mentre il processo di copiatura
della variabile di sistema si completa; chiaramente senza poter utilizzare
in queste istruzioni le variabili oggetto del messaggio!