Systèmes parallèles et distribués

Transcription

Systèmes parallèles et distribués
Systèmes parallèles et distribués
Grégory Mounié
2013-12
Grégory Mounié
Systèmes parallèles et distribués
2013-12
1 / 58
Outline
1
Introduction
2
Performances
3
Problèmes du calcul parallèle
4
Intergiciels
Grégory Mounié
Systèmes parallèles et distribués
2013-12
2 / 58
Introduction
Systèmes distribués
Mise en commun de resources
matérielles : CPU, mémoire,
logiciels, données
Grégory Mounié
Systèmes parallèles et distribués
2013-12
3 / 58
Introduction
Tolérance aux pannes
Stockage pérenne
Only wimps use tape backup: real men just upload their important stuff on
ftp, and let the rest of the world mirror it. L.T.
Définition de Lamport
A distributed system is one that stops you from getting any work done
when a machine you’ve never heard of, crashes.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
4 / 58
Introduction
Systèmes distribués
Attention
Un programme distribué présente de nombreux désavantages! D’une
manière générale il vaut mieux éviter le recours aux programmes distribués.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
5 / 58
Introduction
Dans ce cours
Objectif
⇒ vers des systèmes à très grand échelle
réseaux pair-à-pair: edonkey, freenet, gnutella
calcul distribué orienté performance: boinc, mpi, charm++, kaapi
Outils
Intergiciels, dépend de la plateforme visée
Algorithmes, dépend du type d’intergiciel, de l’échelle visé, et bien sûr
du problème.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
6 / 58
Introduction
Exemple d’intergiciel: BOINC
issu de SETI@HOME
infrastructure de calcul
nombreux projets: radioactive@home, docking@home, milkyway@home
Le 2 décembre 2013
Actifs: 243883 volunteers, 509743 computers. 24-hour average: 8.11
PetaFLOPS. (rang 5.5 au top500)
Grégory Mounié
Systèmes parallèles et distribués
2013-12
7 / 58
Introduction
Déroulement des séances
1
cours: Speedup, Amdahl, Graham, équilibrage, MPI
2
cours: tolérance aux pannes/opérations de communication
3
TP: lancé de rayon distribué (MPI)
4
TP: lancé de rayon (MPI)
5
TP: simgrid / déploiement d’applications
6
cours: présentation de votre projet devant les autres étudiants (10
min)
Grégory Mounié
Systèmes parallèles et distribués
2013-12
8 / 58
Introduction
Projet
trinome (10 min de présentation+5min question)
implantation des techniques du cours
langagues / bibliothèques parmi 20 choix arbitraire (transparent
suivant)
make distribué
I
I
compilation
blender
analyse de performances : jusqu’à 80 coeurs sur 40 PCs
Grégory Mounié
Systèmes parallèles et distribués
2013-12
9 / 58
Introduction
Les environnements et bibliothèques possibles
Chaque groupe choisira un enviromment différents parmi les 20 suivants:
1 Les environnement de programmations parallèles distribuées:
I
I
I
I
I
2
Les languages dédiés
I
3
Julia (http://julialang.org); Erlang (http://erlang.org);
Chapel (http://chapel.cray.com)
Les objets distribués
I
4
MPI (Communication Asynchrone); MPI (Communication
uni-directionnelles Read/Write); MPI (Communication Collectives);
MPI (avec l’interface fichier de MPI);
Charm++ (Bibliothèque C++)
Python PP
Hadoop (Map-Reduce de Apache)
Python + Disco (map reduce en python)
Java-RMI; DO de Objective-C (gnustep); Distributed ADA (polyorb);
Python + Pyro; RPC Go (http://golang.org); RPC C; Corba;
Autres
I
I
Zero-MQ (bibliothèque réseau de haut niveaux)
Simgrid (simulation)
Grégory Mounié
Systèmes parallèles et distribués
2013-12
10 / 58
Introduction
Lanceurs parallèles
Pour lancer vos applications, il faudra être capable de déployer les instances
sur les PCs
Lanceurs parallèles
Il faut éviter la boucle for séquentielle de ssh qui ne passe pas à l’échelle:
taktuk est le lanceur conseillé
ssh-add et taktuk -c "ssh -A"
Grégory Mounié
Systèmes parallèles et distribués
2013-12
11 / 58
Performances
Évaluation de performance
La mesure du temps
La mesure précise du temps est un problème dès qu’il y a plusieurs horloges
déjà sur un multi-coeur, pour avoir des temps à la nanoseconde
en distribuée
POSIX
clock_gettime() de <time.h>.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
12 / 58
Performances
Accélération
Definition (L’accélération (Speedup))
C’est le temps du meilleur calcul séquentiel divisé par le temps de calcul
parallèle sur m processeurs ( T1 /Tm )
Grégory Mounié
Systèmes parallèles et distribués
2013-12
13 / 58
Performances
L’efficacité
L’efficacité (Efficiency)
C’est l’accélération multiplié par l’inverse du nombre m de ressources de
calculs ( T1 /(m ∗ Tm ) ).
Accélération superlinéaire et super efficacité
Normalement l’accélération est plus petite que m et lefficacité plus petite
que 1. Ce n’est pas toujours vrai (cache, algorithme non déterministe).
Grégory Mounié
Systèmes parallèles et distribués
2013-12
14 / 58
Performances
Algorithme 1: l’Addition
Question
Comment additionne-t-on deux entiers ? Quelle est le problème dans une
parallélisation de cet algorithme ? Comment faire ?
Grégory Mounié
Systèmes parallèles et distribués
2013-12
15 / 58
Performances
Algo 2: Tri PRAM
Question
Quelle est l’opération de base d’un tri ? Comment la paralléliser ?
Pourquoi la compléxité d’un tri devient alors N 2 ?.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
16 / 58
Performances
Algo 3: Tri MCSTL
Question
Comment améliorer le surcoût du tri ?
Idée du merge-sort parallèle (mémoire partagée)
1
merge-sort local
2
échange de pivots, tri et échanges des chunks correspondants
3
fusion des chunks
Grégory Mounié
Systèmes parallèles et distribués
2013-12
17 / 58
Performances
Tri rapide
Grégory Mounié
Systèmes parallèles et distribués
2013-12
18 / 58
Performances
Merge
Comment commenter ces courbes rapidement?!
Accélération de l’exécution
STL min element on 8 threads
9
8
TSTL / TLibrary
7
6
5
4
3
X-Kaapi
KaSTL
PaSTeL
TBB
Cilk
2
1
0
0
Grégory Mounié
jeudi 3 septembre 2009
50000
100000
150000
Size
200000
Systèmes parallèles et distribués
250000
2013-12
19 / 58
Performances
Loi d’Amdahl
Dans chaque code on trouve une partie parallèle et une partie
séquentielle
modèle du temps d’exécution : Tm = T1 × (1 − f ) +
T1 ×f
m
limm→∞ Tm = T1 × (1 − f )
Exemples :
code parallèle à 50 % : T∞ = T1 /2
code parallèle à 80 % : T10 = 0.28T1
Grégory Mounié
Systèmes parallèles et distribués
2013-12
20 / 58
Performances
Heuristiques à performance garantie
Problèmes NP-Difficiles
Une exécution parallèle efficace demande la résolution des problèmes
d’optimisation classiques: partition, ordonnancement, sac-à-dos, etc.
Ils sont (tous) NP-Difficile. On ne cherche pas l’optimal, mais juste une
bonne solution.
Definition (Une heuristique a une garantie de performance de q)
si pour toute instance I d’un problème et σI∗ la valeur la solution optimale,
l’heuristique produit une solution de valeur σI tel que ∀I , σI < qI∗
Grégory Mounié
Systèmes parallèles et distribués
2013-12
21 / 58
Performances
Graham
Definition (Algorithme de liste)
Les tâches à ordonnancer sont rangées dans une liste de priorité
Lorsqu’une ressource de calcul est disponible, on y démarre le calcul de
la tâche prête (ou qui démarrera le plus tôt) la plus prioritaire.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
22 / 58
Performances
Garantie des algorithmes de listes
Theorem (Tâches indépendantes séquentielles)
Un algorithme de liste a une garantie de performance de 2 sur m
processeurs homogènes.
Theorem (Graphe de tâches séquentielles)
Un algorithme de liste a une garantie de performance de 2 sur m
processeurs homogènes.
Theorem (Tâches indépendantes parallèles rigides)
Un algorithme de liste a une garantie de performance de 2 sur m
processeurs homogènes.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
23 / 58
Performances
Bornes inférieures
On ne peut pas comparer avec la solution optimale, mais on peut se
comparer avec deux bornes inférieures.
Le chemin critique du graphe
La plus longue tâche pour les tâches indépendantes
La somme du coût des noeuds divisée par le nombre de processeurs
Le travail total divisé par le nombre de processeurs
Grégory Mounié
Systèmes parallèles et distribués
2013-12
24 / 58
Performances
Preuve pour les tâches indépendantes
Montrer le 2 en utilisant les bornes inférieures de la solution optimale.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
25 / 58
Performances
Preuve des graphes
Illustrer l’importance du 1 + 1
Grégory Mounié
Systèmes parallèles et distribués
2013-12
26 / 58
Performances
Approximation duale
Comment répartir les calculs
si l’on a deux types de processeurs et donc des vitesses différentes pour les
tâches.
l’approximation duale au sens de Schmoys permet d’obtenir une
garantie de 2 facilement.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
27 / 58
Problèmes du calcul parallèle
Équilibrage de la charge
4 grandes stratégies:
Découpe statique
Maître-esclave
Vol de travail
Adaptatif
Grégory Mounié
Systèmes parallèles et distribués
2013-12
28 / 58
Problèmes du calcul parallèle
Découpage statique
Répartition efficace
Le but est de minimiser les communications et les synchronisations.
"Owner compute rule"
Les calculs sont effectués là où sont rangées les données.
Découpage automatique efficace avec des partitionneurs de graphes
(Scotch et Metis)
Grégory Mounié
Systèmes parallèles et distribués
2013-12
29 / 58
Problèmes du calcul parallèle
Maître-esclave (Master-Worker)
Découpage du travail en petit morceau indépendant: les tâches (jobs,
tasks)
La liste des tâches est conservé par le maître
Les esclaves viennent demander du travail au maître lorsqu’ils n’ont
plus de travail
Grégory Mounié
Systèmes parallèles et distribués
2013-12
30 / 58
Problèmes du calcul parallèle
Vol de travail
Variante distribuée du maître-esclave
Tous les noeuds ont une liste locale de tâches
Lorsque sa liste locale est vide, le noeud vole du travail dans la liste
d’une victime tirée au hasard
Variations sur les vols
Probabilité du choix de la victime
vols multiples si temps de vols très différents.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
31 / 58
Problèmes du calcul parallèle
Adaptatif
Le travail n’est découpé que lorsqu’une demande de vol arrive
peu de surcoût par rapport au séquentiel: plus efficace pour les
problèmes de petites tailles.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
32 / 58
Problèmes du calcul parallèle
Autres problèmes
Données
Déploiement
Tolérance aux pannes
Hétérogénéité
Grégory Mounié
Systèmes parallèles et distribués
2013-12
33 / 58
Intergiciels
Programmation distribuée
Le point difficile lors de la programmation, est la gestion de la distribution
et des communications. Des bibliothèques/API comme MPI permettent de
programmer les applications avec le paradigme simple à comprendre du
passage de message.
D’autres abstractions sont possibles (OpenMP, OpenMP avec des tâches,
RMI+J2EE, DO, DCOM, etc.).
Grégory Mounié
Systèmes parallèles et distribués
2013-12
34 / 58
Intergiciels
Le passage de message
Le paradigme consiste à écrire dans le code séquentiel exécuté par chaque
noeuds, les communications (envoi ou réception) qu’il doit réaliser pour
faire correctement le calcul.
Exemple:
sur le noeud 0
1
2
3
4
5
int tableau[3] = {1,2,3};
int destinataire=3;
Calcul(tableau, 3);
Envoi(tableau, 3, INT, destinataire);
Grégory Mounié
Systèmes parallèles et distribués
2013-12
35 / 58
Intergiciels
Le passage de message (suite)
sur le noeud 3
1
2
3
4
5
int tableauCalcule[3] = {};
int emetteur=0;
Recevoir(tableauCalcule, 3, INT, emetteur);
ContinuerCalcul(tableauCalcule, 3);
Grégory Mounié
Systèmes parallèles et distribués
2013-12
36 / 58
Intergiciels
MPI
MPI est un standard définissant l’API de fonctions permettant
d’implanter des applications parallèles avec passage de message.
Le standard ne définit pas les opérations de gestion (lancement de
l’application parallèle). Elles peuvent varier d’une implantation à
l’autre.
Implantations couramment utilisées: http://www.open-mpi.org (ex
LAM-mpi) et MPICH
Grégory Mounié
Systèmes parallèles et distribués
2013-12
37 / 58
Intergiciels
Histoire
L’API est défini pour C, C++ et Fortran.
Elle est la somme de l’expertise des concepteurs autour de l’écriture de
bibliothèques d’échange de message (1980-1994, 1996 pour MPI-2).
Elle permet ou fournit:
I
I
I
la portabilité (standard),
l’exploitation des performances au plus près du matériel,
elle fournit de nombreuses fonctionnalité et est disponible presque
partout.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
38 / 58
Intergiciels
Mémoire distribuée
MPI a été conçu pour des architectures à mémoire distribuée avec un
seul CPU.
Elle a évolué pour faciliter l’exploitation de multi-coeurs
inter-connectés.
Elle supporte l’hétérogénéité (verbeux) et la dynamicité (dépend de
l’implantation)
Grégory Mounié
Systèmes parallèles et distribués
2013-12
39 / 58
Intergiciels
Hello world en MPI
1
2
3
4
5
6
7
#include <mpi.h>
int main(int argc, char **argv) {
MPI_Init(& argc, &argv);
printf("Hello world !\n");
MPI_Finalize();
}
Grégory Mounié
Systèmes parallèles et distribués
2013-12
40 / 58
Intergiciels
Compilation
1
2
3
mpicc -o hello hello.c
mpirun -np 100 ./hello # et hop ! 100 Hello !
mpirun -np 100 --hostfile listedemachines ./hello
Grégory Mounié
Systèmes parallèles et distribués
2013-12
41 / 58
Intergiciels
Nommage des processus
Pour pouvoir différencier les calculs des noeuds, il faut pouvoir les
nommer.
Tous les processus lancés ensemble appartiennent à un même groupe
(Communicateur). Le communicateur par défaut est MPI_COMM_WORLD
Deux fonctions permettent d’obtenir la taille et le rang dans le
communicateur.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
42 / 58
Intergiciels
Hello world et nommage
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <mpi.h>
#include <stdio.h>
int main(int argc, char **argv) {
int taille, rang, len;
char hostname[MPI_MAX_PROCESSOR_NAME]={};
MPI_Init(& argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &taille);
MPI_Comm_rank(MPI_COMM_WORLD, &rang);
MPI_Get_processor_name(hostname, &len);
printf("Hello world %d parmi %d sur %s!\n", rang, taille,
MPI_Finalize();
}
L’affichage est dans le désordre. Il dépend de l’ordonnancement des
processus lancés.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
43 / 58
Intergiciels
Mesure du temps écoulé
1
2
3
4
5
6
7
8
double MPI_Wtime();
double debut = MPI_Wtime();
...
double fin = MPI_Wtime();
printf("Temps ecoule %g\n", fin - debut);
double MPI_Wtick();
(tick)
La précision de la mesure est disponible en utilisant la fonction de la ligne
tick.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
44 / 58
Intergiciels
Communications
MPI propose de nombreuses variantes pour les communications
point-à-point (un processus emetteur et un processus récepteur).
Grégory Mounié
Systèmes parallèles et distribués
2013-12
45 / 58
Intergiciels
MPI_Send / MPI_Recv
1
2
3
4
5
6
float tableau[10];
int recepteur; int TAG=123456;
...
MPI_Send(tableau, 10, MPI_FLOAT,
recepteur, TAG,
MPI_COMM_WORLD);
1
2
3
4
5
6
float tableauR[10];
MPI_Status status; int emetteur;
...
MPI_Recv( tableauR, 10, MPI_FLOAT,
emetteur, TAG,
MPI_COMM_WORLD, &status);
Grégory Mounié
Systèmes parallèles et distribués
2013-12
46 / 58
Intergiciels
Sémantique
MPI_Send() et MPI_Recv() sont bloquants jusqu’à ce que les
données puissent être réutilisé,
MPI_Recv() est donc bloquant jusqu’à la réception du message,
MPI_Send() est bloquant jusqu’à ce que l’envoi ou la copie des
données.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
47 / 58
Intergiciels
Exercice
Anneau à jeton
Le premier processus envoie un entier au processus numéro 2. Chaque
autre processus passe un entier au processus suivant. Le dernier repasse
l’entier au premier.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
48 / 58
Intergiciels
Joker en réception
1
2
3
MPI_Recv( tableauR, 10, MPI_FLOAT,
MPI_ANY_SOURCE, MPI_ANY_TAG, // jokers
MPI_COMM_WORLD, &status);
Grégory Mounié
Systèmes parallèles et distribués
2013-12
49 / 58
Intergiciels
Pourquoi avoir plusieurs type de communications
Exemple: tous les processus échangent avec le processus 0
if (rang != 0) {
MPI_Send(donnees, nb, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD);
MPI_Recv(donnees, nbR, MPI_DOUBLE, 0, TAG, MPI_COMM_WORLD, &
} else {
for(int dest =1; dest < taille; dest++, donnees += nbR) {
MPI_Send(donnees, nb, MPI_DOUBLE, dest, TAG, MPI_COMM_WORLD
MPI_Recv(donnees, nb, MPI_DOUBLE, dest, TAG, MPI_COMM_WORLD
}
}
Si Send envoie les données lorsque la réception est prête, quel est le
problème ?
Si Send envoie les données dès qu’il commence, quel est le problème ?
Grégory Mounié
Systèmes parallèles et distribués
2013-12
50 / 58
Intergiciels
Envoi et Réception Asynchrone
MPI permet de démarrer des communications puis d’attendre plus tard leur
fin.
MPI_Request req;
MPI_Status status;
MPI_IRecv(donnees, nb, MPI_INT,
emetteur, TGA, MPI_COMM_WORLD, &req);
...
MPI_Wait(&req, &status);
mais aussi MPI_Test(), MPI_Testall(), MPI_Testany(),
MPI_Testsome(), MPI_Waitall(), MPI_Waitany(), MPI_Waitsome()
Grégory Mounié
Systèmes parallèles et distribués
2013-12
51 / 58
Intergiciels
Envoi synchrone
L’envoi terminera après le début de la réception
MPI_Ssend(donnees, nb, MPI_INT,
destinataire, TAG, MPI_COMM_WORLD);
Grégory Mounié
Systèmes parallèles et distribués
2013-12
52 / 58
Intergiciels
Envoi tamponné
Les données seront copiées dans un tampon intermédiaire
MPI_Buffer_attach(& buffer, taille);
MPI_Bsend(donnees, nb, MPI_INT,
destinataire, TAG, MPI_COMM_WORLD);
MPI_Buffer_detach(& buffer, taille);
Cela à un coût non négligeable par rapport à une transmission avec 0 copie.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
53 / 58
Intergiciels
Envoi et réception simultanée
Le code d’échange précédent mais avec deux tampons différents.
if (rang != 0) {
MPI_Sendrecv(donnees, nb, MPI_DOUBLE, 0, STAG
donnees2, nb2, MPI_DOUBLE, 0, RTAG,
MPI_COMM_WORLD, & status);
} else {
for(int dest =1; dest < taille; dest++, donnees += nbR) {
MPI_Sendrecv(donnees, nb, MPI_DOUBLE, dest, STAG,
donnees2, nb2, MPI_DOUBLE, dest, RTAG,
MPI_COMM_WORLD, & status);
}
}
Grégory Mounié
Systèmes parallèles et distribués
2013-12
54 / 58
Intergiciels
Envoi prêt (ready) à être reçu
Le programmeur indique que la réception est déjà place.
MPI_Rsend(donnees, nb, MPI_INT,
destinataire, TAG, MPI_COMM_WORLD);
Grégory Mounié
Systèmes parallèles et distribués
2013-12
55 / 58
Intergiciels
Et encore MPI_Waitall(), MPI_Waitany(),
MPI_Waitsome()
Attente mais sans faire vraiment la réception : MPI_Probe
Version incomplète des envois
Grégory Mounié
Systèmes parallèles et distribués
2013-12
56 / 58
Intergiciels
Communication collective
1
2
3
4
5
6
7
8
9
10
11
12
13
14
MPI_Barrier(MPI_COMM_WORLD);
MPI_Bcast( donnees, 20, MPI_INT, root, MPI_COMM_WORLD );
MPI_Scatter( donnees, 20, MPI_INT,
donneesR, 20, MPI_INT,
root, MPI_COMM_WORLD);
MPI_Gather( donnees, 20, MPI_INT,
donneesR, 20, MPI_INT,
root, MPI_COMM_WORLD);
MPI_Allgather( donnees, 20, MPI_INT,
donneesR, 20, MPI_INT,
root, MPI_COMM_WORLD);
MPI_Reduce( donnees, donneesR, 20, MPI_INT,
OP, root, MPI_COMM_WORLD);
// OP: MPI_MAX, MPI_SUM, MPI_PROD, etc.
Grégory Mounié
Systèmes parallèles et distribués
2013-12
57 / 58
Intergiciels
Construction de type dérivé
les types de bases
MPI_CHAR, MPI_WCHAR, MPI_SHORT, MPI_INT, MPI_LONG,
MPI_FLOAT, MPI_DOUBLE, MPI_BYTE, etc.
Pour une structure
1
2
3
4
5
6
7
8
struct T { int a; float b; };
T tmp;
int nb=2;
int len[2] = {1, 1};
MPI_Aint indices[2] = { (&tmp.a) - (&tmp), (&tmp.b) - (&tmp)
MPI_Datatype old[2] = { MPI_INT, MPI_FLOAT };
MPI_Datatype new;
MPI_Type_struct( nb, len, indices, old, & new );
Grégory Mounié
Systèmes parallèles et distribués
2013-12
58 / 58

Documents pareils