PPR 7 CALCUL DE MINIMUM PAR LES ALGORITHMES ECHO ET PHASE L'algorithme ECHO Le but de ce TME est d'utilser MPI pour mettre en œuvre un calcul de minimum réparti sur une topologie quelconque où toutes les liaisons sont bidirectionnelles. Comme pour le TME précédent, il est nécessaire de simuler cette topologie. Le programme principal est identique à celui proposé dans le TME précédent. La fonction simulateur correspondant à la topologie ci-dessous : 1 2 3 5 4 6 est donnée par : #define NB_SITE 6 #define TAGINIT 0 void simulateur() { MPI_Status status; /* nb_voisins[i] est le nombre de voisins du site i */ int nb_voisins[NB_SITE+1] = {-1, 3, 3, 2, 3, 5, 2}; int min_local[NB_SITE+1] = {-1, 12, 11, 8, 14, 5, 17}; /* liste des voisins */ int voisins[NB_SITE+1][5] = {{-1, -1, -1, -1, -1}, {2, 5, 3, -1, -1}, {4, 1, 5, -1, -1}, {1, 5, -1, -1, -1}, {6, 2, 5, -1, -1}, {1, 2, 6, 4, 3}, {4, 5, -1, -1, -1}}; int i; for(i=1; i<=NB_SITE; i++){ MPI_Send(&nb_voisins[i], 1, MPI_INT, i, TAGINIT, MPI_COMM_WORLD); MPI_Send(voisins[i], nb_voisins[i], MPI_INT, i, TAGINIT, MPI_COMM_WORLD); MPI_Send(&min_local[i], 1, MPI_INT, i, TAGINIT, MPI_COMM_WORLD); } } On veut effectuer le calcul au moyen de l'algorithme ECHO dont on rappelle le principe : p initiateur Sp : /* spontanément, une fois */ pour tout q ∈ Voisp faire p non initiateur /* ∀ q ∈ Voisp : Recup[q] */ envoyer 〈 x 〉 à perep; envoyer 〈 x 〉 à q; Rp : /* un message 〈 x 〉 arrive de q */ recevoir 〈 x 〉; Recup[q] = vrai; /* un message 〈 x 〉 arrive de q */ recevoir 〈 x 〉; Recup[q] = vrai; si (perep == nil) { perep = q; pour tout r ∈ Voisp \ {q} faire envoyer 〈 x 〉 à r; } Dp : /* ∀ q ∈ Voisp : Recup[q] */ décision Les fonctions main et simulateur sont disponibles dans le fichier : /Infos/lmd/2004/master/ue/ppr-2005fev/mpi_echo.c sous MPI la fonction calcul_min(rang) qui réalise un calcul de 1 - Implémentez minimum réparti en appliquant l'algorithme ECHO. On supposera que l'initiateur est le site 1. 2 - Appliquez votre programme sur la topologie fournie en exemple, en exécutant tous les processus sur des machines différentes. L'algorithme PHASE On veut maintenant réaliser un calcul de minimum sur un réseau orienté de topologie quelconque. On va pour cela utiliser l'algorithme PHASE. On utilise toujours le même principe : le processus 0 envoie aux processus 1 à n des informations sur la topologie. Comme le réseau est orienté, les informations fournies distinguent maintenant pour chaque noeud les voisins entrants et les voisins sortants. La fonction simulateur correspondant à la topologie ci-dessous : 1 3 1 2 4 2 4 6 7 9 5 6 est donnée par : #define TAGINIT 0 #define #define #define #define NB_SITE 6 DIAMETRE /* !!!!! valeur a initialiser !!!!! */ DEG_IN_MAX 2 /* le max des degres entrants des noeuds */ DEG_OUT_MAX 2 /* le max des degres sortants des noeuds */ void simulateur() { MPI_Status status; /* nb_voisins_in[i] est le nombre de voisins entrants du site i */ /* nb_voisins_out[i] est le nombre de voisins sortants du site i */ int nb_voisins_in[NB_SITE+1] = {-1, 2, 1, 1, 2, 1, 1}; int nb_voisins_out[NB_SITE+1] = {-1, 2, 1, 1, 1, 2, 1}; int min_local[NB_SITE+1] = {-1, 4, 7, 1, 6, 2, 9}; /* liste des voisins entrants */ int voisins_in[NB_SITE+1][2] = {{-1, -1}, {4, 5}, {1, -1}, {1, -1}, {3, 5}, {6, -1}, {2, -1}}; /* liste des voisins sortants */ int voisins_out[NB_SITE+1][2] = {{-1, -1}, {2, 3}, {6, -1}, {4, -1}, {1, -1}, {1, 4}, {5,-1}}; int i; for(i=1; i<=NB_SITE; i++){ MPI_Send(&nb_voisins_in[i], 1, MPI_INT, i, TAGINIT, MPI_COMM_WORLD); MPI_Send(&nb_voisins_out[i], 1, MPI_INT, i, TAGINIT, MPI_COMM_WORLD); MPI_Send(voisins_in[i], nb_voisins_in[i], MPI_INT, i, TAGINIT, MPI_COMM_WORLD); MPI_Send(voisins_out[i], nb_voisins_out[i], MPI_INT, i, TAGINIT, MPI_COMM_WORLD); MPI_Send(&min_local[i], 1, MPI_INT, i, TAGINIT, MPI_COMM_WORLD); } } Le programme principal est identique à celui proposé dans le TME précédent. Les fonctions main et simulateur sont disponibles dans le fichier : /Infos/lmd/2004/master/ue/ppr-2005fev/mpi_phase.c sous MPI la fonction calcul_min(rang) qui réalise un calcul de 1 - Implémentez minimum réparti en appliquant l'algorithme PHASE. 2 - Appliquez votre programme sur la topologie fournie en exemple, en exécutant tous les processus sur des machines différentes.