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
Temps d’accès mémoire

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.