In questa lezione abbiamo dato un esempio di come si possa parallelizzare un algoritmo sia come "Task Parallelism" che come "Data Parallelism". L'algoritmo parallelizzato era appropriato all'ora prima di pranzo: la ricetta dei tortellini in brodo. La funzione riempimento_e_chiusura(&pasta); ha permesso di illustrare come sia possibile fare una data division o una pipeline.
Abbiamo inoltre mostrato il primo esempio di programma MPI con un semplice scambio di messaggi sincrono fra due processi.
Il codice presentato è stato:
int main(int argc, char* argv[])
{
int i, my_id, numprocs,length;
int sendb,receiveb,tag;
char name[BUFSIZ];
MPI_Comm com;
MPI_Status status;
com=MPI_COMM_WORLD;
MPI_Init(&argc, &argv) ; // Chiamata obbligatoria di inizializzazione
MPI_Comm_rank(MPI_COMM_WORLD, &my_id) ; // Ottiene l'identificativo del processo
MPI_Comm_size(MPI_COMM_WORLD, &numprocs) ; // Ottiene quanti processi sono attivi
MPI_Get_processor_name(name, &length); // Il nome del nodo dove il processo è in esecuzione
sendb=my_id;
tag=0;
switch (my_id) {
case 0:
MPI_Send(&sendb,1,MPI_INT,1,tag,MPI_COMM_WORLD);
MPI_Recv(&receiveb,1,MPI_INT,1,tag,com,&status);
break;
case 1:
MPI_Recv(&receiveb,1,MPI_INT,0,tag,com,&status);
MPI_Send(&sendb,1,MPI_INT,0,tag,MPI_COMM_WORLD);
break;
}
cout << "Sono il Processo "<< my_id << " e ho ricevuto " << receiveb << " da : " << status.MPI_SOURCE << endl;
MPI_Finalize(); // Chiusura di MPI.
/*
Esercizio:
Modificate il programma in modo da farlo eseguire da un numero PARI di processi.
I processi pari comunicano con quelli dispari e viceversa (0 <--> 1; 2 <--> 3.... ecc.)
*/
return 0;
}
Abbiamo inoltre mostrato il primo esempio di programma MPI con un semplice scambio di messaggi sincrono fra due processi.
Il codice presentato è stato:
int main(int argc, char* argv[])
{
int i, my_id, numprocs,length;
int sendb,receiveb,tag;
char name[BUFSIZ];
MPI_Comm com;
MPI_Status status;
com=MPI_COMM_WORLD;
MPI_Init(&argc, &argv) ; // Chiamata obbligatoria di inizializzazione
MPI_Comm_rank(MPI_COMM_WORLD, &my_id) ; // Ottiene l'identificativo del processo
MPI_Comm_size(MPI_COMM_WORLD, &numprocs) ; // Ottiene quanti processi sono attivi
MPI_Get_processor_name(name, &length); // Il nome del nodo dove il processo è in esecuzione
sendb=my_id;
tag=0;
switch (my_id) {
case 0:
MPI_Send(&sendb,1,MPI_INT,1,tag,MPI_COMM_WORLD);
MPI_Recv(&receiveb,1,MPI_INT,1,tag,com,&status);
break;
case 1:
MPI_Recv(&receiveb,1,MPI_INT,0,tag,com,&status);
MPI_Send(&sendb,1,MPI_INT,0,tag,MPI_COMM_WORLD);
break;
}
cout << "Sono il Processo "<< my_id << " e ho ricevuto " << receiveb << " da : " << status.MPI_SOURCE << endl;
MPI_Finalize(); // Chiusura di MPI.
/*
Esercizio:
Modificate il programma in modo da farlo eseguire da un numero PARI di processi.
I processi pari comunicano con quelli dispari e viceversa (0 <--> 1; 2 <--> 3.... ecc.)
*/
return 0;
}