Pagina 1 di 1

[C - MPI] Deadlock con chiamata collettiva

Inviato: giovedì 21 maggio 2015, 17:16
da HeroGian
Salve a tutti,
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);
}
Questo è il codice del programma, vi sarei grato se potreste darmi un consiglio.. purtroppo non ho idee sul perchè si comporti in questo modo

Re: [C - MPI] Deadlock con chiamata collettiva

Inviato: giovedì 21 maggio 2015, 22:37
da cortinico
Ciao HeroGian,

Allora premetto che non sono un esperto di MPI ma cerco di darti una risposta.
Credo che il sistema ti vada in deadlock in quanto il processo con proc_id == 1 termina prima e la chiamata a MPI_Allreduce è bloccante, cioè gli altri processi non procedono fin quando tutti non sono arrivati a quella chiamata (in sostanza credo che sia uguale a come se ci fosse una Barrier davanti alla AllReduce).
http://stackoverflow.com/questions/9284 ... al-barrier

Per fare quello che vuoi tu forse dovresti lavorare con i communicators e creare due gruppi distinti che lavorano in maniera distinta:
http://static.msi.umn.edu/tutorial/scic ... cator.html

Non so se ti sono stato di aiuto, speriamo risponda qualcuno più espero :)

Re: [C - MPI] Deadlock con chiamata collettiva

Inviato: venerdì 22 maggio 2015, 11:01
da HeroGian
Grazie mille per la risposta!
Effettivamente anche a me era venuto il dubbio che andasse in deadlock per quel motivo.. ma più che altro credevo che una volta terminato un processo, la funzione MPI_Finalize eliminasse il riferimento al processo terminato dal comunicatore globale, ma a quanto pare è un'operazione che deve svolgere manualmente il programmatore xD
Adesso provo a creare un comunicatore a parte e rimuovere un processo quando termina, e vedo se si risolve il problema :)