Ancora MPI. Abbiamo illustrato il send bufferizzato (orribile parolaccia ! trovatemi qualcosa di meglio in Italiano !)Prima si riserva il buffer:
int bsiz=(1+MPI_BSEND_OVERHEAD)*sizeof(int);
int buffer[1+MPI_BSEND_OVERHEAD];
Poi lo si aggancia a MPI e lo si usa:
MPI_Buffer_attach(&buffer,bsiz);
switch (my_id)
{ case 0: dest=1; break; case 1: dest=0; break; }
MPI_Bsend(&sendb,1,MPI_INT,dest,tag,MPI_COMM_WORLD); MPI_Recv(&receiveb,1,MPI_INT,dest,tag,com,&status);Alla fine lo si rilascia: MPI_Buffer_detach(&buffer,&bsiz);
Inoltre abbiamo presentato la funzione sendrecv che permette di accorpare in una singola chiamata sincrona quindi bloccante le operazioni di send e receive. In questo modo il programma viene semplificato in:
switch (my_id) { case 0:dest=1; break;case 1:dest=0;break;}
MPI_Sendrecv(&sendb,1,MPI_INT,dest,tag,&receiveb,1,MPI_INT,dest,tag,com,&status);
Fino a questo punto abbiamo trattato di messaggi che contengono solo dati contigui in memoria ma se volessimo trasmettere p.es. una colonna di una matrice di un vettore da un processo a un altro non rientriamo più in questo caso.
MPI risolve questo problema permettendoci di definire nuovi TIPI di dati. Il caso più semplice è quello di dati non contigui ma equispazitati e si risolve usanto la chiamata MPI_Type_vector.
Se nel precedente programma i buffer di send e receive divengono delle matrici:
int sendb[10][10],receiveb[10][10];
Con le righe:
MPI_Datatype colonna;
MPI_Type_vector(10,1,10,MPI_INT,&colonna);
MPI_Type_commit(&colonna);
definisco il nuovo tipo di dato "colonna" fatto di 10 elementi di 1 MPI_INT spaziati in memoria di 10*sizeof(MPI_INT) che poi può essere usato nelle operazioni di scambio di messaggi. Per Esempio:
MPI_Sendrecv(&sendb[0][0],1,colonna,dest,tag,&sendb[0][9],1,colonna,dest,tag,com,&status);
Notate nella riga di esempio la diversa origine e destinazione. In pratica ogno processo invia la colonna 0 nella colonna 9 dell'altro.
Siamo ora pronti per affrontare il metodo più diffuso per lo scambio di dati fra processi, quello delle ghost cells.
I file sorgente degli esempi discussi in questa lezione:
Esempio Bsend
Esempio Sendrecv . E Sendreceive replace.
Esempio di scambio di vettori colonna.
int bsiz=(1+MPI_BSEND_OVERHEAD)*sizeof(int);
int buffer[1+MPI_BSEND_OVERHEAD];
Poi lo si aggancia a MPI e lo si usa:
MPI_Buffer_attach(&buffer,bsiz);
switch (my_id)
{ case 0: dest=1; break; case 1: dest=0; break; }
MPI_Bsend(&sendb,1,MPI_INT,dest,tag,MPI_COMM_WORLD); MPI_Recv(&receiveb,1,MPI_INT,dest,tag,com,&status);Alla fine lo si rilascia: MPI_Buffer_detach(&buffer,&bsiz);
Inoltre abbiamo presentato la funzione sendrecv che permette di accorpare in una singola chiamata sincrona quindi bloccante le operazioni di send e receive. In questo modo il programma viene semplificato in:
switch (my_id) { case 0:dest=1; break;case 1:dest=0;break;}
MPI_Sendrecv(&sendb,1,MPI_INT,dest,tag,&receiveb,1,MPI_INT,dest,tag,com,&status);
Fino a questo punto abbiamo trattato di messaggi che contengono solo dati contigui in memoria ma se volessimo trasmettere p.es. una colonna di una matrice di un vettore da un processo a un altro non rientriamo più in questo caso.
MPI risolve questo problema permettendoci di definire nuovi TIPI di dati. Il caso più semplice è quello di dati non contigui ma equispazitati e si risolve usanto la chiamata MPI_Type_vector.
Se nel precedente programma i buffer di send e receive divengono delle matrici:
int sendb[10][10],receiveb[10][10];
Con le righe:
MPI_Datatype colonna;
MPI_Type_vector(10,1,10,MPI_INT,&colonna);
MPI_Type_commit(&colonna);
definisco il nuovo tipo di dato "colonna" fatto di 10 elementi di 1 MPI_INT spaziati in memoria di 10*sizeof(MPI_INT) che poi può essere usato nelle operazioni di scambio di messaggi. Per Esempio:
MPI_Sendrecv(&sendb[0][0],1,colonna,dest,tag,&sendb[0][9],1,colonna,dest,tag,com,&status);
Notate nella riga di esempio la diversa origine e destinazione. In pratica ogno processo invia la colonna 0 nella colonna 9 dell'altro.
Siamo ora pronti per affrontare il metodo più diffuso per lo scambio di dati fra processi, quello delle ghost cells.
I file sorgente degli esempi discussi in questa lezione:
Esempio Bsend
Esempio Sendrecv . E Sendreceive replace.
Esempio di scambio di vettori colonna.