PDA

Visualizza la versione completa : [C] deadlock tra processi


HeroGian
21-05-2015, 13:06
Salve,Apro questo topic per chiedere un consiglio riguardante il seguente frammento di codice mpi:
#include #include #include #include #define PROC_MASTER 0typedef 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..

shodan
21-05-2015, 13:58
Codice illeggibile.

HeroGian
21-05-2015, 14:22
vero chiedo scusa, non so perch ma inserendo il codice nel tag code mi viene fuori cos, volevo editare il post ma non riesco..Comunque nel caso ho inserito il codice anche qui http://pastebin.com/K0GuRwDhvi ringrazio per eventuali risposte

oregon
21-05-2015, 14:28
This paste has been removed!

HeroGian
21-05-2015, 14:31
quello corretto questo: http://pastebin.com/K0GuRwDh scusate per i tremila post, ma non riesco ad editare..

LeleFT
21-05-2015, 15:58
Suggerimento... quando devi incollare del codice che proviene da un IDE (che, generalmente, ha anche della formattazione extra), fai un passaggio molto semplice: apri il Blocco Note, incolla il codice l dentro, poi selezionalo dal blocco note, copialo ed incollalo nel forum (in questo modo la formattazione dell'IDE viene rimossa ed il forum non si arrabbia).


Ciao. :ciauz:

Loading