[C] deadlock tra processi
Salve,
Apro questo topic per chiedere un consiglio riguardante il seguente frammento di codice mpi:
In pratica il funzionamento del programmino è il seguente:
Ho 4 processi che eseguono tutti quanti un ciclo iterativo, ad ogni iterazione ogni processo genera un numero random; successivamente tramite la funzione Allreduce trasferisco in broadcast l'id del processo che ha generato il valore minimo (tramite l'operazione MPI_MINLOC); infine, tramite la funzione Bcast, il processo che ha generato il valore minimo deve passare "qualcosa" a tutti gli altri processi..(in questo caso il vettore x).
La cosa che non riesco a capire è il fatto che se termino prima degli altri un processo (es dopo 20 iterazioni), tutti gli altri processi finiscono in deadlock..
Apro questo topic per chiedere un consiglio riguardante il seguente frammento di codice mpi:
#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; double *x = (double *)malloc(10*sizeof(double)); 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 < 1000; i++){ if(i == 20 && proc_id == 2){ MPI_Finalize(); exit(EXIT_SUCCESS); } 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); if(proc_id == PROC_MASTER){ printf("iter %d: ricevuto f = %f dal processo %d\n", i, num_min.val, num_min.proc_id); } MPI_Bcast(x, 10, MPI_DOUBLE, num_min.proc_id, MPI_COMM_WORLD); } MPI_Finalize(); exit(EXIT_SUCCESS); }
In pratica il funzionamento del programmino è il seguente:
Ho 4 processi che eseguono tutti quanti un ciclo iterativo, ad ogni iterazione ogni processo genera un numero random; successivamente tramite la funzione Allreduce trasferisco in broadcast l'id del processo che ha generato il valore minimo (tramite l'operazione MPI_MINLOC); infine, tramite la funzione Bcast, il processo che ha generato il valore minimo deve passare "qualcosa" a tutti gli altri processi..(in questo caso il vettore x).
La cosa che non riesco a capire è il fatto che se termino prima degli altri un processo (es dopo 20 iterazioni), tutti gli altri processi finiscono in deadlock..
Risposte
forse potrebbe essere dovuto al fatto che quando un processo termina, resta comunque l'id di tale processo all'interno del comunicatore globale.. e quindi la chiamata collettiva tenta di inviare i dati anche il processo terminato?