Outils d’aide
à
l’optimisation scalaire
sur Origin 2000
v 2.0
Guy Moebs
Guy.Moebs@crihan.fr
Plan de la formation
|
|
|
1. Architecture matérielle Origin2000 |
|
2. Environnement logiciel |
|
3. Perfex |
|
4. Speedshop |
|
5. Load balancing MPI |
1- Architecture
matérielle O2000
|
|
|
Architecture O2000 (64 procs) : |
1- Architecture
matérielle O2000
|
|
|
|
|
Sommet du cube constitué : |
|
un routeur |
|
deux noeuds |
|
Routeur connecté à 4 routeurs voisins |
|
Noeud composé : |
|
2 processeurs R10000 |
|
un commutateur HUB |
|
une mémoire partagée (1 Go) |
1- Architecture
matérielle O2000
|
|
|
|
|
Le HUB : |
|
est connecté aux deux processeurs du
noeud, |
|
sert d'interface entrées/sorties et
connexions avec le reste des processeurs de la machine. |
|
La mémoire : |
|
est partagée entre les processeurs du
noeud, |
|
est adressable par l'ensemble des
processeurs de la machine. |
1- Architecture
matérielle O2000
|
|
|
|
|
|
Processeurs type R10000 (MIPS IV) : |
|
une fréquence horloge de 195 MHz, |
|
une puissance crête/processeur de 390
Mflops, |
|
un transfert crête de données vers le
cache secondaire de 2.08 gbits/s, |
|
deux espaces cache : |
|
un cache primaire d'instructions de 32
Ko et de données de 32Ko, |
|
un cache secondaire de 4 Mo, |
|
une mémoire totale de 32 Go. |
1- Architecture
matérielle O2000
|
|
|
Organisation de la mémoire |
1- Architecture
matérielle O2000
2- Environnement logiciel
|
|
|
|
A. Compilateurs |
|
Déboguage, |
|
Optimisation, |
|
Groupes d’options et manpages utiles. |
|
|
|
B. Makefile |
|
|
|
C. Eléments de Fortran 90 |
|
Déclarations, |
|
Allocation dynamique, |
|
Interface. |
2- A. Compilateurs :
déboguage
|
|
|
|
Options : |
|
-O0 : aucune optimisation, |
|
-g3 : enrichir la table des symboles, |
|
-fullwarn : recevoir tous les messages
du compilateurs (-woff pour filtrer), |
|
-DEBUG:trap_uninitialized=ON : mise à
NaN des variables non initialisées, |
|
-DEBUG:subscript_check=ON :
vérification des indices des tableaux, |
|
-DEBUG:div_check=3 : vérification des
divisions et des overflows pour les entiers, |
|
-DEBUG:verbose_runtime=ON : numéros des
lignes source des erreurs. |
|
|
|
Bibliothèques : |
|
-lfpe : bibliothèque de gestion des
exceptions flottantes |
|
setenv TRAP_FPE |
|
“ALLCOUNT;UNDERFLOW=ZERO;OVERFL=TRACE(2),ABORT(2);INVALID=TRACE(2),ABORT(2)“ |
2- A. Compilateurs :
optimisation
|
|
|
|
Procéder par étapes, |
|
Valider les résultats à chaque étape, |
|
Étapes : |
|
-O0 : résultats de référence, |
|
-O2 : optimisations locales/globales
fiables, |
|
-O3 -OPT:IEEE_arithmetic=1:roundoff=0 :
optimisations plus aggressives, |
|
-O3 -OPT:IEEE_arithmetic=3:roundoff=3 :
optimisations très aggressives. |
|
Utiliser les outils perfex, speedshop,
workshop pour étudier les performances après validation des résultats. |
|
Quelques règles : |
|
respect la norme du langage, |
|
accès aux données de la même façon
qu’elles sont stockées, |
|
utilisation de bibliothèques
scientifiques optimisées. |
2- A. Compilateurs :
groupes d’options
|
|
|
|
-IPA (inter procedural analysis) : analyse
inter-procédurale |
|
-LNO (loop nest optimizer) : optimisation
des boucles imbriquées |
|
-OPT (optimization options) : précision
sur les calculs en flottants |
|
-DEBUG : déboguage |
|
|
|
Manpages |
|
F77, F90, cc, CC |
|
ipa, lno, opt, debug_group |
|
mp, pe_environ, sigfpe, handle_sigfpes |
|
|
|
Options |
|
-auto_use mpi_interface |
|
-flist, -col120, ... |
2- B. Compilateurs :
Makefile
|
|
|
Compilation faite par le compilateur, |
|
Outil make permet de gérer la
compilation, |
|
Makefile = fichier d’instructions pour
la commande make, |
|
repose sur des targets, des règles de
compilation. |
|
FC = f90 |
|
FFLAGS = -n32 -r10000 -mips4 -O3 |
|
LIBS = -lmpi -lfastm |
|
OBJS = bloc.o calcul.o erreur.o pmm.o
main.o |
|
.o.f90: |
|
<TAB>$(FC) $(FFLAGS) <$ -c |
|
All: $(OBJS) |
|
<TAB>$(FC) $(LDFLAGS) $(OBJS) -o
$(PROG) $(LIBS) |
2- C. Eléments de Fortran
90
|
|
|
|
Déclaration des variables |
|
INTEGER, PARAMETER :: n = 10 |
|
INTEGER :: ierr = 0 |
|
REAL(8), DIMENSION (-n:n, 0:1)
:: a, b |
|
REAL(4), DIMENSION(:),
ALLOCATABLE :: z |
|
Allocation dynamique |
|
ALLOCATE ( z(n+4*m+2), STAT=ierr) |
|
IF ( ierr /= 0 ) STOP ou
IF ( ierr == 0 ) THEN … |
|
DEALLOCATE ( z ) |
|
Interface |
|
SUBROUTINE calcul (n,a,b,c) |
|
INTEGER, INTENT(IN) :: n |
|
REAL(8), INTENT(OUT) :: a |
|
REAL(8), INTENT(IN) :: b, c |
3- perfex
|
|
|
A. compteurs d’événement |
|
B. options |
|
C. statistiques |
|
D. application : produit matriciel |
3- A. perfex : compteurs
|
|
|
|
les processeurs R1k000 disposent de
compteurs d’évènements pour suivre l’activité durant l’exécution. |
|
quelques compteurs d’évènements
importants : |
|
7 : quadwords written back from L2 |
|
9 : L1 instruction cache misses |
|
10 : L2 instruction cache misses |
|
21 : graduated floating point
instructions |
|
22 : quadwords written back from L1 |
|
23 : TLB misses (TLB = translation
look-aside buffer) |
|
25 : L1 data cache misses |
|
26 : L2 data cache misses |
|
deux compteurs peuvent être suivis en
même temps |
|
=> mesure précise de 2 compteurs |
|
=> mesure partielle puis
extrapolation de tous les compteurs (multiplexage) |
3- B. perfex : options
|
|
|
Perfex [-e e0] [-e e1] [-a] [-mp] [-y]
[-x] prog [args] |
|
e0, e1 : identifiants d’évènements qui
doivent appartenir à deux groupes distincts (0-15) et (16-31); |
|
-a : multiplexage de tous les
évènements; |
|
-mp : comptage pour chaque thread et
pour l’ensemble; |
|
-y : estimation des temps et
statistiques; |
|
-x : comptage des exceptions. |
|
|
|
perfex -a -x -y ./s.out |
|
|
|
perfex -a -x -y [-mp] mpirun -np 4
./p.out |
3- C. perfex :
statistiques
|
|
|
Statistiques importantes : |
|
Graduated instructions / cycle => proche de 2 |
|
Graduated floating point instructions /
cycle |
|
Graduated loads & stores / cycle |
|
Graduated loads & stores / floating
point instructions |
|
L1 Cache Line Reuse |
|
L2 Cache Line Reuse |
|
L1 Data Cache Hit Rate =>
> 0.90 |
|
L2 Data Cache Hit Rate |
|
Time accessing memory / Total time |
|
L1--L2 bandwidth used (MB/s, average per process) |
|
Memory bandwidth used (MB/s, average
per process) |
|
MFLOPS (average per process) |
3- D. perfex :
application
|
|
|
|
but : |
|
Montrer les pertes de performances
lorsque les données sont hors des caches |
|
principe : |
|
Calcul d’un produit matrice-matrice |
|
démarche : |
|
1) compilation : -O2; |
|
2) étude des performances pour n tel
que les 3 tableaux rentrent dans les caches L1, L2 ou la mémoire; |
|
cache L1 : 32ko, cache L2 : 1Mo; 4Mo,
8Mo (dépend de l’architecture => hinv) |
|
3 tableaux en double précision :
3x8xnxn octets |
|
3) étude des performances en modifiants
l’ordre des boucles; |
|
4) compilation : -O3; |
|
5) refaire les étapes 2) et 3). |
3- D. perfex :
application
|
|
|
|
analyse : |
|
1) compteurs d’évènements : |
|
évolution du classement d’importance
selon la valeur de n |
|
2) statistiques : |
|
évolution des valeurs des quantités
selon la valeur de n |
|
3) comparaison des résultats en -O2 et
-O3 |
3- D. perfex : analyse
compilation en -O2
|
|
|
L1 (n = 20), L2 (n = 300) et MEM
(n=1000) |
|
|
|
Based on 195
MHz IP27 |
|
MIPS
R10000 CPU |
|
CPU
revision 2.x |
|
Typical Minimum Maximum |
|
Event Counter Name Counter Value Time (sec) Time (sec) Time (sec) |
|
=============================================================================================================== |
|
0 Cycles.................................................. 20896529744 107.161691 107.161691 107.161691 |
|
16
Cycles.................................................. 20896529744 107.161691
107.161691 107.161691 |
|
25 Primary data cache
misses...............................
157632 0.007283 0.002280 0.007283 |
|
26 Secondary data cache
misses.............................
1312 0.000508 0.000332 0.000565 |
|
23 TLB
misses.............................................. 16 0.000006
0.000006 0.000006 |
|
|
|
0 Cycles.................................................. 38046735392 195.111464 195.111464 195.111464 |
|
16
Cycles.................................................. 38046735392 195.111464
195.111464 195.111464 |
|
25 Primary data cache
misses...............................
3499224576 161.682120 50.604171 161.682120 |
|
23 TLB
misses.............................................. 5637952 1.968657
1.968657 1.968657 |
|
26 Secondary data cache
misses.............................
413152 0.159964 0.104580 0.177973 |
|
|
|
0 Cycles.................................................. 21595891808 110.748163 110.748163 110.748163 |
|
16
Cycles.................................................. 21595891808 110.748163
110.748163 110.748163 |
|
23 TLB
misses.............................................. 249980160 87.287944
87.287944 87.287944 |
|
25 Primary data cache
misses...............................
1318855728 60.937898 19.072683 60.937898 |
|
26 Secondary data cache
misses.............................
47711120 18.472767 12.077030 20.552482 |
3- D. perfex : analyse
compilation en -O3
|
|
|
L1 (n = 20), L2 (n = 300) et MEM
(n=1000) |
|
|
|
Based on 195
MHz IP27 |
|
MIPS
R10000 CPU |
|
CPU
revision 2.x |
|
Typical Minimum Maximum |
|
Event Counter Name Counter Value Time (sec) Time (sec) Time (sec) |
|
=============================================================================================================== |
|
0 Cycles.................................................. 9967721904 51.116523 51.116523 51.116523 |
|
16
Cycles.................................................. 9967721904 51.116523
51.116523 51.116523 |
|
25 Primary data cache
misses...............................
102640 0.004742 0.001484 0.004742 |
|
26 Secondary data cache
misses.............................
6736 0.002608 0.001705 0.002902 |
|
23 TLB
misses.............................................. 16 0.000006
0.000006 0.000006 |
|
|
|
0 Cycles.................................................. 14893075584 76.374747 76.374747 76.374747 |
|
16
Cycles.................................................. 14893075584 76.374747
76.374747 76.374747 |
|
25 Primary data cache
misses...............................
895811520 41.391086 12.954813 41.391086 |
|
23 TLB
misses.............................................. 78112 0.027275
0.027275 0.027275 |
|
26 Secondary data cache
misses.............................
40160 0.015549 0.010166 0.017300 |
|
|
|
0 Cycles.................................................. 1235928224 6.338093 6.338093 6.338093 |
|
16
Cycles.................................................. 1235928224 6.338093
6.338093 6.338093 |
|
25 Primary data cache
misses...............................
73945232 3.416649 1.069362 3.416649 |
|
26 Secondary data cache
misses.............................
1135920 0.439805 0.287533 0.489319 |
|
23 TLB
misses.............................................. 44192 0.015431
0.015431 0.015431 |
3- D. perfex : analyse
compilation en -O2/-O3
|
|
|
Statistics
L1 L2 MEM |
|
n = 20 n =
300 n = 1000 |
|
================================================================================================================= |
|
Graduated
instructions/cycle............................................ 2.185076 1.710898
0.385768 |
|
Graduated floating point
instructions/cycle............................. 0.383449
0.353419 0.046896 |
|
Graduated loads &
stores/cycle.......................................... 0.804269 0.712300
0.127843 |
|
Graduated loads & stores/floating
point instruction.....................
2.097459 2.015457 2.726113 |
|
L1 Cache Line
Reuse.....................................................106617.081506 6.744774 1.093389 |
|
L2 Cache Line
Reuse..................................................... 119.146341 8468.581597
26.642523 |
|
L1 Data Cache Hit
Rate.................................................. 0.999991 0.870881
0.522306 |
|
L2 Data Cache Hit
Rate.................................................. 0.991677 0.999882
0.963824 |
|
Time accessing memory/Total
time........................................ 0.804341
1.551875 1.633047 |
|
L1--L2 bandwidth used (MB/s, average
per process).......................
0.079952 581.518247 381.962787 |
|
Memory bandwidth used (MB/s, average
per process).......................
0.078700 0.417081 56.276275 |
|
MFLOPS (average per
process)............................................ 74.772563 68.916666
9.144644 |
|
|
|
Graduated
instructions/cycle............................................ 1.835561 1.824490
1.692755 |
|
Graduated floating point
instructions/cycle............................. 0.804350
0.906906 0.810151 |
|
Graduated loads &
stores/cycle.......................................... 0.559774 0.493832
0.441724 |
|
Graduated loads & stores/floating
point instruction.....................
0.695933 0.544524 0.545236 |
|
L1 Cache Line
Reuse..................................................... 54360.530320 7.210080 6.383013 |
|
L2 Cache Line
Reuse..................................................... 14.237530 22305.063745
64.097218 |
|
L1 Data Cache Hit
Rate.................................................. 0.999982 0.878199
0.864554 |
|
L2 Data Cache Hit
Rate.................................................. 0.934373 0.999955
0.984638 |
|
Time accessing memory/Total
time........................................ 0.559917
1.036340 1.052615 |
|
L1--L2 bandwidth used (MB/s, average
per process).......................
0.111141 396.560745 397.235215 |
|
Memory bandwidth used (MB/s, average
per process).......................
0.059111 0.117584 35.873723 |
|
MFLOPS (average per
process)............................................ 156.848197 176.846720
157.979467 |
3- D. perfex :
commentaires
|
|
|
L’option -O3 permet de conserver les
données dans le cache secondaire à l’aide du cache blocking. |
|
|
|
L’option -flist permet d’obtenir la
traduction en Fortran du code optimisé. |
|
|
|
L’option -O3 active des groupes
d’option (LNO, OPT,…) qui fournissent des optimisations supplémentaires; |
|
gain d’un facteur supérieur à
15 ici. |
4- speedshop
|
|
|
A. ssrun : expériences |
|
B. ssrun : types d’expérience |
|
C. ssrun : options |
|
D. prof : analyse |
|
E. prof : options |
|
F. application : ADI |
4- A. ssrun : expériences
|
|
|
ssrun est un outil de profilage : |
|
- mesure effectuée durant
l’exécution du programme, |
|
- usage ne nécessite pas de
compilation particulière, |
|
- appliqué à un programme compilé
avec options d’optimisation. |
|
|
|
2 types d’expérience: |
|
- échantillonnage statistique
durant l’exécution du programme, |
|
- comptage exact d’occurrence
d’évènements. |
|
|
|
ssrun s’applique aux programmes
séquentiel et parallèle |
4- B. ssrun : type
d’expérience
|
|
|
|
l’échantillonnage dépend d’une base
temporelle : |
|
arrêt du programme toutes les 10 ou 1
ms, incrément d’un compteur associé à la ligne du code exécutée (-[f]pcsamp[x]); |
|
arrêt du programme toutes les 3 ms,
incrément d’un compteur associé à toutes les routines de la pile d’appels (-usertime). |
|
|
|
le comptage est lié à un type
d’événement : |
|
arrêt du programme lors du débordement
de compteur d’évènements, incrément d’un compteur associé à la ligne du code
source (-hwc); |
|
arrêt du programme lors d’une exception
flottante, incrément d’un compteur associé à toutes les routines de la pile
d’appels (-fpe); |
|
Comptage du temps `idéal` d’exécution
du code (-ideal). |
|
|
4- C. ssrun : options
|
|
|
ssrun -exp prog [args] |
|
exp : type d’expériences; |
|
prog : application à analyser. |
|
création d’un fichier binaire
d’informations de la forme |
|
progname.expname.D#pid |
|
#pid : process id; D :
lettre dont la signification est : |
|
m : processus master crée par
ssrun; |
|
p : processus slave OpenMP ( crée
par sproc() ); |
|
f : processus slave MPI ( crée par
fork() ); |
|
e : processus slave PVM ( crée par
exec() ); |
|
s : processus système. |
4- D. prof : analyse
|
|
|
lecture du(/des) fichier(s) binaire(s)
généré(s) par ssrun |
|
|
|
création d’un fichier ascii après
analyse |
|
|
|
fichier global pour l’ensemble des
processus ou fichier individuel |
|
|
4- E. prof : options
|
|
|
|
prof -options progname.exp.name.D#pid |
|
|
|
options : |
|
-heavy (-h) : résultats affichés pour
chaque ligne par ordre décroissant de temps; |
|
-lines (-l) : résultats affichés pour chaque ligne par ordre du
source; |
|
-only (-o) sub : affichage pour la
routine sub uniquement; |
|
-gprof : ajoute le temps inclusif pour
l’expérience -usertime; |
|
-q n [%] : tronque l ’affichage
après n lignes ou n %. |
4- F. application : ADI
|
|
|
but : |
|
Montrer les pertes de performances et
les localiser. |
|
|
|
principe : |
|
Calcul de contributions dans un tableau
3D, routines xsweep, ysweep et zsweep |
|
|
|
Démarche : |
|
1) comparer les coûts théoriques des
routines avec -ideal; |
|
2) comparer les coûts réels des routines avec -pcsamp; |
|
3) analyser les évènements avec perfex
-a -y -x; |
|
4) affiner les valeurs des principaux
compteurs avec perfex -e e0; |
|
5) localiser les lignes du source
responsables avec ssrun -hwc : |
|
setenv
SPEEDSHOP HWC_COUNTER_NUMBER compteur |
|
setenv
SPEEDSHOP HWC_COUNTER_OVERFLOW
valeur |
4- F. application : ADI
|
|
|
résultats de ssrun -ideal par prof
-lines : |
|
Function list, in descending order by
exclusive ideal time |
|
------------------------------------------------------------------------- |
|
[index] excl.secs excl.% cum.% cycles instructions calls function (dso: file, line) |
|
|
|
[1] 0.303 23.2% 23.2%
59080704 59506688 32768
xsweep (adi2: adi2.f90, 70) |
|
[2] 0.303 23.2% 46.4%
59080704 59506688 32768
ysweep (adi2: adi2.f90, 90) |
|
[3] 0.303 23.2% 69.6%
59080704 59506688 32768
zsweep (adi2: adi2.f90, 110) |
|
[4] 0.161 12.3% 81.9% 31457280 27262976 2097152 irand_
(libftn.so: rand_.c, 62) |
|
[5] 0.140 10.7% 92.6% 27262976 35651584 2097152 rand_
(libftn.so: rand_.c, 67) |
|
[6] 0.082 6.2% 98.9% 15915509 18606275 1 adi2 (adi2:
adi2.f90, 1) |
|
résultats de ssrun -pcsamp par prof
-lines : |
|
Function list, in descending order by
time |
|
------------------------------------------------------------------------- |
|
[index] secs %
cum.% samples function (dso: file, line) |
|
|
|
[1] 6.360 78.1%
78.1% 636 zsweep (adi2: adi2.f90, 110) |
|
[2] 0.630 7.7%
85.9% 63 ysweep (adi2: adi2.f90, 90) |
|
[3] 0.610 7.5%
93.4% 61 xsweep (adi2: adi2.f90, 70) |
|
[4] 0.230 2.8%
96.2% 23 irand_ (libftn.so: rand_.c, 62) |
|
[5] 0.180 2.2%
98.4% 18 adi2 (adi2: adi2.f90, 1) |
|
[6] 0.120 1.5%
99.9% 12 rand_ (libftn.so: rand_.c, 67) |
|
[7] 0.010 0.1% 100.0% 1 _write
(libc.so.1: writeSCI.c, 27) |
4- F. application : ADI
|
|
|
résultats de perfex -a -y -x : |
|
Typical Minimum Maximum |
|
Event Counter Name
Counter Value Time (sec) Time (sec) Time (sec) |
|
=============================================================================================================== |
|
0 Cycles.................................................. 1682480768 8.628107 8.628107 8.628107 |
|
16
Cycles.................................................. 1682480768 8.628107
8.628107 8.628107 |
|
26 Secondary data cache
misses.............................
6573952 2.545299 1.664053 2.831856 |
|
23 TLB
misses.............................................. 5787712 2.020950
2.020950 2.020950 |
|
7 Quadwords written back from scache...................... 52204928 1.713393 1.132445 1.713393 |
|
25 Primary data cache
misses...............................
17305104 0.799585 0.250258 0.799585 |
|
22 Quadwords written back from primary
data cache.......... 31548640 0.622883 0.508014 0.719956 |
|
21 Graduated floating point
instructions...................
30801216 0.157955 0.078977 8.213658 |
|
9 Primary instruction cache misses........................ 15040 0.001390 0.000434 0.001390 |
|
10 Secondary instruction cache
misses......................
544 0.000211 0.000138 0.000234 |
|
Statistics |
|
===================================================================================== |
|
Graduated
instructions/cycle............................................ 0.205890 |
|
Graduated floating point
instructions/cycle............................. 0.018307 |
|
Graduated loads &
stores/cycle.......................................... 0.074188 |
|
Graduated loads & stores/floating
point instruction.....................
4.052416 |
|
L1 Cache Line
Reuse..................................................... 6.212863 |
|
L2 Cache Line
Reuse..................................................... 1.632375 |
|
L1 Data Cache Hit
Rate.................................................. 0.861359 |
|
L2 Data Cache Hit
Rate.................................................. 0.620115 |
|
Time accessing memory/Total
time........................................ 0.696089 |
|
L1--L2 bandwidth used (MB/s, average
per process).......................
122.685269 |
|
Memory bandwidth used (MB/s, average
per process).......................
194.335189 |
|
MFLOPS (average per
process)............................................ 3.569870 |
4- F. application : ADI
|
|
|
résultats de perfex -e 23 : |
|
Summary for execution of ./adi2 |
|
0
Cycles...................................................... 1317308826 |
|
23 TLB
misses.................................................. 5779532 |
|
|
|
résultats de perfex -e 26 : |
|
Summary for execution of ./adi2 |
|
0
Cycles...................................................... 1320793392 |
|
26 Secondary data cache
misses.................................
6913927 |
|
|
|
exécution ssrun -hwc : |
|
#!/bin/csh |
|
setenv _SPEEDSHOP_HWC_COUNTER_NUMBER 23 |
|
setenv
_SPEEDSHOP_HWC_COOUNTER_OVERFLOW 2053 |
|
|
|
ssrun -prof_hwc ./adi2 |
|
|
|
setenv _SPEEDSHOP_HWC_COUNTER_NUMBER 26 |
|
setenv
_SPEEDSHOP_HWC_COUNTER_OVERFLOW 2053 |
|
|
|
ssrun -prof_hwc ./adi2 |
|
|
4- F. application : ADI
|
|
|
résultats de ssrun -hwc (23) par prof
-heavy : |
|
------------------------------------------------------------------------- |
|
Summary of perf. counter overflow PC
sampling data (prof_hwc)-- |
|
2816: Total samples |
|
TLB misses (23): Counter name (number) |
|
2053: Counter overflow value |
|
5781248: Total counts |
|
------------------------------------------------------------------------- |
|
Function list, in descending order by
counts |
|
------------------------------------------------------------------------- |
|
[index]
counts % cum.%
samples function (dso: file,
line) |
|
[1] 5781248 100.0%
100.0% 2816 zsweep (adi2: adi2.f90, 110) |
|
5781248 100.0% 100.0% 2816 TOTAL |
|
|
|
------------------------------------------------------------------------- |
|
Line list, in descending order by
counts |
|
------------------------------------------------------------------------- |
|
counts % cum.%
samples function (dso: file,
line) |
|
2915260 50.4 50.4
1420 zsweep (adi2: adi2.f90,
120) |
|
2831087 49.0 99.4
1379 zsweep (adi2: adi2.f90,
124) |
|
34901 0.6 100.0 17 zsweep (adi2:
adi2.f90, 110) |
4- F. application : ADI
|
|
|
résultats de ssrun -hwc (26) par prof
-heavy : |
|
------------------------------------------------------------------------- |
|
Summary of perf. counter overflow PC
sampling data (prof_hwc)-- |
|
3545: Total samples |
|
Secondary cache D misses (26): Counter name (number) |
|
2053: Counter overflow value |
|
7277885: Total counts |
|
------------------------------------------------------------------------- |
|
Function list, in descending order by counts |
|
------------------------------------------------------------------------- |
|
[index]
counts % cum.%
samples function (dso: file,
line) |
|
[1] 6686621 91.9%
91.9% 3257 zsweep (adi2: adi2.f90, 110) |
|
[2] 244307 3.4%
95.2% 119 xsweep (adi2: adi2.f90, 70) |
|
[3] 236095 3.2%
98.5% 115 ysweep (adi2: adi2.f90, 90) |
|
[4] 108809 1.5% 100.0% 53 adi2 (adi2:
adi2.f90, 1) |
|
2053
0.0% 100.0% 1 **OTHER** (includes excluded DSOs, rld,
etc.) |
|
7277885 100.0% 100.0% 3545 TOTAL |
|
------------------------------------------------------------------------- |
|
Line list, in descending order by
counts |
|
------------------------------------------------------------------------- |
|
counts % cum.%
samples function (dso: file,
line) |
|
3449040 47.4 47.4
1680 zsweep (adi2: adi2.f90,
120) |
|
3217051 44.2 91.6
1567 zsweep (adi2: adi2.f90,
124) |
|
244307 3.4 95.0 119 xsweep (adi2:
adi2.f90, 80) |
|
192982 2.7 97.6 94 ysweep (adi2:
adi2.f90, 100) |
4- F. application : ADI
|
|
|
Analyse : |
|
=> problème de cache thrashing. |
|
- les adresses de stockage de données
dans le cache sont calculées par modulo à partir des adresses mémoire; |
|
- taille du cache en 2^p, dimensions
des tableaux en 2^q; |
|
- écrasement des données dans les
caches car modulos identiques; |
|
|
|
Solution : |
|
=> modifier les premières dimensions
des tableaux pour décaler les adresses de stockage dans les caches. |
|
integer, parameter :: ldx = 129 |
|
integer, parameter :: ldy = 129 |
|
integer, parameter :: ldz = 128 |
|
integer, parameter :: nx
= 128 |
|
integer, parameter :: ny
= 128 |
|
integer, parameter :: nz
= 128 |
|
|
|
real(rp), dimension(ldx, ldy, ldz)
:: data |
4- F. application : ADI
|
|
|
démarche : |
|
6) analyser les évènements avec perfex
-a -y -x; |
|
7) affiner les valeurs des principaux
compteurs avec perfex -e e0; |
|
8) localiser les lignes du source
responsables avec ssrun -hwc. |
4- F. application : ADI
|
|
|
résultat de perfex -a -y -x |
|
Typical Minimum Maximum |
|
Event Counter Name Counter Value Time (sec) Time (sec) Time (sec) |
|
=============================================================================================================== |
|
0 Cycles.................................................. 711044336 3.646381 3.646381 3.646381 |
|
16
Cycles.................................................. 711044336 3.646381
3.646381 3.646381 |
|
23 TLB
misses.............................................. 5604048 1.956819
1.956819 1.956819 |
|
26 Secondary data cache
misses.............................
1061616 0.411036 0.268725 0.457312 |
|
7 Quadwords written back from scache...................... 6004864 0.197083 0.130259 0.197083 |
|
25 Primary data cache
misses...............................
4235360 0.195695 0.061250 0.195695 |
|
21 Graduated floating point
instructions...................
29959296 0.153637 0.076819 7.989146 |
|
22 Quadwords written back from primary
data cache.......... 6328832 0.124954 0.101910 0.144427 |
|
9 Primary instruction cache misses........................ 42816 0.003957 0.001236 0.003957 |
|
10 Secondary instruction cache
misses......................
896 0.000347 0.000227 0.000386 |
|
Statistics |
|
===================================================================================== |
|
Graduated
instructions/cycle............................................ 0.456588 |
|
Graduated floating point
instructions/cycle............................. 0.042134 |
|
Graduated loads &
stores/cycle.......................................... 0.155101 |
|
Graduated loads & stores/floating
point instruction.....................
3.681107 |
|
L1 Cache Line
Reuse..................................................... 25.038722 |
|
L2 Cache Line
Reuse..................................................... 2.989540 |
|
L1 Data Cache Hit
Rate.................................................. 0.961596 |
|
L2 Data Cache Hit
Rate.................................................. 0.749345 |
|
Time accessing memory/Total
time........................................ 0.858140 |
|
L1--L2 bandwidth used (MB/s, average
per process).......................
64.939132 |
|
Memory bandwidth used (MB/s, average
per process).......................
63.615036 |
|
MFLOPS (average per
process)............................................ 8.216172 |
4- F. application : ADI
|
|
|
résultat de perfex -e 23 : |
|
Summary for execution of ./adi5 |
|
0
Cycles...................................................... 592594668 |
|
23 TLB
misses.................................................. 5565894 |
|
résultat de perfex -e 26 : |
|
Summary for execution of ./adi5 |
|
0
Cycles...................................................... 590387057 |
|
26 Secondary data cache
misses.................................
895611 |
|
résultat de ssrun -hwc (23) par prof
-heavy |
|
------------------------------------------------------------------------- |
|
Function list, in descending order by
counts |
|
------------------------------------------------------------------------- |
|
[index]
counts % cum.%
samples function (dso: file,
line) |
|
[1] 5565683 100.0%
100.0% 2711 zsweep (adi5: adi5.f90, 110) |
|
[2] 2053 0.0% 100.0% 1 fake_adi (adi5:
adi5.f90, 1) |
|
------------------------------------------------------------------------- |
|
Line list, in descending order by
counts |
|
------------------------------------------------------------------------- |
|
counts % cum.%
samples function (dso: file,
line) |
|
2855723 51.3 51.3
1391 zsweep (adi5: adi5.f90,
120) |
|
2666847 47.9 99.2
1299 zsweep (adi5: adi5.f90,
124) |
4- F. application : ADI
|
|
|
Analyse : |
|
=> problème de TLB thrashing. |
|
- chaque entrée dans cette table
correspond à une page mémoire adressée |
|
- trop de pages différentes sont
parcourues; |
|
- la table est regénérée en permanence
à cause des boucles de calcul. |
|
|
|
Solution : |
|
- stocker le vecteur des données du
calcul dans un vecteur temporaire; |
|
- routine de copie : |
|
do j = 1, ny |
|
call copy(data(1,j,1),ldx*ldy,temp,nx,nx,nz) |
|
do i = 1, nx |
|
call zsweep(temp(i,1),nx,nz) |
|
end do |
|
call copy(temp,nx,data(1,j,1),ldx*ldy,nx,nz) |
|
end do |
4- F. application : ADI
|
|
|
démarche : |
|
9) analyser les évènements avec perfex
-a -y -x. |
|
|
4- F. application : ADI
|
|
|
résultat de perfex -a -y -x |
|
Typical Minimum Maximum |
|
Event Counter Name Counter Value Time (sec) Time (sec) Time (sec) |
|
=============================================================================================================== |
|
0 Cycles.................................................. 473543376 2.428428 2.428428 2.428428 |
|
16
Cycles.................................................. 473543376 2.428428
2.428428 2.428428 |
|
25 Primary data cache
misses...............................
13666112 0.631444 0.197633 0.631444 |
|
22 Quadwords written back from primary
data cache.......... 23456192 0.463109 0.377705 0.535282 |
|
26 Secondary data cache
misses.............................
1168832 0.452548 0.295864 0.503497 |
|
7 Quadwords written back from scache...................... 7385600 0.242399 0.160211 0.242399 |
|
21 Graduated floating point
instructions...................
30300896 0.155389 0.077695 8.080239 |
|
23 TLB
misses.............................................. 65264 0.022789
0.022789 0.022789 |
|
9 Primary instruction cache misses........................ 8832 0.000816 0.000255 0.000816 |
|
10 Secondary instruction cache
misses......................
768 0.000297 0.000194 0.000331 |
|
Statistics |
|
===================================================================================== |
|
Graduated
instructions/cycle............................................ 0.583375 |
|
Graduated floating point
instructions/cycle............................. 0.063988 |
|
Graduated loads &
stores/cycle.......................................... 0.247853 |
|
Graduated loads & stores/floating
point instruction.....................
3.873448 |
|
L1 Cache Line
Reuse..................................................... 7.588320 |
|
L2 Cache Line
Reuse..................................................... 10.692110 |
|
L1 Data Cache Hit
Rate.................................................. 0.883563 |
|
L2 Data Cache Hit
Rate.................................................. 0.914472 |
|
Time accessing memory/Total
time........................................ 0.703613 |
|
L1--L2 bandwidth used (MB/s, average
per process).......................
334.625857 |
|
Memory bandwidth used (MB/s, average
per process).......................
110.268924 |
|
MFLOPS (average per
process)............................................ 12.477579 |
4- F. application :
commentaires
|
|
|
La comparaison des temps ideal et réel
montre une différence importante : un événement extérieur survient; |
|
pertes des données dûes au cache
thrashing et au TLB thrashing; |
|
cache thrashing : les dimensions des
tableaux multi-dimensionnels ne doivent pas être des puissances de 2 : |
|
=> augmentation mémoire
généralement légère, |
|
=> augmentation des performances
significative; |
|
TLB thrashing : les copies dans des
tableaux temporaires peuvent résoudre
les pertes de performance; |
|
=> le compilateur ne sait pas le
faire, |
|
=> c’est du ressort du
développeur. |
5- load balancing MPI
|
|
|
A. algorithme |
|
B. sous-domaines |
|
C. communications |
|
D. cvbuild |
|
E. cvmake |
|
F. portage |
|
G. ssaggregate |
|
H. application |
|
I. comparaison |
|
J. conclusions |
5- A. load balancing MPI
: algorithme
|
|
|
problème de Poisson, différences finies
2D |
|
méthode itérative de Jacobi |
|
schéma à 5 points classique : |
|
u(i,j)(n+1)= 0.25 * { u(i+1,j )(n) + u(i-1,j )(n) |
|
+ u(i
,j+1)(n) + u(i ,j-1)(n) |
|
- h*h*f(i,j) } |
|
test d’arrêt sur la convergence ou
nombre max d’itérations |
|
le domaine initial est coupé en
sous-domaines, chaque processus calcule sur son sous-domaine |
|
une couche de noeuds fictifs autour de
chaque sous-domaines, mises à jour par des communications MPI. |
5- B. load balancing MPI
: sous-domaines
5- C. load balancing MPI
: communications
5- D. load balancing MPI
: cvbuild
|
|
|
outil d’analyse de dépendance pour la
compilation; |
|
|
|
interrogations sur les targets : menu
query. |
5- E. load balancing MPI
: cvmake
|
|
|
outil d’aide à la compilation; |
|
|
|
navigation dans le source, d’erreur en
erreur. |
5- F. load balancing MPI
: portage
|
|
|
|
progresser dans les niveaux
d’optimisation du programme en comparant les résultats avec des valeurs de
référence (code séquentiel puis code parallèle sans optimisation). |
|
|
|
démarche : |
|
-O0 -g3 -DEBUG:… : pas d’optimisation, |
|
-O2 : optimisations fiables, |
|
-O3 -OPT:IEEE_arithmetic=1:roundoff=0 :
optimisations aggressives, |
|
-O3 -OPT:IEEE_arithmetic=3:roundoff=3 :
optimisations très aggressives. |
|
valider chaque étape. |
5- G. load balancing MPI
: ssaggregate
|
|
|
outil pour fusionner des fichiers de
données issus du même type d’expérience. |
|
syntaxe : |
|
ssaggregate -e expfile1 expfile2 … -o outputfile |
|
analyse faite par prof |
|
ssrun sur un code MPI : |
|
mpirun -np n ssrun
-fpcsampx prog [args] |
|
ssrun sur un code OpenMP : |
|
setenv OMP _NUM _THREADS n |
|
ssrun -fpcsampx prog [args] |
5- H. load balancing MPI
: application
|
|
|
but : |
|
étudier le load balancing des calculs
sur les processus. |
|
|
|
principe : |
|
profilage du code MPI par ssrun. |
|
|
|
démarche : |
|
1) compiler le code séquentiel et le
code parallèle; |
|
2) lancer les codes sous ssrun
-fpcsampx sur le même cas test; |
|
3) comparer les résultats entre les
processus MPI; |
|
4) faire la fusion des fichiers et
comparer avec le code séquentiel; |
|
5) faire varier la taille du maillage
et le nombre de processus (2^p). |
5- I. load balancing MPI
: indications
|
|
|
comparer les temps des différents
processus pour une même routine et leur somme avec le temps séquentiel; |
|
|
|
comparer le temps du processus le plus
long avec le temps séquentiel pour évaluer l’accélération et l’efficacité; |
|
|
|
accélération : A(p) = T(1) / T(p) |
|
|
|
efficacité : E(p) = A(p) / p |
|
|
|
regarder le temps passé en
communications par rapport au temps total : overhead MPI |
5- I. load balancing MPI
: ntx = 200
|
|
|
+-----------+--------+--------+--------++--------+ |
|
| ntx = 200 | p0 | p1
| 2p ||
1p | |
|
+-----------+--------+--------+--------++--------+ |
|
|
calcul | 7.87 |
11.02 | 18.89 || 24.04 | |
|
+-----------+--------+--------+--------++--------+ |
|
|
erreur | 6.10 |
2.04 | 8.14 || 13.55 |
A(2) = 37.70 / 18.88 = 1.99 |
|
+-----------+--------+--------+--------++--------+ E(2) = 100% |
|
|
total | 18.88 |
18.88 | 37.70 || 37.68 | |
|
+-----------+--------+--------+--------++--------+ |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
| ntx = 200 | p0 | p1
| p2 |
p3 | 4p
|| 1p | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
|
calcul | 4.31 |
4.18 | 3.76 | 4.86 |
17.11 || 24.04 | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
|
erreur | 1.83 |
2.24 | 3.00 | 3.02 |
10.09 || 13.55 | A(4) = 3.37 |
|
+-----------+--------+--------+--------+--------+--------++--------+ E(4) =
84% |
|
|
total | 11.13 |
11.15 | 11.16 | 11.16 |
44.67 || 37.68 | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
| ntx = 200 | p0 | p1
| p2 |
p3 | p4
| p5 |
p6 | p7
| 8p ||
1p | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
calcul | 3.01 |
2.76 | 2.02 | 2.59 |
2.45 | 2.42 | 2.39 |
2.51 | 20.15 || 24.04 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
erreur | 1.51 |
1.17 | 1.98 | 1.47 |
1.44 | 1.66 | 1.33 |
0.99 | 11.55 || 13.55 |
A(8) = 3.95 |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ E(8) =
49% |
|
|
total | 9.53 |
9.50 | 9.52 | 9.54 |
9.53 | 9.55 | 9.54 |
9.55 | 76.35 || 37.68 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
5- I. load balancing MPI
: ntx = 400
|
|
|
+-----------+--------+--------+--------++--------+ |
|
| ntx = 400 | p0 | p1
| 2p ||
1p | |
|
+-----------+--------+--------+--------++--------+ |
|
|
calcul | 40.38 |
41.12 | 81.50 || 164.47 | |
|
+-----------+--------+--------+--------++--------+ |
|
|
erreur | 20.87 |
21.43 | 42.30 || 129.91 | A(2) = 4.05 |
|
+-----------+--------+--------+--------++--------+ E52) = 202% |
|
|
total | 71.66 |
71.71 | 143.39 || 290.54 | |
|
+-----------+--------+--------+--------++--------+ |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
| ntx = 400 | p0 | p1
| p2 |
p3 | 4p
|| 1p | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
|
calcul | 19.15 |
23.76 | 19.58 | 20.62 |
83.11 || 164.47 | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
|
erreur | 9.78 |
11.67 | 8.95 | 9.37 |
39.77 || 129.91 | A(4) = 6.95 |
|
+-----------+--------+--------+--------+--------+--------++--------+ E(4) = 125% |
|
|
total | 41.81 |
41.78 | 41.81 | 41.78 | 167.23 || 290.54 | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
| ntx = 400 | p0 | p1
| p2 |
p3 | p4
| p5 |
p6 | p7
| 8p ||
1p | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
calcul | 9.83 |
10.12 | 9.78 | 9.63 |
10.38 | 10.25 | 9.36 |
9.50 | 78.85 || 164.47 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
erreur | 3.53 |
4.82 | 5.00 | 5.27 |
3.93 | 6.79 | 6.23 |
4.81 | 40.38 || 129.91 | A(8) = 13.02 |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ E(8) = 163% |
|
|
total | 22.27 |
22.33 | 22.28 | 22.31 |
22.29 | 22.33 | 22.31 |
22.31 | 178.52 || 290.54 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
5- I. load balancing MPI
: ntx = 800
|
|
|
+-----------+--------+--------+--------++--------+ |
|
| ntx = 800 | p0 | p1
| 2p ||
1p | |
|
+-----------+--------+--------+--------++--------+ |
|
|
calcul | 329.30 | 328.56 | 657.86
|| 674.17 | |
|
+-----------+--------+--------+--------++--------+ |
|
|
erreur | 257.46 | 256.44 |
513.90 || 496.73 | A(2) = 1.94 |
|
+-----------+--------+--------+--------++--------+ E(2) =
97% |
|
|
total | 604.66 | 604.67
|1209.35 ||1171.25 | |
|
+-----------+--------+--------+--------++--------+ |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
| ntx = 800 | p0 | p1
| p2 |
p3 | 4p
|| 1p | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
|
calcul | 84.96 |
85.27 | 84.02 | 90.33 | 344.58 || 674.17 | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
|
erreur | 46.69 |
46.74 | 46.34 | 47.04 | 186.81 || 496.73 | A(4) = 7.95 |
|
+-----------+--------+--------+--------+--------+--------++--------+ E(4) = 199% |
|
|
total | 147.36 | 147.36 |
147.36 | 147.39 | 589.50 ||1171.25 | |
|
+-----------+--------+--------+--------+--------+--------++--------+ |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
| ntx = 800 | p0 | p1
| p2 |
p3 | p4
| p5 |
p6 | p7
| 8p ||
1p | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
calcul | 39.63 |
40.13 | 42.12 | 41.63 |
41.45 | 38.52 | 56.89 |
40.44 | 340.81|| 674.17 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
erreur | 20.94 |
21.45 | 21.27 | 20.71 |
20.37 | 20.50 | 29.45 |
21.11 | 175.80|| 496.73 | A(8) = 11.61 |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ E(8) = 145% |
|
|
total | 100.90 | 100.87 |
100.89 | 100.87 | 100.82 | 100.87 | 100.76 | 100.92 | 806.96||1171.25 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
5- I. load balancing MPI
: conclusions
|
|
|
|
nombre de processus doit être adapté à
la masse de calcul; |
|
|
|
temps de calcul significatif pour que
les imprécisions des mesures soient “petites” (charge de la machine !); |
|
|
|
temps parallèle inférieur au temps
séquentiel car plusieurs processus signifient aussi : |
|
plusieurs cache L2 donc volume de cache
multiplié; |
|
données distribuées sur plusieurs
mémoires locales, donc accès plus courts; |
|
|
|
overhead des communications à suivre. |