Funzioni bloccanti e non bloccanti
Nei nostri test tutte le funzioni Send sono non bloccanti, mentre
le funzioni di ricezione possono essere sia bloccanti che non. Ad esempio
una coppia ricezione-spedizione con primitive non bloccanti sara' cosi' :
MPI_Irecv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),MPI_COMM_WORLD,&msg_id);
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Wait(&(msg_id),&status);
cioe' il processo avvia la ricezione del messaggio, ma non si blocca, quindi spedisce il suo messaggio ed infine con la MPI_Wait attende che la
ricezione sia completata.
Nel caso bloccante la ricezione- spedizione e' la seguente :
MPI_Send(sbuffer,len,MPI_BYTE,to,MSG_TAG(i),MPI_COMM_WORLD);
MPI_Recv(rbuffer,len,MPI_BYTE,recv_from,MSG_TAG(i),MPI_COMM_WORLD,&status);
cioe' il processo prima spedisce e poi attende il messaggio dall'altro processo
con la MPI_Recv bloccante.
Le primitive non bloccanti sono utili quando e' possibile sovrapporre computazione
alle operazioni di ricezione e spedizione. Pero' in questi test si vuole solamente
misurare le prestazioni di comunicazione, non e' necessario fare altre computazioni,
quindi i risultati dovrebbero essere gli stessi sia con le bloccanti che non
le non bloccanti. In ogni caso abbiamo eseguito entrambi i tipi per verificare
la eventuale presenza di particolari ottimizzazioni a livello kernel per
le non bloccanti.
Come vedremo (I Risultati ,
Conclusioni) non abbiamo rilevato alcuna differenza
tra bloccanti e non.