[C - MPI] Deadlock con chiamata collettiva

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
HeroGian
Prode Principiante
Messaggi: 2
Iscrizione: giovedì 21 maggio 2015, 17:07
Desktop: kde-plasma
Distribuzione: Debian GNU/Linux 7.8 (wheezy) x86_6
Sesso: Maschile

[C - MPI] Deadlock con chiamata collettiva

Messaggio 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
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: [C - MPI] Deadlock con chiamata collettiva

Messaggio 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 :)
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
HeroGian
Prode Principiante
Messaggi: 2
Iscrizione: giovedì 21 maggio 2015, 17:07
Desktop: kde-plasma
Distribuzione: Debian GNU/Linux 7.8 (wheezy) x86_6
Sesso: Maschile

Re: [C - MPI] Deadlock con chiamata collettiva

Messaggio 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 :)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti