1  Parallélisme

Eric Goubault

Commissariat à l'Energie Atomique

Saclay

2  Pourquoi le parallélisme?

Le parallélisme, d'exotique il y a encore peu, est devenu indispensable:

3  Au niveau d'un microprocesseur (Athlon)...


4  Au niveau d'une machine...


5  Au niveau d'un réseau de machines...


6  La machine numéro 1 actuellement...


(IBM ASCI White, Lawrence Livermore National Laboratory, 2000, 8192 processeurs Power3 à 375Mhz: 12.3 teraflops! - simulation des armes thermonucléaires)

7  Mais subtil à programmer...

8  Programme

9  Organisation

10  Plan de ce cours en particulier

11  Introduction












Machine parallèle = ensemble de processeurs qui coopèrent et communiquent






Historiquement, réseaux d'ordinateurs, machines vectorielles et faiblement parallèles (années 70 - IBM 360-90 vectoriel, IRIS 80 triprocesseurs, CRAY 1 vectoriel...)

12  

Permet de résoudre bien plus rapidement certains problèmes: ainsi que de résoudre certains problèmes spécifiques,

13  Taxonomie de Tanenbaum:






Quatre types: SISD, SIMD, MISD et MIMD.









Basée sur les notions de flot de contrôle et flot de données.

14  Taxonomie de Tanenbaum (1):












Machine SISD = Single Instruction Single Data
  = Machine Von Neuman

15  Exemple

Le code suivant,

int A[100];
...
for (i=1;100>i;i++)
   A[i]=A[i]+A[i+1];
s'exécute sur une machine séquentielle en faisant les additions A[1]+A[2], A[2]+A[3], etc., A[99]+A[100] à la suite les unes des autres.

16  Taxonomie de Tanenbaum (2):






Machine SIMD = Single Instruction Multiple Data

En général exécution synchrone

17  Exemple

En CM-Fortran sur la Connection Machine-5 avec 32 processeurs,

       INTEGER I,A(32,1000)
CMF$   LAYOUT A(:NEWS,:SERIAL)
       ...
       FORALL (I=1:32,J=1:1000) 
     $    A(I:I,J:J)=A(I:I,J:J)+A(I:I,(J+1):(J+1))
Chaque processeur i, 1 £ i £ 32 a en sa mémoire locale une tranche du tableau A: A(i,1), A(i,2), ..., A(i,1000). Il n'y a pas d'interférence dans le calcul de la boucle entre les différentes tranches: tous les processeurs exécutent la même boucle sur sa propre tranche en même temps.

18  Exemple



19  Taxonomie de Tanenbaum (3):









Machine MISD = Multiple Instruction Single Data






Processeurs vectoriels, architectures pipelines

20  Exemple

Pipelinage d'une addition vectorielle,
FOR  i:=1 to n DO
   R(a+b*i):=A(a'+b'*i)+B(a''+b''*i);
A, B et R sont placés dans des registres vectoriels qui se remplissent au fur et à mesure du calcul,

21  Exemple

Temps A ( i ) B ( i ) R ( i )
1 1 . . . 1 . . . . . . .
2 2 1 . . 2 1 . . . . . .
3 3 2 1 . 3 2 1 . . . . .
4 4 3 2 1 4 3 2 1 . . . .
5 5 4 3 2 5 4 3 2 1 . . .
6 6 5 4 3 6 5 4 3 2 1 . .
etc.                        

22  Taxonomie de Tanenbaum (4):






Machine MIMD = Multiple Instruction Multiple Data

C'est le cas (2) que l'on va voir plus particulièrement avec JPVM. On pourra également simuler le cas (1) (que l'on verra plus avec les threads JAVA).

23  Mémoire Partagée



24  Mémoire Partagée

Synchronisation par,

25  Machine distribuée



26  Machine distribuée

Synchronisation et échange d'information par,

27  Exemple -- Clients/Serveurs

Le protocole RPC (``Remote Procedure Call'') entre machines UNIX avec réseau Ethernet est un exemple de programmation MIMD:

28  Remarques









Architectures plus ou moins adaptées à certains problèmes.









Gain de temps espéré: au plus N (nombre de processeurs). Il existe néanmoins des problèmes avec gains supérieurs (recherche distribuée).




En pratique, parallélisme difficile à contrôler

29  Programmation parallèle:

30  Constructions parallèles explicites

31  Processus (MIMD)

Un Processus est une unité de programme séquentielle (abstraction d'un processeur) avec,









32  Constructions parallèles explicites (suite):








33  Constructions parallèles explicites (suite):

Synchronisation: but = assurer qu'à un moment donné tous les processus ont suffisament avancés leurs calculs.




Erreurs possibles: Interblocage (deadlock, livelock), Famine,... (cours 2 et 3)




Exemples:

34  Constructions parallèles explicites (suite):

MIMD mémoire partagée,




Erreurs possibles: incohérence des données.




Partant de x=0, on exécute x:=x+x en parallèle avec x:=1. Par exemple, on a ces trois exécutions possibles:

LOAD x,R1 WRITE x,1 LOAD x,R1
LOAD x,R2 LOAD x,R1 WRITE x,1
WRITE x,1 LOAD x,R2 LOAD x,R2
WRITE x,R1+R2 WRITE x,R1+R2 WRITE x,R1+R2
Résultat x=0 Résultat x=2 Résultat x=1




Pour y remédier, sections critiques et exclusion mutuelle.

35  La Connection Machine-5

36  

Plusieurs modèles installés en France, dont un à l'ETCA (32 noeuds, 2 processeurs de contrôle, 1 Go de RAM, 16 Go de disques, 4 GFlops (crête), mai 1993).



37  CM-5

Fonctionne en,

38  Cray T3E

La machine la plus puissante chez CRAY, deux types de modèles, refroidissement à air (pas plus de 128 processeurs) ou par un liquide (jusqu'à 2048 processeurs). En amalgamant les deux,

Performance de crête de 9.6 GFlops à 1.2 TFlops, jusqu'à 4 To de mémoire vive.

39  CRAY T3E





40  CRAY T3E

Peut être utilisé,

41  IBM SP2

IBM RISC/6000 Scalable POWERparallel System (SP):

42  Réseaux de stations

Pas d'horloge globale, mode MIMD, communication par passage de messages (typiquement gérés par PVM) sur un réseau local ou d'interconnexion.

43  Architectures hybrides



Combinaison sur un réseau local de stations et de machines multiprocesseurs (elles-même gérant leur parallélisme interne par mémoire partagée ou par bus ou réseau). JPVM peut également gérer ce genre d'architectures.

44  Réseau de machines sous PVM

PVM (``Parallel virtual Machine''):

45  Réseau de machines sous PVM

Stations OS Super-calculateurs
DEC BSD Convex C2, Exemplar
IBM System-5 Cray C90, T-3D
HP Linux Intel Paragon, Hypercube
Silicon Graphics   IBM SP-2, 3090
Sun   TMC CM-2, CM-5
NeXT   Kendall Square
Data General   Sequent
386/486/586 Unix   Maspar
    Encore
    Fujitsu
    Stardent

46  La machine PVM

La machine PVM est une collection de machines réelles sur un même réseau sur lesquelles un démon pvmd3 tourne:

47  La machine PVM

La librairie PVM permet de communiquer avec ces démons pvmd3 pour,

48  La machine PVM



49  Calcul de Pi

Supposons que nous voulions calculer Pi en parallèle par la formule suivante,

p =
ó
õ
1


0
4

1+x2
dx
  =
n
S
i=1
1

n
4

1+ æ
ç
ç
è
(i-
1

2
)
1

n
ö
÷
÷
ø
2



 

50  Calcul de Pi

Une solution est le paradigme Maître/Esclave: Un maître va lancer N esclaves chargés de calculer les sommes partielles,
Pk =
Si=k*n/N(k+1)*n/N
1

n
4

1+ æ
ç
ç
è
(i-
1

2
)
1

n
ö
÷
÷
ø
2



 
pour k=0,···,N-1.

C'est une parallélisation par décomposition fonctionnelle. On pourrait aussi faire de la décomposition de domaine pour calculer une fonction s'appliquant independemment à des sous-blocs d'un tableau.

51  Flôt de contrôle

Donc le maître pi_control va lancer N copies d'un esclave pi avec l'entier k correspondant, puis attendre que tous aient terminé leur exécution, enfin effectuer la somme de tous les résultats partiels.



52  Threads JAVA

53  Utilité des threads

54  Création

Pour créer un thread, on crée une instance de la classe Thread,

Thread Proc = new Thread();

55  Exécution

56  Complément JAVA: les classes

 class Point { 
   int x; int y = 0;
   Point (int x0) { x = x0; }
   void bouge () { x = x + 1; } }
La classe Point est constituée de:

57  Les constructeurs

On crée une instance d'une classe avec la construction new suivie d'un constructeur de classe et de ses arguments, par exemple new Point (3).

Le typage ne garantit pas que toutes les variables sont initialisées. Cependant, le compilateur affecte aux variables non initialisées une valeur par défaut du type déclaré.

58  This

Dans le corps d'une méthode, this désigne l'objet en train d'exécuter cette méthode.

 class Point { 
   int x = 0;
   Point () { }
   Point (int x0) { x = x0; }
   void bouge () { x = x + 1; }
   void bouge_bouge () { this.bouge(); this.bouge(); }
 }

59  L'héritage

 class Bipoint extends Point {  int y;
   Bipoint () { }
   Bipoint (int x0, int y0) { super(x0); y = y0; }
   void bouge () { super.bouge (); y = y + 1; }
 }
Dans une sous-classe, super désigne la classe parente. Un constructeur d'une sous-classe doit faire appel à un constructeur de la classe parente. Cet appel doit être la première instruction. Si ce n'est pas fait, le compilateur ajoute super().

60  La surcharge

61  Exemple

class Compte extends Thread {
   int valeur;

   Compte(int val) {
      valeur = val;
   }

   public void run() {
      try {

62  

         for (;;) {
            System.out.print(valeur + " ");
            sleep(100);
         }
      } catch (InterruptedException e) {
           return;
        }   
   }

   public static void main(String[] args) {
      new Compte(1).start();
      new Compte(2000).start();
   }
}

63  Exécution

L'exécution du programme main donne quelque chose comme,

> java Compte
1 2000 2000 1 1 1 1
^C
>

64  Remarques

65  Complément JAVA: les exceptions

66  Arrêt

67  Mais...

68  L'interface Runnable

69  Complément JAVA: Interfaces et implémentations

Les interfaces sont des spécifications des implémentations.

 interface Printable {
   void print (); }

70  Utilisation

La déclaration d'une interface I dans la définition d'une classe A:

71  Le sous-typage

En JAVA, le sous-typage est par nom.

72  Les casts

73  Les conversions

74  Exemple

class Compte implements Runnable {
   int valeur;

   Compte(int val) {
      valeur = val;
   }

   public void run() {
      try {
         for (;;) {
            System.out.print(valeur + " ");
            sleep(100);
         }

75  Exemple

      } catch (InterruptedException e) {
           return;
        }   
   }

   public static void main(String[] args) {
      Runnable compte1 = new Compte(1);
      Runnable compte2 = new Compte(2000);
      new Thread(compte1).start();
      new Thread(compte2).start();
   }
}

76  Déterminer la terminaison d'un thread

77  Déterminer la terminaison d'un thread

78  Nommer les threads

79  Informations sur les threads

80  Exemple

class Compte3 extends Thread {
   int valeur;

   Compte3(int val) {
      valeur = val;
   }

   public void run() {
      try {
         for (;;) {
            System.out.print(valeur + " ");
            sleep(100);
         }

81  

      } catch (InterruptedException e) {
           return; } }

   public static void printThreads() {
      Thread[] ta = new Thread[Thread.activeCount()];
      int n = Thread.enumerate(ta);
      for (int i=0; i<n; i++) {
         System.out.println("Le thread "+ i + " est 
                            " + ta[i].getName());
      } } 

   public static void main(String[] args) {
      new Compte3(1).start();
      new Compte3(2000).start();
      printThreads(); } }

82  Exécution

% java Compte3
1 2000 Le thread 0 est main
Le thread 1 est Thread-2
Le thread 2 est Thread-3
1 2000 1 2000 1 2000 1 2000 2000 
1 1 2000 2000 1 1 2000 2000 1 1 
2000 2000 1 1 2000 2000 1 1 2000 
2000 1 1 2000 2000 1 1 ^C
%

This document was translated from LATEX by HEVEA.