A.LEGRAND
Y.ROBERT
int MPI_Comm_split ( MPI_Comm comm, int color, int key, MPI_Comm *newcomm )
Les boucles 1 et 2 de cet
algorithme sont parallèles. La boucle de la ligne 3
correspond à une opération de réduction (qui peut s'effectuer par
exemple à l'aide d'un arbre) et réduit le parallélisme. On
séquentialise généralement une partie de ces boucles afin d'ordonner
et de régulariser les calculs (éviter des migrations de données
excessives et désordonnées), de simplifier le contrôle et surtout
d'adapter la granularité de la machine cible.
Il est donc préférable de permuter les boucles pour arriver à
l'Algorithme 2 et d'effectuer alors la boucle externe
(ligne 1) séquentiellement et les boucles internes
(lignes 2 et 3) en parallèle. Si
chaque est alloué à une unité de calcul fixe, alors les
et les
doivent circuler entre chaque étape de
calcul, mais cela ne nuit pas au parallélisme et permet un
recouvrement potentiel du calcul et des communications (même si le
premier TD a démontré la difficulté de ce recouvrement avec MPI).
Dans le cas où l'on dispose de processeurs identiques
interconnectés en grille (voir Figure 1) : chaque
processeur est responsable de sous-matrices de taille
de
,
et
.
L'Algorithme 2 se déroule donc en
étapes et à
l'étape
, la
colonne de
et la
ligne de
sont diffusées horizontalement (pour la
colonne) et verticalement (pour la ligne). Chaque processeur reçoit
donc un fragment de colonne de
et un fragment de ligne de
de
tailles respectivement
et
et met à jour la partie de
dont il est responsable (voir Figure 1).
Une solution est disponible à la même adresse dans matmult.c.