PPR 7 CALCUL DE MINIMUM PAR LES ALGORITHMES ECHO ET

publicité
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.
Téléchargement