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:
  1. il dato è copiato in una variabile dal processo 0
  2. il processo 0  chiama una delle funzioni di send dell'MPI
  3. il sistema operativo copia il dato dalla variabile ad una zona di memoria apposita che chiameremo variabile di sistema
  4. il sistema operativo spedisce il dato presente nella variabile di sistema al processo 1
Cio' che segue accade invece durante il processo di ricezione:
  1. il processo 1 chiama una delle funzioni di ricezione MPI
  2. il sistema operativo riceve il dato dal processore 0 e lo copia in una variabile di sistema
  3. il sistema operativo copia il dato dalla variabile di sistema alla variabile del processo1
  4. 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!