analyse de trois rapides
19 octobre 2012
R´esum´e
L’objectif est de mettre en ´evidence quelques points importants concer- nant les tris rapides.
1 tris rapides
Il s’agit de trier des tableaux de nombres entiers. On pourra supposer que la taille des tableaux est une puissance de 2.
1. Implanter les tri rapides :quicksort,qsort,fusion, partas.
2. Comparer les performances de ces trois approches.
3. D´eterminer les “facteurs cach´es” des trois implantations en prenant comme unit´e celui du triqsort.
Fig.1 –quic sorta du mal avec les instances ordonn´ees !
2 cas d´ efavorable
Nous savons que que le tri rapide quick sort trie une table de taillenen un temps proportionnel `a nlogn. Il s’agit d’un r´esultat en moyenne, les pires instances sont les tableaux. . .tri´es !
1. Ecrire une fonction melange(p, n) qui construit un tableau de taille n obtenu en appliquantpn permutations al´eatoires dans un tableau tri´e.
2. Faire des mesures de temps de calcul en fixantn, puis en faisant varierp dans [0,12].
3 optimisation
Une optimisation classique des al- gorithmes r´ecursifs est de stopper la r´ecursion `a une profondeur limite pour
´eviter de backtracker avec des petites instances.
Une implantation efficace du tri des tablaeux de petites taille per- met l’am´eliorer sensiblement les per- formances du tri rapide.
v o i d A ( z ) {
if ( s i z e ( z ) < t h r e s o l d ) f i n a l e ( x )
e l s e {
x , y := s p l i t ( z ) A ( x );
A ( y ) }
Fig.2 – Efficacit´e du tri par s´election sur les feuilles
1. Modifier votre tri rapide pour trier les tables de petites tailles avec un tri non r´ecursifs : insertion, ou s´election.
2. Faire des mesures de temps de calcul pour mettre en ´evidence le pa- ram´etrage optimal de cette heuristique.
3. Comparer `a la vaveur de seuil utilis´ee dans la fonction qsort de la bi- blioth`eque glibc.
4. Implanter un tri rapide efficace.
Les effets des options de compila- tion -Ox i.e. les optimisations de gcc sont illustr´ees par la table ci-contre.
-O2 Optimiser encore plus. GCC effectue pratiquement toutes les optimisations support´ees qui n’impliquent pas un compromis espace/vitesse. Le compilateur n’effectue pas de d´eroulement des boucles ou de mise en ligne de fonctions.
-O3 Optimiser toujours plus. - O3 active toutes les optimisa-
tions sp´ecifi´ees par -O2 et active
´
egalement les options -finline- functions et -frename-registers.
-O0 -O1 -O2 -O3 O4
0 3.94 2.35 2.07 2.04 2.04 1 3.91 2.35 2.06 2.04 2.02 2 3.83 2.34 2.01 2.02 2.02 3 3.83 2.34 2.03 2.02 2.03 4 3.81 2.35 2.01 2.03 2.03 5 3.82 2.35 2.03 2.05 2.04 6 3.81 2.36 2.02 2.04 2.05 7 3.84 2.37 2.04 2.05 2.07 8 3.86 2.38 2.05 2.08 2.06
4 parall´ elisation
Si vous n’avez pas eu de difficult´e `a r´epondre aux questions pr´ec´edentes, vous pouvez vous lancer dans l’analyse de la parall´elisation dequick sort. Il s’agit d’utiliser les processus l´egers (thread) de la bibloth`eque glibc, sur une machine SMP.
v o i d A ( int * t , g , d ) {
if ( d - g < s e u i l ) f i n a l e ( t , g , d ) e l s e {
k = s p l i t ( t , g , d A ( t , g , k - 1);
A ( t , k +1 , d ) }
v o i d P ( int * t , g , d , p ) {
if ( p - - == 0 ) A ( t , g , d );
e l s e {
k = s p l i t ( t , g , d );
c r e a t e
P ( t , g , k - 1 , p );
P ( t , k +1 , d , p ) j o i n;
}
La parall´elisation Pde l’algorithmeA est obtenue en lan¸cant des processus l´egers dans les noeuds de petites profondeurs.
PTHREAD CREATE( 3 ) Manuel du programmeur Linux
p t h r e a d c r e a t e − C r e e r un nouveau t h r e a d SYNOPSIS
i n t p t h r e a d c r e a t e ( p t h r e a d t ∗ t i d , p t h r e a d a t t r t ∗ a t t r , v o i d ∗ (∗s t a r t r o u t i n e ) ( v o i d ∗) , v o i d ∗ a r g ) ;
DESCRIPTION
p t h r e a d c r e a t e ( ) c r e e un nouveau t h r e a d s ’ e x e c u t a n t s i m u l t a n e m e n t a v e c l e t h r e a d a p p e l a n t .
PTHREAD JOIN( 3 ) Manuel du programmeur Linux
p t h r e a d j o i n − A t t e n d r e l a f i n d ’ un a u t r e t h r e a d SYNOPSIS
i n t p t h r e a d j o i n ( p t h r e a d t t i d , v o i d ∗∗t h r e a d r e t u r n ) ; DESCRIPTION
p t h r e a d j o i n ( ) s u s p e n d l ’ e x e c u t i o n du t h r e a d a p p e l a n t j u s q u ’ a c e que l e t h r e a d i d e n t i f i e p a r t i d a c h e v e s o n
e x e c u t i o n , s o i t en a p p e l a n t p t h r e a d e x i t ( 3 ) s o i t a p r e s a v o i r e t e a n n u l e .
$ l s c p u
Fig.3 – threads 4 CPUs (2 coeurs)
Thread ( s ) par c o e u r : 2 Coeur ( s ) par s u p p o r t CPU : 2 Support ( s ) CPU : 1
Noeud ( s ) NUMA : 1
ID du v e n d e u r : G e n u i n e I n t e l F a m i l l e CPU : 6
Modele : 28
V e r s i o n : 2
CPU MHz : 1 5 9 9 . 9 9 6
L1d c a c h e : 24K
L 1 i c a c h e : 32K
L2 c a c h e : 512K
Fig.4 – threads 24 CPUs, 12coeurs