pontiac firebird transam 81

Transcription

pontiac firebird transam 81
INF442 : Traitement des données massives
A2 : Le regroupement plat et le regroupement hiérarchique
Frank Nielsen
X2013
15 avril 2015
Administratif
dernier dépôt des TDs : le dimanche soir à 23h59m59s suivant le
mercredi du TD
élection du délégué de cours : ? ? ?
TD1 : ok, félicitations !
TD2 commence par l’exercice MPI du TD1.
tutorat langage C++ mis en place par la DE.
Deux créneaux : le mardi et le jeudi de 18h à 20h (Ivan Ustinov)
Voir les planches du memento C++ sous moodle
Rassurez-vous, TD 3 (détecteur de pourriels) et TD 4 (chiffrement de
Hill) sont bien moins copieux !
Projet informatique
responsable PIs : Claudia D’Ambrosio
[email protected]
3 choix pour le 20 avril 2015
PI validé le 23 avril 2015
Date de remise sous Moodle : ≤ 22 mai 2015
Soutenance PI : entre le 1er juin et le 12 juin 2015
Sujets/difficultés (* : facile , ** : moyen, *** : difficile) :
442-1
442-2
442-3
*
*
**
Lancer de rayon (image de synthèse)
PageRank (matrices)
CASP : Assessment Protein Structure Prediction
442-4
442-5
442-6
442-7
**
***
***
?
Graphes & arbres recouvrants (most vital edge)
Détecteur de Viola Jones (vision)
Repliement des protéines (biologie)
Projet au choix, sujet à rédiger et valider
S. Redon
P.L. Poirion
A. Héliou
& P. Chassignet
S. Toubaline
J.-B. Bordes
P. Chassignet
?
442-7 : Projet au choix en C++ (sans MPI) également possible.
HPC : quelques cas pour le Super-Computing (SC)
HPC = on recherche l’ efficacité !
Utiliser des modèles pour de la simulation parce que sinon c’est
difficile à construire (souffleries)
cher à construire (crash d’avion/voiture)
lent à attendre (évolution du climat, galaxies)
dangereux (armes, drogues, pollutions, épidémies)
Avoir des résultats rapides voire en ligne
on-line, incremental :
trop
trop
trop
trop
valeur temporelle du résultat (météo)
être le premier à avoir le résultat (bourse, trading HFT)
être le premier à avoir “une analyse” (incluant le coût de dévelopement)
Données massives, le Big Data :
analyse du génome/d’une famille de génomes
recherche d’intelligence extraterrestre (SETI)
Accélération, efficacité et scalabilité
tseq
tP
t1
:
:
:
temps écoulé par le programme séquentiel
... par programme parallèle sur P proc.
... par le programme parallèle exécuté en séquentiel, P = 1
bien sûr, t1 ≥ tseq sinon on aurait un meilleur algo. séquentiel
tseq
tseq
tP , souvent tP
tseq
speedup(P)
= P×t
P
P
Accélération : speedup(P) =
Efficacité : e(P) =
par rapport au speed-up linéaire, e(P) = 1 ⇔ tP =
Speed-up, efficiency
t1
tP
tseq
P
Loi d’Amdahl (1967) : un frein au parallélisme ?
gain de performance idéal :
α = fraction du code parallèlisable
αseq = fraction du code non-parallèlisable
avec αseq + α = 1
speedup(P) =
(αseq + α )t1
1
t1
=
=
α
tn
(αseq + P )t1
αseq +
lim speedup(P) =
P→∞
α
P
1
1
=
αseq
1 − α
⇒ accélération bornée par la fraction de code αseq non-parallèlisable (celle
qui est intrinséquement séquentielle)
Loi d’Amdahl : comportement asymptotique
20
18
16
14
speed−up
12
10
8
6
4
0.75
0.9
0.95
2
0
1
4
16
64
256
1024
nombre de processeurs (P)
4096
16384
65536
Loi d’Amdahl : un exemple visuel pour concrétiser
αseq = 20% et donc α = 80%
P =1
P=2
P=4
P →∞
P=8
seq
...
Temps
par
S=1
S=
5
3
S=
2
5
lim speedup(P) =
P→∞
S=
10
3
1
=⇒ speedup ≤ ×5
αseq
Est-ce alors intéressant d’avoir des grands clusters de machines ?
S=5
Loi de Gustafson : scale speed-up, à la rescousse !
Simulation : taille des mailles d’une grille 2D/3D = fonction de P
Vidéo : SD, HD, 4K, 8K, etc.
Concept = Charge de travail (workload) grandit linéairement avec P
n n’est pas fixé ! (= cas d’Amdahl)
t1 (P) = αseq tP + P × (α × tP )
speedupGustafson (P) = αseq + P × (1 − αseq )
Gustafson = parallélisme de données
.
Loi de Gustafson : un exemple visuel
Loi de Gustafson : speedup(P) = αseq + P × α . scale speed-up
P =1
P =2
P =4
P =8
seq
temps
par
n
2n
4n
8n
la taille des données n augmente
speedup(P) = 0.2 + 0.8 × P
Parfois, en pratique, on obtient un speed-up super-linéaire (hyper-linéaire),
qui s’explique par le cache hiérarchique des données
Pensez au cheminement complexe des données vers le processeur dans le
matériel !
Comparaison des lois d’Amdahl et de Gustafson
Amdahl : tP est une fonction de (t1 , α , P)
Gustafson : t1 est une fonction de (tP , α , P)
efficacité(P) =
accélération(P)
P
efficacité asymptotique d’Amdahl : limP→∞ eAmdahl (P) = 0.
Accélération toujours bornée .
efficacité asymptotique de Gustafson : limP→∞ eGustafson (P) = α .
Accélération non-bornée asymptotiquement.
... pas de contradiction car αseq de Gustafson = αseq d’Amdahl.
Loi de Moore (1975)
En fait, une loi empirique , une conjecture... que l’industrie essaye de
satisfaire !
nombre de transistors des processeurs double tous les 18 mois
Cluster de machines : une architecture à mémoire
distribuée
espace mémoire local associé à chaque processeur
processeurs connecté par un réseau d’interconnexion
accès mémoire aux autres processeurs explicite par échanges de
messages sur le réseau
le réseau d’interconnexion détermine la vitesse d’accès aux données
caractéristiques du réseau :
transmission avec modèle de coût α + τ × Longueur(message) :
latence : temps pour initier une communication (α)
bande passante : vitesse de transfert des données (τ )
topologie : architectures physique (matériel) et logique (utilisé par les
algorithmes //)
Processus
Les systèmes d’exploitation modernes sont multi-tâches : plusieurs
applications non-bloquantes peuvent tourner en “même temps” (time-slicing).
un seul processus en cours d’exécution sur le CPU à un instant donné,
un ordonnanceur de tâches qui alloue les processus aux CPUs/cœurs,
état d’un processus : en cours d’exécution, prêt en attente de CPU,
bloqué (suspendu/attente de réveil).
Cadre théorique : un processus tourne sur un processeur (mono-cœur) qui
constitue un nœud du cluster. P/Proc. (= processus, = processeur)
Tâches (jobs) sous UNIX
[ france ~] $ sleep 10000 &
[1] 12027
[ france ~] $ sleep 15000 &
[2] 12065
[ france ~] $ jobs
[1] - Running
[2]+ Running
[ france ~] $ kill %1
[1] - T e r m i n a t e d
[ france ~] $ fg %2
sleep 15000
sleep 10000 &
sleep 15000 &
sleep 10000
On suspend une tâche avec Ctrl-Z , et on la fait passer dans le fond avec bg
% (background)
Une tâche peut lancer plusieurs processus (souvent c’est un seul)
Tâches (jobs) sous UNIX : tuer une tâche
[ france ~] $ ps
PID TTY
TIME
10241 pts /0
00:00:00
12167 pts /0
00:00:00
[ france ~] $ sleep 10000
[1] 12169
[ france ~] $ ps -F
UID
PID PPID C
11234
10241 10240 0
11234
12169 10241 0
11234
12170 10241 0
[ france ~] $ kill 12169
[1]+ Terminated
CMD
bash
ps
&
SZ
1236
953
1132
RSS PSR STIME TTY
1456
6 10:08 pts /0
472
1 10:50 pts /0
900
1 10:50 pts /0
sleep 10000
TIME
00:00:00
00:00:00
00:00:00
CMD
- bash
sleep 10000
ps -F
Programmer avec la Message Passing Interface (MPI)
Multiple Program Multiple Data : MPMD
Single Program Multiple Data : SPMD
R 3).
Taxonomie de Flynn (1972). SPMD (GPU), MPMD (Playstation
MPI : le standard/la bibliothéque
Outre les calculs locaux sur chaque processus, on a aussi :
des mouvements de données via des envois et réceptions de messages
(broadcast, scatter, gather, all-to-all, etc.),
de la synchronisation (barrière où tous les processus s’attendent avant
de pouvoir continuer),
du calcul global (comme des opérations de sommes cumulées, reduce et
scan ou parallel prefix).
MPI : Les communications collectives usuelles
Concernent tous les processus d’un groupe de communication (souvent
WORLD)
P1
P2
P3
M
processus appelant
P0
message
M
diffusion
personnalisée
scatter
Mi
M
diffusion
broadcast
M
M
M1
M2
M3
Mi
messages personnalisés M1 , M2 , M3 à envoyer
M1
M2
M3
rassemblement
gather
M1
M2
M3
Mi
messages personnalisés M1 , M2 , M3 reçus
2
3
1
réduction
reduce
2
3
6
AVANT
APRÈS
1
MPI : Les communications collectives
un à tous (one-to-all) :
tous à un (all-to-one) :
La diffusion, Broadcast : MPI Bcast, message entier
La difusion personnalisée, Scatter : MPI Scatter, message partitionné en
morceaux
La réduction, Reduce : MPI Reduce, opération comme MPI SUM, etc.
Le rassemblement, Gather : MPI Gather, assemble le message à partir des
messages par morceaux
tous à tous (all-to-all, total exchange), le commérage : MPI Alltoall
MPI : les deux opérations de base send et receive
Communications bloquantes
send(&data, n, Pdest) :
Envoie n données pointées par &data au processeur Pdest
receive(&data,n, Psrc) :
Reçoit n données à l’adresse pointée par &data du processeur Psrc
Que se passe t’il dans ce petit exemple ?
P0
...
a=442;
send(&a, 1, P1);
a=0;
P1
...
receive(&a, 1, P0);
cout << a << endl;
Communications bloquantes (non-bufferisées)
⇒ provoque de l’attente (idling)
Envoyeur ou receveur doivent s’attendre mutuellement (hand-shaking).
M P I I n i t (& a r g c ,& a r g v ) ;
MPI Comm size (MPI COMM WORLD,& numprocs ) ;
MPI Comm rank (MPI COMM WORLD,& myid ) ;
t a g =442; s o u r c e =0; d e s t i n a t i o n =1; c o u n t =1;
i f ( myid == s o u r c e ) {
b u f f e r =2015;
MPI Send(& b u f f e r , cou n t , MPI INT , d e s t i n a t i o n , tag ,
MPI COMM WORLD) ;
p r i n t f ( ” Le p r o c e s s e u r %d a e n v o y e %d\n” , myid ,
buffer ) ;
}
i f ( myid == d e s t i n a t i o n ) {
MPI Recv(& b u f f e r , count , MPI INT , s o u r c e , tag ,
MPI COMM WORLD,& s t a t u s ) ;
p r i n t f ( ” Le p r o c e s s e u r %d a r e c u %d\n” , myid ,
buffer ) ;
}
...
t a g =442; s o u r c e =0; d e s t i n a t i o n =1; c o u n t =1;
i f ( myid == s o u r c e ) {
b u f f e r =2015;
MPI Send(& b u f f e r , cou n t , MPI INT , d e s t i n a t i o n , tag ,
MPI COMM WORLD) ;
p r i n t f ( ” Le p r o c e s s e u r %d a e n v o y e %d\n” , myid ,
buffer ) ;
}
i f ( myid == d e s t i n a t i o n ) {
MPI Recv(& b u f f e r , count , MPI INT , s o u r c e , tag ,
MPI COMM WORLD,& s t a t u s ) ;
p r i n t f ( ” Le p r o c e s s e u r %d a r e c u %d\n” , myid ,
buffer ) ;
}
...
Le processeur 0 a envoye 2015
Le processeur 1 a recu 2015
Minimiser les temps d’attente
Pour des communications bloquantes, on cherche donc à minimiser le temps
d’attente (on verra plus tard l’équilibrage de charge, le load balancing).
Temps d’attente pour le receveur
Receveur prêt avant l’envoyeur (communications bloquantes)
MPI : les situations de blocages (deadlocks)
Que se passe t’il dans cet exemple ?
P0
send(&a, 1, P1);
receive(&b, 1, P1);
P1
send(&a, 1, P0);
receive(&b, 1, P0);
Envoyeur P0 attend le “OK pour envoi” de P1
Envoyeur P1 attend le “OK pour envoi” de P0
Ça bloque. On est en situation de deadlock !
(Ctrl-C pour tuer le programme...)
Programmer avec MPI peut-être complexe à déboguer
MPI : les blocages (deadlocks)
Les communications bloquantes sont nécessaires pour assurer la
consistence (sémantique) des programmes mais font apparaı̂tre des
situations indésirables de blocage.
Pour le send, on peut pré-allouer un espace mémoire “buffer données”
(Data buffer, DB) à chaque processus, puis envoyer les données en deux
temps :
Envoi sur le Data Buffer DB,
Sur le processeur receveur, recopie le DB à l’endroit &data,
Implanté soit matériellement soit par un protocole logiciel.
Néanmoins, il subsiste toujours une situation de blocage lorsque le buffer
de données DB devient plein
MPI : les blocages (deadlocks)
Même si on gère bien les appels send, le problème du deadlock subsiste.
Le problème des receive...
P0
receive(&a, 1, P1);
send(&b, 1, P1);
⇒ blocage
P1
receive(&a, 1, P0);
send(&b, 1, P0);
MPI : Send/Receive non-bloquantes et non-bufferisées
Comment envoyer/recevoir des messages avec des communications
non-bloquantes...
L’envoyeur poste un message “Demande d’envoi” (pending message) et
continue l’exécution de son programme,
Le receveur poste un “OK pour envoi”, et le transfert de données
s’effectue,
Quand le transfert de données est fini, un check status indique qu’on
peut toucher aux données sans danger
⇒ communications non-bloquantes
commnonbloq442.cpp
M P I S t a t u s s t a t u s ; M PI Request r e q u e s t ;
M P I I n i t (& a r g c ,& a r g v ) ;
MPI Comm size (MPI COMM WORLD,& numprocs ) ;
MPI Comm rank (MPI COMM WORLD,& myid ) ;
t a g =442; s o u r c e =0; d e s t i n a t i o n =1; c o u n t =1;
r e q u e s t=MPI REQUEST NULL ;
i f ( myid == s o u r c e ) {
b u f f e r =2015;
M P I I s e n d (& b u f f e r , cou n t , MPI INT , d e s t i n a t i o n , tag ,
MPI COMM WORLD,& r e q u e s t ) ;
}
i f ( myid == d e s t i n a t i o n ) {
M P I I r e c v (& b u f f e r , cou n t , MPI INT , s o u r c e , tag ,
MPI COMM WORLD,& r e q u e s t ) ;
}
MPI Wait(& r e q u e s t ,& s t a t u s ) ;
p r i n t f ( ” [ p r o c %d ] s t a t u s de MPI WAIT : %d\n” , myid ,
status ) ;
i f ( myid == s o u r c e ) {
p r i n t f ( ” Le p r o c e s s e u r %d
buffer ) ;
}
i f ( myid == d e s t i n a t i o n ) {
p r i n t f ( ” Le p r o c e s s e u r %d
, buffer ) ;
}
a e n v o y e %d\n” , myid ,
a b i e n r e c u %d\n” , myid
attente avec MPI_WAIT ...
attente avec MPI_WAIT ...
[ proc 0] status de MPI_WAIT : 0
Le p r o c e s s e u r 0 a envoye 2015
[ proc 1] status de MPI_WAIT : 0
Le p r o c e s s e u r 1 a bien recu 2015
MPI : Les six routines standards sont...
procédures , types de données et constantes sont préfixées par MPI
(fichier mpi.h)
100+ procédures dont les six principales sont :
Initialisation de la bibliothèque
MPI Init
MPI Finalize Termine l’utilisation de MPI
MPI Comm size Donne le nombre de processus
MPI Comm rank Étiquette du processus appelant
Envoi un message (bloquant)
MPI Send
Reçoit un message (bloquant)
MPI Recv
Ces procédures retournent MPI SUCCESS en cas de succès, sinon un code
d’erreur.
Quelques hypothèses sur la concurrence
le processeur (ou PE) peut effectuer plusieurs “choses” en même temps
Par exemple, on peut supposer
il faut donc que ces 3 opérations soient indépendantes !
MPI IRecv(), non-bloquant
MPI ISend(), non-bloquant
+ calcul local
donc on ne peut pas envoyer le résultat du calcul
on ne peut pas forwarder = envoyer ce que l’on reçoit
en pseudo-code, on note les activités concurrentes par ||
(une double barre)
Activité1 ||Activité2 ||Activité3
MPI : Les types de données enMPI
Ce qu’on envoie/reçoı̂t... MPI_Commande(&buffer,count,MPI_INT, ...)
Type MPI
MPI CHAR
MPI SHORT
MPI INT
MPI LONG
MPI UNSIGNED CHAR
MPI UNSIGNED SHORT
MPI UNSIGNED
MPI UNSIGNED LONG
MPI FLOAT
MPI DOUBLE
MPI LONG DOUBLE
MPI BYTE
MPI PACKED
Type dans le langage C
signed char
signed short int
signed int
signed long int
unsigned char
unsigned short int
unsigned int
unsigned long int
float
double
long double
MPI : La primitive send
https://www.open-mpi.org/doc/v1.4/man3/MPI_Send.3.php
Syntaxe en C :
#i n c l u d e <mpi . h>
i n t MPI Send ( v o i d ∗ buf , i n t count , M PI D a t a t y p e
d a t a t y p e , i n t d e s t , i n t tag , MPI Comm comm)
Syntaxe en C++ (plus mis à jour depuis MPI-2) :
#i n c l u d e <mpi . h>
v o i d Comm : : Send ( c o n s t v o i d ∗ buf , i n t count , c o n s t
D a t a t y p e& d a t a t y p e , i n t d e s t , i n t t a g ) c o n s t
tag : Message tag (integer), utile pour la filtration et l’appariemment des
opérations send/receive. Par défault, tag=0
On utilise la syntaxe d’appel en C du MPI dans nos programmes C++
MPI : les communications non-bloquantes (C API) “I”
i n t M P I I s e n d ( v o i d ∗ buf , i n t count , M PI D a t a t y p e
d a t a t y p e , i n t d e s t , i n t tag , MPI Comm comm ,
M P I Request ∗ r e q )
i n t M P I I r e c v ( v o i d ∗ buf , i n t count , M PI D a t a t y p e
d a t a t y p e , i n t s r c , i n t tag , MPI Comm comm ,
M P I Request ∗ r e q )
L’objet MPI Request est utilisé dans les routines suivantes :
Retourne *flag=1 si l’opération *req est finie, 0 sinon
i n t MPI Test ( M PI Request ∗ req , i n t ∗ f l a g , M P I S t a t u s
∗ status )
Attend jusqu’à ce que l’opération associée avec *req soit finie.
i n t MPI Wait ( M PI Request ∗ req , M P I S t a t u s ∗ s t a t u s )
MPI : les groupes de communication, communicators
Défini le cadre des opérations de communication,
Chaque processus inclus dans un communicator a un rang associé,
Par défaut, MPI COMM WORLD inclut tous les p processus, rang de 0 à
p − 1,
On peut créer des communicators pour des groupes de processus,
int MPI Comm size(MPI Comm comm, int *size) et int
MPI Comm rank(MPI Comm comm, int *size)
Barrière de synchronisation : MPI Barrier
MPI Barrier : Bloque jusqu’à temps que tous les processus arrivent à cette
routine = synchronisation !
Barrière de synchronisation
Barrière de synchronisation
Mesurer le temps sous MPI : MPI Wtime
double start, end;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
start = MPI_Wtime();
/* faire le calcul ici */
calculINF442();
MPI_Barrier(MPI_COMM_WORLD); /* IMPORTANT */
end = MPI_Wtime();
MPI_Finalize();
if (rank == 0) {cout<< end-start <<endl;}
Ou alors utiliser MPI Reduce() pour calculer les temps minima/maxima (et
autres statistiques) des processus...
MPI : Calcul globaux Reduce
C:
#i n c l u d e <mpi . h>
i n t MPI Reduce ( v o i d ∗ s e n d b u f , v o i d ∗ r e c v b u f , i n t count
, M PI D a t a t y p e d a t a t y p e , MPI Op op , i n t r o o t ,
MPI Comm comm)
https://www.open-mpi.org/doc/v1.5/man3/MPI_Reduce.3.php
Arbre de réduction (dépend de la topologie)
(+ 1 2 3 4)
(+ (+ 1 2) (+ 3 4))
MPI : Reduce, opérations de calcul prédéfinies
Opérateur binaire associatif et commutatif
Nom
MPI MAX
MPI MIN
MPI SUM
MPI PROD
MPI LAND
MPI BAND
MPI LOR
MPI BOR
MPI LXOR
MPI BXOR
MPI MAXLOC
MPI MINLOC
Signification
maximum
minimum
sum
product
logical and
bit-wise and
logical or
bit-wise or
logical xor
bit-wise xor
max value and location
min value and location
Calcul de la factorielle...factoriellempireduce442.cpp
i n t i , moi , n p r o c s ;
i n t nombre , g l o b a l F a c t =−1, l o c a l F a c t ;
M P I I n i t (& a r g c ,& a r g v ) ;
MPI Comm size (MPI COMM WORLD,& n p r o c s ) ;
MPI Comm rank (MPI COMM WORLD,& moi ) ;
nombre=moi +1;
// dans l e s argum e nts , s e r a p p e l e r l ’ o r d r e ( s o u r c e , d e s t i n a t i o n )
MPI Reduce(&nombre ,& g l o b a l F a c t , 1 , MPI INT , MPI PROD , 0 ,MPI COMM WORLD) ;
i f ( moi==0)
{ p r i n t f ( ” f a c t o r i e l l e a v e c r e d u c e p o u r %d p r o c e s s u s = %d\n ” , n p r o c s , g l o b a l F a c t ) ; }
l o c a l F a c t =1; f o r ( i =0; i <n p r o c s ; i ++) { l o c a l F a c t ∗=( i +1) ; }
i f ( moi==0)
{ p r i n t f ( ” f a c t o r i e l l e l o c a l e : %d\n ” , l o c a l F a c t ) ; }
MPI Finalize () ;
MPI : Les commandes Scan/ Préfixe parallèle
i n t MPI Scan ( v o i d ∗ s e n d b u f , v o i d ∗ r e c v b u f , i n t count ,
M P I D a t a t y p e d a t a t y p e , MPI Op op , MPI Comm comm )
processus
entrée (vi )
sortie
P0
1
1
P1
2
3 (= 1 + 2)
P2
3
6 (= 1 + 2 + 3)
P3
4
10 (= 1 + 2 + 3 + 4)
a+b+c+d
P0
a
b
P1
b
c
c
P2
c
a+b+c+d
P3
d
d
P3
d
a+b+c+d
P0
a0
b0
c0
P1
a1
b1
c1
P2
a2
b2
c2
P0
a
P1
b
P2
a+b+c+d
reduce
scan
Allreduce
a+b+c+d
a0
b0
c0
a0 + a 1
b0 + b1
c0 + c1
a0 + a 1 + a 2
b0 + b1 + b 2
c0 + c1 + c2
Algorithme parallèle pour les
k-moyennes
Frank Nielsen
Parallel k-means
MPI
4.k-moyennes sous MPI
A2-47
Parallélisation : propriété de composition du centroı̈de
Soit X et X deux jeux de données pondérés avec leurs sommes des poids
totaux W et W (X ∩ X = ∅). Alors on a la règle de composition :
x̄(X ∪ X ) =
W
W
x̄(X
)
+
x̄ (X )
W + W
W +W
Très utile pour partager le calcul des données sur plusieurs processeurs...
On fait des paquets X1 , ..., Xp équilibrés de taille pn
Propriété forte de la géométrie Euclidienne (pas vrai en géométrie
hyperbolique)
Frank Nielsen
4.k-moyennes sous MPI
A2-48
Règle de composition : preuve élémentaire
Prenons X ∩ X = ∅.
x̄(X ∪ X ) =
W
W
x̄(X ) +
x̄ (X )
W +W
W +W
x̄(X ) =
1 x
|X |
x∈X
1
x̄(X ∪ X ) =
|X | + |X |
x∈X
x = |X |x̄(X ),
x+
x∈X
x
x ∈X x = |X |x̄(X )
x ∈X W = |X | et W = |X |, idem pour des poids arbitraires W et W .
Frank Nielsen
4.k-moyennes sous MPI
A2-49
Parallélisation de l’heuristique de Lloyd
Soit p processeurs P0 , ..., Pp−1 , tous les processeurs lisent leurs
(tient dans la mémoire vive, RAM).
Utilisons
la propriété de décomposition des centroı̈des :
1
x̄(X ) = p−1
i =0 p x̄(Xp ).
n
p
données
Un des processeurs, disons P0 s’occupe de l’initialisation des centroides,
puis diffuse (broadcast) cette initialisation à tous les autres processeurs.
En MPI, commande MPI Bcast.
Chaque processeur Pr s’occupe d’ un paquet de pn données
Xr = {xr np ...x(r +1) np −1 } en calculant la distance minimale de ses xi aux
centres. On met à jour la fonction de coût et on calcule les centroı̈des et
cardinalité indépendamment dans chaque paquet : G1 (r ), ..., Gk (r ) avec
n1 (r ) = |G1 (r )|, ..., nk (r ) = |Gk (r )|.
Puis on réduit (opération reduce) tous les cj (r ) et nj (r ) en faisant la
somme (opération dédiée de MPI) : MPI Allreduce
On répéte jusqu’à convergence (ou lorsque la décroissance de la fonction
de coût passe sous un seuil donné).
Frank Nielsen
4.k-moyennes sous MPI
A2-50
Frank Nielsen
4.k-moyennes sous MPI
A2-51
Les k-moyennes en MPI : analyse de la complexité
Algorithme séquentiel : O(dnks), s : nombre d’itérations (Lloyd).
Les opérations élémentaires comme Reduce, Bcast, etc. dépendent de la
topologie du réseau d’interconnexion .
Initialisation des centroı̈des par le processeur P0 en temps O(dk)
Coût total :
O dk + Bcast(p, dk) + s
dkns
dn
+ Reduce(p, dk)
∼n>>k,d O
p
p
→ Facteur d’accélération
rapport du temps séquentiel sur le
(speed-up,
= O(p).
temps parallèle) α = O dkns
dkns
p
Philosophie différente de MapReduce (Hadoop) : Autre modèle de calcul
distribué simple.
Frank Nielsen
4.k-moyennes sous MPI
A2-52
Les k-moyennes : Un clustering
par partition
= clustering plat
vs
Regroupement hiérarchique
Frank Nielsen
5.Regroupement
A2-53
Trouver des liens de proximité entre les données
Mazda RX4
Mazda RX4 Wag
Datsun 710
Hornet 4 Drive
Hornet Sportabout
Valiant
Duster 360
Merc 240 D
Merc 230
Merc 280
Merc 280 C
Merc 450 SE
Merc 450 SL
Merc 450 SLC
Cadillac Fleetwood
Lincoln Continental
Chrysler Imperial
Fiat 128
Honda Civic
Toyota Corolla
Toyota Corona
Dodge Challenger
AMC Javelin
Camaro Z28
Pontiac Firebird
Fiat X1 -9
Porsche 914 -2
Lotus Europa
Ford Pantera L
Ferrari Dino
Maserati Bora
Volvo 142 E
Frank Nielsen
mpg cyl disp hp drat
wt qsec vs am gear carb
21.0
6 160.0 110 3.90 2.620 16.46 0 1
4
4
21.0
6 160.0 110 3.90 2.875 17.02 0 1
4
4
22.8
4 108.0
93 3.85 2.320 18.61 1 1
4
1
21.4
6 258.0 110 3.08 3.215 19.44 1 0
3
1
18.7
8 360.0 175 3.15 3.440 17.02 0 0
3
2
18.1
6 225.0 105 2.76 3.460 20.22 1 0
3
1
14.3
8 360.0 245 3.21 3.570 15.84 0 0
3
4
24.4
4 146.7
62 3.69 3.190 20.00 1 0
4
2
22.8
4 140.8
95 3.92 3.150 22.90 1 0
4
2
19.2
6 167.6 123 3.92 3.440 18.30 1 0
4
4
17.8
6 167.6 123 3.92 3.440 18.90 1 0
4
4
16.4
8 275.8 180 3.07 4.070 17.40 0 0
3
3
17.3
8 275.8 180 3.07 3.730 17.60 0 0
3
3
15.2
8 275.8 180 3.07 3.780 18.00 0 0
3
3
10.4
8 472.0 205 2.93 5.250 17.98 0 0
3
4
10.4
8 460.0 215 3.00 5.424 17.82 0 0
3
4
14.7
8 440.0 230 3.23 5.345 17.42 0 0
3
4
32.4
4 78.7 66 4.08 2.200 19.47 1 1
4
1
30.4
4 75.7 52 4.93 1.615 18.52 1 1
4
2
33.9
4 71.1 65 4.22 1.835 19.90 1 1
4
1
21.5
4 120.1
97 3.70 2.465 20.01 1 0
3
1
15.5
8 318.0 150 2.76 3.520 16.87 0 0
3
2
15.2
8 304.0 150 3.15 3.435 17.30 0 0
3
2
13.3
8 350.0 245 3.73 3.840 15.41 0 0
3
4
19.2
8 400.0 175 3.08 3.845 17.05 0 0
3
2
27.3
4 79.0 66 4.08 1.935 18.90 1 1
4
1
26.0
4 120.3
91 4.43 2.140 16.70 0 1
5
2
30.4
4 95.1 113 3.77 1.513 16.90 1 1
5
2
15.8
8 351.0 264 4.22 3.170 14.50 0 1
5
4
19.7
6 145.0 175 3.62 2.770 15.50 0 1
5
6
15.0
8 301.0 335 3.54 3.570 14.60 0 1
5
8
21.4
4 121.0 109 4.11 2.780 18.60 1 1
4
2
5.Regroupement
A2-54
Frank Nielsen
50
100
Ferrari Dino
Honda Civic
Toyota Corolla
Fiat 128
Fiat X1−9
Mazda RX4
Mazda RX4 Wag
Merc 280
Merc 280C
Merc 240D
Lotus Europa
Merc 230
Volvo 142E
Datsun 710
Toyota Corona
Porsche 914−2
Maserati Bora
Hornet 4 Drive
Valiant
Merc 450SLC
Merc 450SE
Merc 450SL
Dodge Challenger
AMC Javelin
Chrysler Imperial
Cadillac Fleetwood
Lincoln Continental
Ford Pantera L
Duster 360
Camaro Z28
Hornet Sportabout
Pontiac Firebird
0
hauteur
150
200
250
Regroupement hierarchique (distance moyenne)
5.Regroupement
A2-55
Les sciences du vivant adorent le regroupement
hiérarchique !
Gene expression patterns of breast carcinomas distinguish tumor subclasses
with clinical implications http://www.pnas.org/content/98/19/10869.figures-only
Frank Nielsen
5.Regroupement
A2-56
Le regroupement hiérarchique : reconnaissance de visages
Hierarchical Clustering With Prototypes via Minimax Linkage, 2011.
Frank Nielsen
5.Regroupement
A2-57
Le clustering/regroupement hiérarchique ascendant
On part des données X = {x1 , ..., xn } qui sont des feuilles et on fusionne
iérativement au fur et à mesure les sous-arbres jusqu’à ne plus qu’avoir un
seul arbre. Les feuilles initiales forment une forêt d’arbres à une feuille, puis
on fait de la fusion d’arbres...
Plusieurs critères pour la fusion de deux sous-arbres (dont les sous-ensembles
de données Gi et Gj sont stockées dans leurs feuilles). On calcule Δ(Gi , Gj )
la distance entre deux sous-ensembles.
stratégie du saut minimum :ΔSL → Single Linkage (SL)
stratégie du saut maximum (ou diamètre) : ΔCL → Complete Linkage
(CL)
stratégie du saut moyen : ΔGA → Group Average (GA)
⇒ algorithme glouton : Choix itératif de la meilleure paire de groupes (avec
tie-breaking rule)
Frank Nielsen
5.Regroupement
A2-58
Pour se fixer une idée : saut moyen, Single Linkage (SL)
Fonction de chaı̂nage entre deux groupes
Δ(Gi , Gj ) =
min
xi ∈Gi ,xj ∈Gj
D(xi , xj )
où D(x, y ) est une distance élémentaire .
⇒ regroupement hiérarchique agglomératif avec un saut minimum
(nearest-neighbor clustering)
Frank Nielsen
5.Regroupement
A2-59
Quelle distance élémentaire entre deux données ?
On doit toujours avoir bien entendu Δ({xi }, {xj }) = D(xi , xj ).
Exemples de distances élémentaires :
d
2
Distance Euclidienne (L2 ) : D(p, q) =
i =1 (pi − qi )
d
Distance de Manhattan (city block, L1 ) : D1 (p, q) =
i =1 |pi − qi |
Distance de Minkowski induite par Lp :
Dp (p, q) =
d
p1
|pi − qi |p
i =1
Distance de Mahalanobis :
DΣ (p, q) = (p − q) Σ−1 (p − q) = D(L p, L q),
avec Σ−1 = L L provenant de la factorisation de Cholesky
Métrique, non-métrique, distance & similarité, etc.
Frank Nielsen
5.Regroupement
A2-60
Le clustering par agglomération
Hierarchical Cluster Analysis (HCA) : regroupement hiérarchique
Initialiser xi dans un cluster singleton Gi = {xi }
Tant qu’il reste au moins deux clusters :
Choisir Gi et Gj tel que Δ(Gi , Gj ) soit minimal
Fusionner Gi ,j = Gi ∪ Gj (ajouter Gi ,j et retirer Gi et Gj )
Retourner le dernier nœud comme la racine de l’arbre de fusion
⇒ le résultat d’un regroupement hiérarchique est un arbre binaire appelé
dendrogramme . On fusionne n − 1 fois (les étapes de fusion).
Différent d’un algorithme de partitionnement comme les k-moyennes :
Clustering hiérarchique = not Clustering plat (par partition)
Ici, pas de fonction de coût globale à optimiser mais un algorithme de fusion
Frank Nielsen
5.Regroupement
A2-61
Distance de chaı̂nage Δ(Gi , Gj )
Single Linkage
saut minimum
Complete Linkage
saut maximum
diamètre
Group Average
saut moyen
Algorithme glouton :
arg min Δ(Gi , Gj )
i ,j=i
⇒ les groupes Gi et Gj sont voisins réciproques !
Gi = PPVG (Gj ) = arg minG ∈G Δ(Gj , G ).
Gj = PPVG (Gi ) = arg minG ∈G Δ(Gi , G ).
PPV = Plus Proche Voisin. G : ensemble des groupes.
Frank Nielsen
5.Regroupement
A2-62
Dessinons un dendrogramme...
Par exemple, choisissons la hauteur comme le nombre d’ étapes de fusion :
hauteur :
nombre de fusions
3
I,N,F,4,4,2
I, N
1
0
4, 4, 2 nœuds internes
I, N, F
2
I
4, 4
N
F
4
4
2
feuilles
Dendrogramme = Graphique d’un arbre binaire, enraciné et plongé dans le
plan.
Frank Nielsen
5.Regroupement
A2-63
Autre visualisation de la hiérarchie par inclusion
I,N,F,4,4,2
I, N, F
4, 4, 2
I, N
I
4
F
2
4
4, 4
N
I
N
F
4
4
2
nested clusters
Frank Nielsen
5.Regroupement
A2-64
Le clustering hiérarchique : single linkage (SL)
Δ(Gi , Gj ) =
min
xi ∈Gi ,xj ∈Gj
D(xi , xj )
Répeter tant que toutes les données xi ne soient pas contenues dans un seul
cluster, on fusionne les deux groupes les plus proche. À chaque instant tous
les sous-arbres forment une forêt (partitition de X ).
Single linkage → nearest-neighbor clustering
S’il existe plus d’une paire de groupes donnant le Δ minimal, on choisit
un ordre (lexicographique). Si on fait une permutation sur les données, on
n’obtiendra pas le même dendrogramme : unicité .
Problème de chaı̂nage (artefact) dans le clustering final
Complexité : naı̈f O(n3 ), algorithme SLINK en O(n2 ) (1973), temps
quadratique et espace linéaire en utilisant l’arbre recouvrant de poids
minimal (MST : Minimum Spanning Tree, 1969).
Frank Nielsen
5.Regroupement
A2-65
Frank Nielsen
20
40
Ford Pantera L
Duster 360
Camaro Z28
Chrysler Imperial
Cadillac Fleetwood
Lincoln Continental
Hornet Sportabout
Pontiac Firebird
Merc 450SLC
Merc 450SE
Merc 450SL
Dodge Challenger
AMC Javelin
Hornet 4 Drive
Valiant
Ferrari Dino
Honda Civic
Toyota Corolla
Fiat 128
Fiat X1−9
Merc 240D
Mazda RX4
Mazda RX4 Wag
Merc 280
Merc 280C
Lotus Europa
Merc 230
Datsun 710
Volvo 142E
Toyota Corona
Porsche 914−2
0
hauteur
Maserati Bora
60
80
Regroupement hierarchique (saut minimum)
5.Regroupement
A2-66
Le clustering hiérarchique : Complete Linkage
Complete linkage (CL) : CLINK in O(n2 ) (1977)
ΔCL (Gi , Gj ) =
max
xi ∈Gi ,xj ∈Gj
D(xi , xj ) ,
appelé aussi diamètre .
Problème du diamètre : si un point artefact (outlier) est très éloigné des
autres, la distance inter-groupe devient grande (et n’est pas significative).
Complete linkage → furthest-neighbor clustering
Frank Nielsen
5.Regroupement
A2-67
Frank Nielsen
100
Maserati Bora
Chrysler Imperial
Cadillac Fleetwood
Lincoln Continental
Ford Pantera L
Duster 360
Camaro Z28
Hornet Sportabout
Pontiac Firebird
Hornet 4 Drive
Valiant
Merc 450SLC
Merc 450SE
Merc 450SL
Dodge Challenger
AMC Javelin
Honda Civic
Toyota Corolla
Fiat 128
Fiat X1−9
Ferrari Dino
Lotus Europa
Merc 230
Volvo 142E
Datsun 710
Toyota Corona
Porsche 914−2
Merc 240D
Mazda RX4
Mazda RX4 Wag
Merc 280
Merc 280C
0
hauteur
200
300
400
Regroupement hierarchique (saut maximum)
5.Regroupement
A2-68
Le clustering hiérarchique : Average Linkage
Average Linkage (AL) : O(n2 ) (1984)
ΔAL (Gi , Gj ) =
1 D(xi , xj )
ni nj
xi ∈Gi xj ∈Gj
La moyenne de toutes les paires de distance !
Frank Nielsen
5.Regroupement
A2-69
Frank Nielsen
50
100
Ferrari Dino
Honda Civic
Toyota Corolla
Fiat 128
Fiat X1−9
Mazda RX4
Mazda RX4 Wag
Merc 280
Merc 280C
Merc 240D
Lotus Europa
Merc 230
Volvo 142E
Datsun 710
Toyota Corona
Porsche 914−2
Maserati Bora
Hornet 4 Drive
Valiant
Merc 450SLC
Merc 450SE
Merc 450SL
Dodge Challenger
AMC Javelin
Chrysler Imperial
Cadillac Fleetwood
Lincoln Continental
Ford Pantera L
Duster 360
Camaro Z28
Hornet Sportabout
Pontiac Firebird
0
hauteur
150
200
250
Regroupement hierarchique (distance moyenne)
5.Regroupement
A2-70
Frank Nielsen
5.Regroupement
A2-71
Critère de fusion de Ward : la variance
Variance = somme des distances euclidiennes au carré par rapport au
centroı̈de :
1 x − c(X )2 , c(X ) =
x
v (X ) =
|X |
x∈X
x∈X
Distance entre clusters (critère de Ward) pour Gi (ni = |Gi |) et Gj
(nj = |Gj |) :
Δ(Gi , Gj ) = v (Gi ∪ Gj ) − (v (Gi ) + v (Gj ))) =
ni nj
c(Gi ) − c(Gj )2 ≥ 0
ni + nj
Δ({xi }, {xj }) = D(xi , xj ) = xi − xj 2
Quand on fusionne deux groupes, la variance ne peut pas diminuer !
Quand on rajoute des clusters, la somme pondérée des variances diminue
Δ(Gi , Gj ) = k-moyennes(Gi ∪ Gj ) − (k-moyennes(Gi ) + k-moyennes(Gj ))
Frank Nielsen
5.Regroupement
A2-72
50
hauteur
Frank Nielsen
Honda Civic
Toyota Corolla
Fiat 128
Fiat X1−9
Merc 240D
Lotus Europa
Merc 230
Volvo 142E
Datsun 710
Toyota Corona
Porsche 914−2
Ferrari Dino
Mazda RX4
Mazda RX4 Wag
Merc 280
Merc 280C
Hornet 4 Drive
Valiant
Merc 450SLC
Merc 450SE
Merc 450SL
Dodge Challenger
AMC Javelin
Maserati Bora
Ford Pantera L
Duster 360
Camaro Z28
Chrysler Imperial
Cadillac Fleetwood
Lincoln Continental
Hornet Sportabout
Pontiac Firebird
Hornet 4 Drive
Valiant
Merc 450SLC
Merc 450SE
Merc 450SL
Dodge Challenger
AMC Javelin
Chrysler Imperial
Cadillac Fleetwood
Lincoln Continental
Ford Pantera L
Duster 360
Camaro Z28
Hornet Sportabout
Pontiac Firebird
0
Honda Civic
Toyota Corolla
Fiat 128
Fiat X1−9
Mazda RX4
Mazda RX4 Wag
Merc 280
Merc 280C
Merc 240D
Lotus Europa
Merc 230
Volvo 142E
Datsun 710
Toyota Corona
Porsche 914−2
100
500
hauteur
1000
150
1500
Maserati Bora
Ferrari Dino
0
2000
200
2500
250
Regroupement hierarchique (distance moyenne)
Regroupement hierarchique (Ward)
x
INF442 (voitures)
x
INF442 (voitures)
Average Group
Critère de Ward
5.Regroupement
A2-73
Le clustering descendant hiérarchique par division
Version top-down : on part d’un cluster contenant toutes les données X
et on divise récursivement jusqu’à temps qu’on obtienne les n feuilles
qui contiennent les données individuelles.
Pour casser un cluster en deux, on utilise un algorithme de clustering par
partitionnement pour k = 2 (comme celui des k-moyennes par exemple)
En général, plus coûteux qu’un regroupement hiérarchique agglomératif
(bottom-top)
Frank Nielsen
5.Regroupement
A2-74
Frank Nielsen
87
7
51
19
73
85
9
33
94
8
22
63
11
4
31
18
21
86
44
25
20
40
48
39
93
92
15
83
5
32
12
89
30
53
27
38
17
62
23
69
16
2
76
43
50
59
96
90
41
36
34
49
61
70
68
56
55
95
14
24
67
28
35
99
84
74
75
54
58
3
65
81
45
98
46
52
72
37
91
100
88
1
29
6
97
47
71
66
60
78
79
57
77
10
13
42
80
26
64
82
0.0
0.5
1.0
1.5
hauteur
2.0
2.5
Dendrogramme : obtenir des partitions à partir du
dendrogramme
Pour k ∈ [n] = {1, ..., n}, on peut extraire des partitions en k-sous-ensembles
de X .
Regroupement hierarchique
5.Regroupement
INF442
x
A2-75
Convertir un clustering hiérarchique en une partition
Si on ne choisit pas k mais une valeur de seuillage...
Parcourir récursivement l’arbre et on arrête la récursivité quand
Δ(nœud) = Δ(nœudfils gauche , nœudfils droit ) ≤ seuil
saut maximum (CL, diamètre) : les clusters ont un diamètre ≤ seuil
(hauteur constante)
chaı̂nage de Ward : les clusters ont une variance ≤ seuil (hauteur pas
constante car inversions)
Frank Nielsen
Δ < Δ∗
Δ < Δ∗
5.Regroupement
A2-76
Convertir un clustering hiérarchique en une partition
Si on veut choisir k...
Clustering hiérarchique → Clustering plat (partition)
On choisit une hauteur pour trouver une partition en k clusters
Meilleure hauteur par Programmation Dynamique. Meilleure hauteur pour
T (X ) à k sous-ensembles :
Fit(T = (L, R), k) =
min
k1 ,k2 k1 +k2 =k
Fit(L, k1 ) + Fit(R, k2 )
Pour les k-moyennes (clustering plat, NP-dur en général) on obtient une
k-partition optimale à partir d’un clustering hierarchique (facile à
calculer, SL) sous l’hypothèse de satisfaire un critère de séparabilité.
Frank Nielsen
5.Regroupement
A2-77
Distances : métriques et ultra-métriques
Une distance d(·, ·) est :
métrique si elle satisfait les axiomes :
d(x, y ) ≥ 0 avec égalité pour x = y seulement
d(x, y ) = d(y , x) symétrie
d(x, y ) ≤ d(x, z) + d(z, y ), inégalité triangulaire
ultra-métrique si elle satisfait les axiomes :
Frank Nielsen
d(x, y ) ≥ 0 avec égalité pour x = y seulement
d(x, y ) = d(y , x) symétrie
d(x, y ) ≤ max(d(x, z), d(z, y ))
5.Regroupement
A2-78
Distance et évolution (horloge)
Dans les arbres phylogénétiques, la distance entre deux espèces impose des
restrictions sur la fonction distance.
Arbre additif (additive tree) : poids sur chaque arête tel que pour
chaque paire de feuilles, la distance est la somme des distances des arêtes
les reliant.
Arbre ultramétrique : distances entre deux feuilles Gi et Gj et leur
ancêtre commun Gk sont égales : di ,k = dj,k .
hk = 12 di ,j (hauteur) correspond au temps écoulé
permet de définir une horloge globale sur l’axe vertical
Frank Nielsen
5.Regroupement
A2-79
Dendrogrammes et arbres phylogénétiques
Frank Nielsen
5.Regroupement
A2-80
Regroupement hiérarchique avec l’algorithme UPGMA
UPGMA : Unweighted Pair Group Method using arithmetic Averages
Clustering hiérarchique avec la distance de chaı̂nage Average Linkage
(AL) :
Δ(Gi , Gj ) =
1 D(xi , xj ) = Δi ,j
ni nj
xi ∈Gi xj ∈Gj
UPGMA garantie de produire un arbre ultramétrique
Frank Nielsen
5.Regroupement
A2-81
Regroupement hiérarchique par UPGMA
Initialise xi a son cluster Ci et positionne ce nœud à hauteur t = 0.
Tant qu’il reste plus de deux clusters :
Trouver les clusters Ci et Cj qui ont la distance Δi ,j minimale
Définir un nouveau cluster Ck = Ci ∪ Cj et calculer la distance Δk,l pour
tout l
Ajouter un nœud k avec les fils Ci et Cj et positionner le à hauteur
tk = 12 Δi ,j
Retirer Ci et Cj de la liste des clusters, et continuer jusqu’à temps d’avoir
deux clusters
Pour les deux derniers clusters Ci , and Cj , placer la racine à hauteur
1
2 Δ(Ci , Cj )
Frank Nielsen
5.Regroupement
A2-82
Regroupement hiérarchique par UPGMA
Théorème
Si les données sur les distances sont ultramétriques (vérifiable sur la matrice
des distances), alors il existe un unique arbre ultramétrique et l’algorithme
UPGMA le construit.
... malheureusement les données (bruitées) ne sont pas ultramétriques en
général !
Tester si une matrice de distances est ultramétrique : naı̈vement en O(n3 ).
Frank Nielsen
5.Regroupement
A2-83
Dissimilarité, similarité et inversions
similarité entre deux groupes : S(Xi , Xj ) = −Δ(Xi , Xj ). Ainsi si on a
Δ(Gi , Gk ) > Δ(Gi , Gj ) alors on a l’ordre inverse S < S(Gi , Gj )
pour un chemin du dendrogramme d’une feuille à la racine, séquence de
fusion monotone ssi. la similarité décroit quand on se rapproche de la
racine : S1 ≥ S2 ≥ ... ≥ Sracine . Autrement dit, la valeur du critère de
fusion augmente quand on va vers la racine.
non-monotone s’il existe au moins une inversion Si < Si +1 sur un chemin
du dendrogramme. Cela veut dire que deux groupes peuvent être plus
similaire à l’étape i + 1 que les deux groupes fusionnés à l’étape i .
critère de Ward ne garantie pas la monotonie (inversions). Par
contre, Single Linkage, Complete Linkage et Average Linkage garantissent
la monotonie.
Frank Nielsen
5.Regroupement
A2-84
Inversion possible pour le critère de Ward
x3
x1
S({x1 }, {x2 })
S({x1 , x2 }, {x3 })
x2
x1
x2
x3
Inversion car un nœud parent se trouve “plus bas” que les deux nœuds fils.
Frank Nielsen
5.Regroupement
A2-85
C++ : Contenu des méthodes à l’extérieur des classes
#i n c l u d e <i o s t r e a m >
u s i n g namespace s t d ;
c l a s s CEntier
{
public : int val ;
C E n t i e r ( i n t v ) { t h i s −>v a l=v ; }
v o i d a j o u t e ( i n t v2 ) ;
};
// Définition à l’extérieur de class
v o i d C E n t i e r : : a j o u t e ( i n t v2 ) { v a l+=v2 ; }
i n t main ( )
{ C E n t i e r ∗ e1=new C E n t i e r ( 5 ) ;
cout<<e1−>v a l <<e n d l ;
return 0;}
Frank Nielsen
e1−>a j o u t e ( 8 ) ;
5.Regroupement
A2-86
Structures de données abstraites
Défini une interface pour accéder aux données.
Peut-être codé du plusieurs manières différentes.
les piles (Last In First Out, LIFO)
les files (First In First Out,FIFO)
les arbres
les graphes
les matrices creuses
etc.
Par exemple, les piles et files peuvent être implanté soit avec des tableaux soit
avec des listes chaı̂nées.
Frank Nielsen
5.Regroupement
A2-87
c l a s s CNoeud{C++ :
// la classe nœud
p u b l i c : CNoeud ∗ gauche , ∗ d r o i t ;
int val ;
public :
CNoeud ( i n t v ) { t h i s −>v a l=v ; ga uche=d r o i t=NULL ; }
CNoeud ( i n t v a l , CNoeud∗ A rbre1 , CNoeud∗ A r b r e 2 )
{ t h i s −>v a l=v a l ; ga uche=A r b r e 1 ; d r o i t=A r b r e 2 ; }
st ring Print ()
{ c h a r b u f f e r [ 2 0 ] ; s t r i n g s v a l=s t r i n g ( i t o a ( v a l , b u f f e r
,10) ) ;
s t r i n g s ga uche , s d r o i t ;
i f ( ga u ch e==NULL) s g a u c h e=” n i l ” ;
e l s e s g a u c h e=gauche−>P r i n t ( ) ;
i f ( d r o i t==NULL) s d r o i t=” n i l ” ;
e l s e s d r o i t=d r o i t −>P r i n t ( ) ;
r e t u r n ” ( ”+s v a l+” , ”+s g a u c h e+” , ”+s d r o i t+” ) ” ;
}};
Frank Nielsen
5.Regroupement
A2-88
...
CNoeud ∗ A r b r e 4 4 2=new CNoeud ( 3 , new CNoeud ( 2 ) ,
new CNoeud ( 1 , new CNoeud ( 4 ) , new CNoeud ( 5 ) ) ) ;
cout<<A rb re442 −>P r i n t ( )<<e n d l ;
Exécution donne à la console :
(3,(2,nil,nil),(1,(4,nil,nil),(5,nil,nil)))
Frank Nielsen
5.Regroupement
A2-89
C++ : récupération de la mémoire
tilde ∼, un seul destructeur par classe C++
˜CNoeud ( )
{
i f ( ga uche !=NULL)
d e l e t e ga uche ;
i f ( d r o i t !=NULL)
delete droit ;
c e r r <<” d e l e t e ”<<v a l <<e n d l ;
}
(3,(2,nil,nil),(1,(4,nil,nil),(5,nil,nil)))
delete 2
delete 4
delete 5
delete 1
delete 3
Frank Nielsen
5.Regroupement
A2-90
Différences principales entre C++ et Java
null en Java et NULL en C++
this.variable en Java/C++ (référence) et this->variable en C++
(pointeur)
class INF442{} en Java et class INF442{}; en C++
On peut rajouter le corps des méthodes en C++ après sa déclaration
dans la classe : void CNoeud::Addition(int v)
ajouter un destructeur dans la classe en C++
array.length en Java. On utilise la classe vector de la STL C++ et
.size()
import en Java et include en C++ (STL) etc.
En C++ dans les classes, mettre explicitement public (sinon on est
private par défaut)
Frank Nielsen
5.Regroupement
A2-91
Résumé A2
HPC : accélération, loi d’Amdahl et loi de Gustafson
MPI :
les communications bloquantes, les situations de blocage, les
communications non-bloquantes, les barrières de synchronisation
les calculs collaboratifs : réduction (somme, reduce & Allreduce), et les
opérations de préfixe parallèle (scan)
Science des données :
les k-moyennes avec MPI
regroupement hiérarchique vs. regroupement plat.
arbre ultramétrique et chaı̂nage par saut moyen (average link).
C++ : les classes objets. Lire le memento C++ sur la page Moodle !
Pour la prochaine fois : lire le chapitre 8 et relire le chapitre 2 du
polycopié
Frank Nielsen
5.Regroupement
A2-92

Documents pareils