|
|
|
|
1. Architecture matérielle Origin2000 |
|
2. Environnement logiciel |
|
3. Perfex |
|
4. Speedshop |
|
5. Load balancing MPI |
|
|
|
|
Architecture O2000 (64 procs) : |
|
|
|
|
|
|
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) |
|
|
|
|
|
|
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. |
|
|
|
|
|
|
|
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. |
|
|
|
|
Organisation de la mémoire |
|
|
|
|
|
|
A. Compilateurs |
|
Déboguage, |
|
Optimisation, |
|
Groupes d’options et manpages utiles. |
|
|
|
B. Makefile |
|
|
|
C. Eléments de Fortran 90 |
|
Déclarations, |
|
Allocation dynamique, |
|
Interface. |
|
|
|
|
|
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)“ |
|
|
|
|
|
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. |
|
|
|
|
|
-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, ... |
|
|
|
|
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) |
|
|
|
|
|
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 |
|
|
|
|
A. compteurs d’événement |
|
B. options |
|
C. statistiques |
|
D. application : produit matriciel |
|
|
|
|
|
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) |
|
|
|
|
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 |
|
|
|
|
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) |
|
|
|
|
|
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). |
|
|
|
|
|
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 |
|
|
|
|
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 |
|
|
|
|
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 |
|
|
|
|
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 |
|
|
|
|
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. |
|
|
|
|
A. ssrun : expériences |
|
B. ssrun : types d’expérience |
|
C. ssrun : options |
|
D. prof : analyse |
|
E. prof : options |
|
F. application : ADI |
|
|
|
|
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 |
|
|
|
|
|
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). |
|
|
|
|
|
|
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. |
|
|
|
|
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 |
|
|
|
|
|
|
|
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 %. |
|
|
|
|
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 |
|
|
|
|
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) |
|
|
|
|
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 |
|
|
|
|
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 |
|
|
|
|
|
|
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) |
|
|
|
|
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) |
|
|
|
|
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 |
|
|
|
|
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. |
|
|
|
|
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 |
|
|
|
|
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) |
|
|
|
|
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 |
|
|
|
|
démarche : |
|
9) analyser les évènements avec perfex -a -y -x. |
|
|
|
|
|
|
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 |
|
|
|
|
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. |
|
|
|
|
A. algorithme |
|
B. sous-domaines |
|
C. communications |
|
D. cvbuild |
|
E. cvmake |
|
F. portage |
|
G. ssaggregate |
|
H. application |
|
I. comparaison |
|
J. conclusions |
|
|
|
|
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. |
|
|
|
|
|
|
outil d’analyse de dépendance pour la
compilation; |
|
|
|
interrogations sur les targets : menu query. |
|
|
|
|
outil d’aide à la compilation; |
|
|
|
navigation dans le source, d’erreur en erreur. |
|
|
|
|
|
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. |
|
|
|
|
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] |
|
|
|
|
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). |
|
|
|
|
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 |
|
|
|
|
+-----------+--------+--------+--------++--------+ |
|
| 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 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
|
|
+-----------+--------+--------+--------++--------+ |
|
| 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 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
|
|
+-----------+--------+--------+--------++--------+ |
|
| 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 | |
|
+-----------+--------+--------+--------+--------+--------+--------+--------+--------+--------++--------+ |
|
|
|
|
|
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. |
|