Sto sviluppando un piccolo programma parallelo basato sulla libreria mpi.
Il funzionamento del programma è molto semplice: ho un certo numero di processi (in questo caso 4) ognuno esegue un ciclo di un certo numero di iterazioni, ad ogni iterazione ogni processo genera un numero casuale.
Tramite la funzione Allreduce determino il valore minimo generato e trasmetto in broadcast a tutti gli altri processi l'id del processo che ha generato il minimo, tramite operazione MINLOC.
Quando uno dei processi termina prima (in questo caso il processo 1 termina dopo 5 iterazioni), gli altri processi finiscono in deadlock e il programma si blocca.
Codice: Seleziona tutto
#include <mpi.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define PROC_MASTER 0
typedef struct double_int{
double val;
int proc_id;
}double_int;
int main(int argc, char **argv)
{
int n_proc, proc_id;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &n_proc);
MPI_Comm_rank(MPI_COMM_WORLD, &proc_id);
double_int num;
double_int num_min;
srand(time(NULL));
int i;
for(i = 0; i < 10; i++){
if(i == 5 && proc_id == 1){
MPI_Finalize();
return 0;
}
if(proc_id == PROC_MASTER){
num.val = rand()/(double)RAND_MAX;
num.proc_id = proc_id;
}
else if(proc_id == 1){
num.val = rand()/(double)RAND_MAX;
num.proc_id = proc_id;
}
else if(proc_id == 2){
num.val = rand()/(double)RAND_MAX;
num.proc_id = proc_id;
}
else if(proc_id == 3){
num.val = rand()/(double)RAND_MAX;
num.proc_id = proc_id;
}
MPI_Allreduce(&num, &num_min, 1, MPI_DOUBLE_INT, MPI_MINLOC, MPI_COMM_WORLD);
}
MPI_Finalize();
exit(EXIT_SUCCESS);
}
