Corsi tenuti da Giuseppe Levi
  • Home
  • Informatica per Fisici
    • Lezioni Video
    • Riferimenti Utili
    • Esempi discussi nel corso
    • Blog Lezioni
    • Trasparenze
    • Esami
  • Linguaggi Visuali
    • Blog Lezioni Fisica e LabView
  • CORSO HPC
    • Risorse utili
    • Blog Lezioni
    • Game of Life
    • Insieme Mandelbrot
    • Come lanciare un job sul cluster
  • Servizi Web Utili
  • Contatti
  • Appunti di Matematica Vedica Elementare

Lezione di Lunedì 14 Marzo 2011

14/3/2011

0 Comments

 
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.
0 Comments



Leave a Reply.

    Author

    Giuseppe Levi
    Blog delle lezioni del corso di PPSD 2012.

    Archives

    January 2015
    May 2012
    April 2012
    March 2012
    May 2011
    April 2011
    March 2011

    Categories

    All
    Cluster
    Mpi
    Openmp

    RSS Feed

Powered by Create your own unique website with customizable templates.