• Aucun résultat trouvé

8.5 Factorisation numérique

8.5.5 Ordonnancement des calculs

Nous étudions dans cette section les méthodes utilisées pour calculer un placement des blocs de la matrice sur les processeurs. C’est ce placement, réalisé avant la factori-sation numérique, qui dirigera ensuite l’ordonnancement des calculs comme défini dans la section 8.5.3. L’objectif est donc de calculer un placement des données conduisant à un ordonnancement des calculs minimisant le temps d’exécution. Pour cela un bon com-promis entre équilibrage de la charge de calcul et minimisation des communications est recherché.

Plusieurs heuristiques différentes existent pour réaliser ce placement [51, 102, 113, 60, 39]. Nous présentons dans la suite deux méthodes pour calculer ce placement des blocs, méthodes proposées et plus largement détaillées dans l’article [34].

2. Notons qu’en MPI, la fonction MPI_PROBE permet à la réception, de récupérer la taille d’un message arrivant sur le processeur avant d’avoir réservé l’espace mémoire. Il n’est donc pas nécessaire d’envoyer explicitement les tailles des blocs communiqués.

Algorithme 11 : Factorisation fan-in avec partitionnement bidimensionnel. Entrée : id, le numéro du processeur

Entrée : N le nombre de colonnes (i.e. de panneaux) de la matrice par blocsL

Entrée : L

i;j les blocs de la matrice (i.e. les blocs non nuls et locaux au nœudid)

Entrée : ow ner (i;j), le processeur sur lequel le blocL

i;j est placé

Entrée : gr oup(j), l’ensemble des processeurs contenant des blocs de la colonnej

Entrée : nmod(i;j), le nombre de mises à jour sur le blocL i;j

1: {Étape locale}

2: pourK =1jusqu’àN faire

3: siL

K est un panneau local (i.e.#gr oup(k)=1) alors 4: factoriser le panneauL

K

5: pour toutI;J 2Str u t(L ;K

)tel queI J faire

6: bmod send(K ;I;J)

7: sinon siid2gr oup(K)alors

8: réaliser toutes les opérations possibles sur les blocs locaux du panneauK

9: initialiser les ensemblesw ait(K)etfinished(K)

10: {Étape distribuée} 11: boucler

12: tant que l’ensemblequeueest non vide faire 13: retirer un blocL

I;J de l’ensemblequeue

14: l ast bl o k op(I;J)

15: si il n’y a plus de bloc à recevoir du réseau alors

16: fin de l’algorithme 17: ATTENDRE un blocL

I;J du réseau 18: siL

I;J est un bloc de mise à jours alors

19: accumulation du bloc reçu sur le bloc localL I;J

20: soustraire ànmod(I;J)le nombre de contributions apportées par le bloc 21: sinmod(I;J)=0alors

22: l ast bl o k op(I;J)

23: sinon {L

I;J est un bloc du facteur de Cholesky} 24: siI =Jalors 25: diag(J)=1 26: pour toutI 0 2w ait(J)faire 27: bdiv(I 0 ;J) 28: sinon

29: insérerIdans l’ensemblefinished(J)

30: pour toutI 0 2finished(J)faire 31: bmod send(J;I;I 0 )

Factorisation numérique 8.5

Algorithme 12 : Fonctionbmod send.

Entrée : Les indicesK ;I etJ

1: bmod(K ;I;J) 2: nmod(I;J)=nmod(I;J) 1 3: sinmod(I;J)=0alors 4: siid=ow ner (I;J)alors 5: siI =J oudiag(J)=1alors 6: insérerL

I;J dans l’ensemblequeue

7: sinon

8: insérerI dans l’ensemblew ait(J)

9: sinon

10: ENVOYER L

I;J sur le processeurow ner (I;J)

Algorithme 13 : Fonctionl ast bl o k op.

Entrée : Les indicesI etJ

1: siI =K alors

2: calculer en place le facteur de Cholesky du blocL K;K

3: diag(K)=1

4: DIFFUSER L

K;K à tous les processeurs dansgr oup(K)

5: pour toutI 0 2w ait(K)faire 6: bdiv(I 0 ;K) 7: insérerI 0

dans l’ensemblefinished(K)

8: pour toutJ 2finished(K)faire

9: bmod send(K ;I

0 ;J)

10: sinon sidiag(K)=1alors

11: bdiv(I;K)

12: DIFFUSER L

I;K à tous les processeurs dansgr oup(K)

13: insérerI dans l’ensemblefinished(K)

14: pour toutJ 2finished(K)faire

15: bmod send(K ;I;J)

16: sinon

8.5.5.1 Placement sur une grille

L’algorithme proposé par Geist et Ng [51] est utilisé pour le placement des sous arbres locaux. Cet algorithme prend en entrée une liste de sous-arbres, initialisée avec la racine de l’arbre d’élimination, et calcule un placement de ces sous arbres sur les processeurs par un algorithme de bin-packing (i.e. chacun des sous arbres, pris dans l’ordre décroisant de leurs poids, est placé sur le processeur le moins chargé). Si le déséquilibre de charge est trop important, le sous arbre de plus grand poids est retiré de l’arbre et remplacé par ses fils.

Le placement des blocs des panneaux distribués est ensuite réalisé en suivant l’idée de Rothberg et Gupta [112] utilisée pour la méthode fan-out. Lespprocesseurs sont dis-posés sur une grillep

l

 p

et chaque bloc d’une colonne (respectivement ligne) de la matrice par bloc est placé sur une colonne (respectivement ligne) de la grille de proces-seurs. L’équilibrage de la charge entre les lignes (respectivement les colonnes) de la grille de processeurs est réalisé en adaptant l’algorithme proposé dans [113] à la méthode fan-in. À chaque colonne (respectivement ligne) de la matrice par bloc est associée un coût correspondant à la somme des coûts correspondants aux blocs de la colonne (respective-ment ligne). Chacune des colonnes (respective(respective-ment des lignes) de la matrice, pris dans l’ordre décroisant de leur coût est alors placée sur la colonne (respectivement la ligne) la moins chargée de la grille de processeur.

Ce placement des blocs sur une grille permet alors de réduire les communications, de manière analogue aux algorithmes parallèles d’algèbre linéaire dense vus dans le cha-pitre II. En effet, les diffusions réalisées aux lignes 4 et 12 de l’algorithme 13 page 145 ne font intervenir qu’au maximump

1processeurs : l’ensemblegr oup(K)contient les processeurs ayant un bloc de la colonne K. De la même manière, le processeur possé-dant le blocL

I;J ne recevra de contribution sur ce bloc que des processeurs situés sur la même ligne de la grille puisque l’opérationbmod(K ;I;J)est réalisée sur le processeur contenant le blocL

I;K.

8.5.5.2 Placement proportionnel

Lorsque l’on analyse, par rapport à l’arbre d’élimination, les communications réali-sées lors de la factorisation par la méthode fan-in, on remarque que les blocs de deux nœuds appartenant à deux sous arbres différents de l’arbre d’élimination, n’interviennent pas dans une même communication. Donc les calculs réalisés sur deux sous arbres dis-tincts, au sens où l’un n’est pas un sous arbre de l’autre, ne feront jamais intervenir de communication entre ces deux sous arbres.

L’idée du placement proportionnel est alors de partitionner les processeurs de manière à ce que les calculs de deux sous arbres distincts soient toujours réalisés sur deux par-titions différentes des processeurs, dans le but de réduire les communications. Pour cela la méthode suivante est utilisée. À chaque nœud de l’arbre est associé un groupe de

pro-Factorisation numérique 8.5 cesseurs. Le nœud racine de l’arbre reçoit l’ensemble des processeurs et chaque nœud de l’arbre partitionne ce groupe de processeurs pour le répartir sur ses nœuds fils. Cette partition est appliquée récursivement jusqu’à obtenir des partitions ne contenant qu’un processeur. La partie gauche de la figure 8.6 montre un exemple d’une telle partition des nœuds sur le graphe.

La manière dont un nœud répartit son groupe de processeurs sur ses sous arbres est primordiale pour la régulation de la charge de calcul entre les processeurs. Chaque sous arbre implique des calculs indépendants. L’idée du placement proportionnel est alors de répartir les processeurs sur les sous arbres proportionnellement à la charge de calcul de chaque sous arbre. Cette répartition proportionnelle n’est cependant pas triviale car l’en-semble des ressources à partitionner, c’est-à-dire le nombre de processeurs, doit rester de cardinal entier.

Une fois que l’assignement des processeurs sur les nœuds du graphe est réalisé, il faut encore placer chacun des blocs d’un nœud sur un des processeurs assignés au nœud. Cette seconde étape est représentée sur la partie droite de la figure 8.6. Là encore plusieurs méthodes sont utilisables.

Groupe de trois processeurs.

(1,2,3) Le processeur 5 (6,7) (1,2,3,4) (1) (2) (3,4) (3) (4) (5) (6) (7) (1,2,3,4,5,6,7) (1,2,3,4,5,6,7) 6 7 .

l’arbre sur son groupe de processeur. 5

Arbre d’élimination Allocation des blocs d’un nœud de

Figure 8.6 – Placement proportionnel des blocs de la matrice sur7processeurs.

Une de ces méthodes consiste à utiliser un placement cyclique bidimensionnel si-milaire à celui utilisé pour la factorisation de Cholesky dense vue dans la section 7.1

page 113. Cependant, ici, la taille des blocs, et donc le coût de chaque opération sur un bloc, est variable d’un bloc à l’autre. Le placement cyclique bidimensionnel doit donc être adapté à ce problème. La solution utilisée est de répartir équitablement les lignes et les colonnes de la sous matrice de blocs sur les lignes et les colonnes de la grille de processeurs.

L’autre solution est d’utiliser un algorithme glouton. Les blocs sont alors alloués sur chacun des processeurs, dans l’ordre où ils seront utilisés, de manière à répartir la charge de calcul sur chacun des processeurs. Par rapport à la première solution, cette méthode peut générer plus de communication ; par contre elle fournit un meilleur équilibrage de la charge de calcul sur les processeurs.