1  Parallélisme

Eric Goubault

Commissariat à l'Energie Atomique

Saclay

2  Problèmes d'ordonnancement

3  Loi d'Amdahl

Conséquence: même si on parallélise 80 pourcent d'un code (le reste étant séquentiel), on ne pourra jamais dépasser, quel que soit la machine cible, une accélération d'un facteur 5!

4  Exemple de nid de boucle

for (i=1;i<=N;i++) {
  for (j=i;j<=N+1;j++)
    for (k=j-i;k<=N;k++) {
      S1;
      S2;
    }
  for (r=1;r<=N;r++)
    S3;
}

5  Explication

6  Vecteurs d'itération

7  Ordre séquentiel d'exécution

Définit l'ordre d'exécution ``par défaut'':

8  Dépendances de données

9  Flot, anti et sortie...

10  Exemple

for (i=1;i<=N;i++)
  for (j=1;j<=N;j++)
    a(i+j) = a(i+j-1)+1;

11  Dépendances

file=depend.eps,width=20cm,clip=

12  Calcul des dépendances

13  Calcul des dépendances

14  Exemple

15  Exemple

16  Approximation des dépendances

Graphe de Dépendance Etendu (GDE):

17  Quelques définitions

18  Graphe de Dépendance Réduit

...ou GDR:

Le tri topologique du GDR permet d'avoir une idée des portions séquentielles, et des portions parallélisables.

19  Quelques abstractions

...des étiquettes du GDR. Par exemple, niveaux de dépendance (GDRN):

20  Exemple

for (i=2;i<=N;i++) {
  S1: s(i) = 0;
  for (j=1;j<i-1;j++) 
    S2: s(i) = s(i)+a(j,i)*b(j);
  b(i) = b(i)-s(i);
}

21  GDRN

file=gdrn1.eps,width=15cm,clip=

22  Vecteurs de direction

Dans notre exemple:

23  Vecteurs de direction

Sont des abstractions de ces ensembles de distance:

24  GDRV

file=gdrv.eps,width=18cm,clip=

25  Transformations de boucles

26  Algorithmes de parallélisation de boucles

27  Distribution de boucles

28  Cas 1

S1 ® S2 mais on n'a pas de dépendance de S2 vers S1, alors on peut transformer le code en:

for (i=...)
  S1;
for (i=...)
  S2;

29  Cas 2

S2 ® S1 mais on n'a pas de dépendance de S1 vers S2, alors on peut transformer le code en:

for (i=...)
  S2;
for (i=...)
  S1;

30  Fusion de boucles

forall (i=1;i<=N;i++)
 D[i]=E[i]+F[i];
forall (j=1;j<=N;j++)
 E[j]=D[j]*F[j];
devient:

forall (i=1;i<=N;i++)
 {
  D[i]=E[i]+F[i];
  E[j]=D[j]*F[j];
 }
Cela permet une vectorisation et donc une réduction du coût des boucles parallèles.

31  Composition de boucles

forall (j=1;j<=N;j++)
 forall (k=1;k<=N;k++)
  ...
devient,

forall (i=1;i<=N*N;i++)
 ...
Cela permet de changer l'espace d'itérations (afin d'effectuer éventuellement d'autres transformations).

32  Echange de boucles

for (i=2;i<=N;i++)
 for (j=2;j<=M;j++)
  A[i,j]=A[i,j-1]+1;
devient,

for (j=1;j<=M;j++)
 A[1:N,J]=A[1:N,j-1]+1;

33  Division de noeud

for (i=1;i<=N;i++)
 { A[i]=B[i]+C[i];
   D[i]=A[i-1]*A[i+1]; }
devient,

for (i=1;i<=N;i++)
 { A[i]=B[i]+C[i];
   temp[i]=A[i+1];
   D[i]=A[i-1]*temp[i]; }
Le cycle interne de dépendance est ainsi remplacé par une anti-dépendance.

34  Intérêt

Donc après distribution de boucle, on aura:

forall (i=1;i<=N;i++)
 A[i]=B[i]+C[i];
forall (i=1;i<=N;i++)
 temp[i]=A[i+1];
forall (i=1;i<=N;i++)
 D[i]=A[i-1]*temp[i];

35  Réduction de boucle

Dans le cas où le cycle interne de dépendance est de type dépendance de flot on ne peut pas utiliser la méthode précédente mais, par exemple:

for (i=3;i<=N;i++)
 { A[i]=B[i-2]-1;
   B[i]=A[i-3]*k; } 
devient,

for (j=3;j<=N;j=j+2)
 forall (i=j; i<=j+1; i++)
  { A[i]=B[i-2]-1;
    B[i]=A[i-3]*k; } 

36  Déroulement de boucle

for (i=1;i<=100;i++)
 A[i]=B[i+2]*C[i-1];
devient,

for (i=1;i<=99;i=i+2)
 {
  A[i]=B[i+2]*C[i-1];
  A[i+1]=B[i+3]*C[i];
 }

37  Rotation de boucle

for (i=2;i<=N-1;i++)
 for (j=2;j<=N-1;j++)
  A[i,j]=(A[i+1,j]+A[i-1,j]+A[i,j+1]+A[i,j-1])/4;
Il y a un front d'onde, cela devient,

forall (i=2;i<=N-1;i++)
 for (j=i+2;j<=i+N-1;j++)
  A[i,j-1]=(A[i+1,j-i]+A[i-1,j-i]+A[i,j+1-i]+A[i,j-1-i])/4;

38  Exemple de parallélisation de code

Phase de remontée après une décomposition LU:

Soit donc à résoudre le système triangulaire supérieur
Ux=b
avec,
U= æ
ç
ç
ç
è
U1,1 U1,2 U1,3 ··· U1,n
0 U2,2 U2,3 ··· U2,n
      ···  
0 0 ··· 0 Un,n
ö
÷
÷
÷
ø
et Ui,i ¹ 0 pour tout 1 £ i £ n.

39  Remontée...

On procède par ``remontée'' c'est à dire que l'on calcule successivement,

xn =
bn

Un,n
xi =
bi -
n
S
j=i+1
Ui,j xj

Ui,i
pour i=n-1,n-2,···,1.

40  Code séquentiel

x[n]=b[n]/U[n,n];
for (i=n-1;i>=1;i--)
{  
x[i]=0;
for (j=i+1;j<=n;j++)
     L: x[i]=x[i]+U[i,j]*x[j];
     x[i]=(b[i]-x[i])/U[i,i];
     }

41  Graphe de dépendances

file=depen1.eps,width=12cm,clip=

Il y a aussi des anti-dépendances des itérations (i,j) vers (i-1,j)...

42  Parallélisation

En faisant une rotation et une distribution de boucles:

H': forall (i=1;i<=n-1;i++)
       x[i]=b[i];
T': x[n]=b[n]/U[n][n];
H:  for (t=1;t<=n-1;t++)
     forall (i=1;i<=n-t;i++)
      L: x[i]=x[i]-x[n-t+1]*U[i][n-t+1];
     T: x[n-t]=x[n-t]/U[n-t][n-t];
Le ratio d'accélération est d'ordre n/ 4 asymptotiquement.

43  Allen et Kennedy: principe

44  Algorithme

45  Exemple

for (i=1;i<=N;i++) 
  for (j=1;j<=N;i++) {
    S1: a(i+1,j+1) = a(i+1,j)+b(i,j+2);
    S2: b(i+1,j) = a(i+1,j-1)+b(i,j-1);
    S3: a(i,j+2) = b(i+1,j+1)-1;
  }

46  Exemple

47  Exemple

48  Exemple

file=gdrn2.eps,width=10cm,clip=

49  Algorithme

50  GDRN modifié

file=gdrn3.eps,width=12cm,clip=

51  Parallélisation finale

for (i=1;i<=N;i++) {
  for (j=1;j<=N;j++) 
    S1: a(i+1,j+1) = a(i+1,j)+b(i,j+2);
  forall (j=1;j<=N;j++)
    S3: a(i,j+2) = b(i+1,j+1)-1;
  forall (j=1;j<=N;j++)
    S2: b(i+1,j) = a(i+1,j-1)+b(i,j-1);
}

52  Quelques perspectives

53  Modèles sémantiques

[DEA Programmation]

54  Motivations

55  Exemple: systèmes de transitions

Processus: systèmes dynamiques (discrets en général) = graphes dirigés d'actions:

file=standard2.eps,width=15cm,clip=

56  Exemple d'exécution possible

Programme (T1=PaPbVaVb) | (T2=PbPaVbVa):

6cm
T1 T2
Pa -
- Pb
Pb (?) -
- Pa (?)
10cm
file=standard3.eps,width=10cm,clip=

Point mort!

57  Exemple

1 autre exécution possible, complète (au total 16!):

6cm
T1 T2
Pa -
Pb -
- Pb (?)
Va -
Vb -
- Pa
- Va
- Vb
10cm
file=standard4.eps,width=10cm,clip=

58  Chemins

... il y a très peu de chemins ``intéressants''

En fait T1=PaPb(b=b+1)VaVb et T2=PbPa(b=b*2)VbVa et au début, b=2:

59  En général, pénible...

Grand nombre d'états: ici algorithme de Dekker, quelques lignes de C pour 2 processus, centaines de chemins/t2 ``vrais'' chemins!

file=dekker.p.abs.ps,height=8cm,width=15cm,clip=

D'où nécessité d'''abstraire'', ou d'utiliser d'autres modèles...

60  Autres langages

[DEA Programmation]

61  CCS

Abstraction de la partie ``coordination'' dans un système à passage de messages (CML, Erlang, Facile etc.) :

62  CCS pur

Maintenant, on oublie les valeurs passées...

t = nil fin de processus
  |

a
 
Î S
envoi sur a
  | a Î S réception sur a
  | t + t choix non-déterministe
  | t.t composition séquentielle
  | t | t composition parallèle
  | t\c cache le canal c
  | t[f] renommage par fonction f
  | rec x.t[x] agent récursif

63  Exemples

64  Sémantique opérationnelle

Idée : Graphe des états de la machine et de leurs dépendances temporelles

65  Sémantique de CCS

Principe : Les états sont les programmes qui restent à évaluer.

66  Notion d'observation

a.nil+a.nil et a.nil sont essentiellement les même programmes.

67  Mais...

a.b.nil+a.c.nil et a.(b.nil+c.nil) sont des programmes différents parce que les choix entre b et c sont faits à des temps différents (supposer un deadlock après un des a).

68  Exemple

On considère les agents A et B définis par:
A = a.A'
A'=

c
 
.A
et
B = c.B'
B' =

b
 
.B

Peut-on trouver un équivalent pour (A | B) \c ?

69  Exemple

La réponse est oui

.6cm

Soient,
C0 =

b
 
.C1 + a.C2
C1 = a.C3
C2 =

b
 
.C3
C3 = t.C0

Alors, (A | B) \c ~ C1.

70  Equations algébriques

Remarquer que (a.nil) | (b.nil) ~ a.b.nil+b.a.nil (loi d'expansion en général).

71  Suite

(Propriétés de congruence) Si P1 ~ P2,

72  Spécification : bit alterné

Protocole : P envoie alternativement un bit à Q, qui le retourne. P renvoie le message s'il a été mal reçu.

P =

bit0
 
.P'
P' =
ack'1.

bit0
 
.P'+ack'0.

bit1
 
.P'
 
Q =
bit'0.

ack0
 
.Q+bit'1.

ack1
 
.Q

73  Spécification, suite

Ligne de communication parfaite L=bit0.bit'0.L+bit1.bit'1.L

.7cm

Ligne de communication imparfaite M=(bit0+bit1).(bit'0+bit'1+t).M

.7cm

Ligne de retour R=ack0.ack'0.R+ack1.ack'1.R

74  Vérification

P| M| R| Q peut se bloquer en P'| M| R| Q après une action t de M.




Par contre, (P| L| R| Q) ~ rec X.t.X

1cm

En effet,

75  Vérification

P| L| R| Q
t2
®
 
P'| L| R|

ack0
 
.Q
 
t2
®
 

bit1
 
.P'| L| R| Q
 
t2
®
 
P'| L| R|

ack1
 
.Q
 
t2
®
 
P| L| R| Q

76  Analyse statique

[DEA Programmation]

77  Systèmes distribués tolérants aux pannes

Existe-t-il un protocole qui gère N processus asynchrones tels que,

- ils démarrent avec certaines valeurs d'entrée spécifiées, calculent et communiquent, et terminent avec certaines valeurs de sortie spécifiées,

- ils fonctionnent selon un modèle de calcul spécifié (mémoire partagée, passage de messages etc.)

et qui soit, par exemple sans-attente (résistant aux pannes), c'est à dire qui termine même si N-1 processeurs tombent en panne?

Exemple: Le consensus: les valeurs d'entrée sont une valeur quelconque dans un ensemble S, les valeurs de sortie doivent être toutes les mêmes et égales à une des valeurs d'entrée.

78  Résultat

Il n'existe pas de protocole pour le consensus sur une machine à mémoire partagée sans attente [Herlihy/Shavit+FLP etc.].

file=simp30.eps,width=20cm,clip=

79  Systèmes auto-stabilisants

80  Projets GRID


This document was translated from LATEX by HEVEA.