Personal tools
You are here: Home Calcul Technique Documentation IBM cluster p575 (Power5) Outils d'Analyse Comptage d'évènements
Document Actions

Comptage d'évènements

Description des fonctionnalités et de l'utilisation de HPM Tool Kit

Sections


1. Analyse globale

2. Analyse locale

3. Liste des fonctions

4. Variables d'environnement

5. Liste des groupes d'évènements et statistiques pour Power5

6. Exemples d'utilisation

7. Compilation et édition des liens

8. Glossaire technique (partiel)

Analyse globale

L'analyse globale d'une application, séquentielle ou parallèle (MPI, OpenMP), se fait avec l'utilitaire hpmcount.
Dans le cas séquentiel ou threadé (OpenMP), la séquence de lancement est la suivante :
 hpmcount [-a] [-H] [-k] [-o file] [-s set] command
 hpmcount [-h]

Dans le cas parallèle MPI, la séquence de lancement est la suivante :
 poe hpmcount [-a] [-H] [-k] [-o file] [-s set] command

où:

command le programme à instrumenter
-a aggrège les compteurs pour les applications MPI
-H ajoute l'activité de l'hyperviseur à celle du programme
-h affiche ce message d'aide
-k ajoute l'activité du système à celle du programme
-o file nom du fichier de sortie
-s set ensemble ("set") prédéfini d'évènements (de 1 à 9 pour Power5)

Les options intéressantes sont -s set et -a (uniquement pour les programmes MPI).
La liste des groupes d'évènements ("set") est décrite ; il y a 9 sets pour Power5 et 60 pour Power4.


flechehaut

Analyse locale

La bibliothèque libhpm supporte plusieurs sections instrumentées qui peuvent être parcourues de nombreuses fois.
libhpm supporte les applications OpenMP et threadées. Dans ces cas, la version thread safe de la bibliothèque, libhpm_r.a doit être utilisée.
Les applications 32 et 64 bits sont supportées à partir du moment où tous les modules les composant sont compilés dans le même mode (32 ou 64 bits).

libhpm utilisent les mêmes ensembles ("set") de compteurs d'évènements que hpmcount. Ils doivent être sélectionnés au travers de la variable d'environnement HPM_EVENT_SET.

Les régions instrumentées sont délimitées par des appels à des fonctions issues de libhpm. Les comptes-rendus détaillent les résultats obtenus région par région.

L'usage de libhpm nécessite une recompilation (au moins partielle) de l'application.


flechehaut

Liste des fonctions

Les fonctions suivantes pour l'instrumentation des applications sont fournies. Les fonctions pour le Fortran ont le préfixe f_.
  • Fonction d'initialisation du mécanisme.
    hpmInit (taskID, progName)
    f_hpmInit (taskID, progName)

    Les arguments sont :
    taskID rang du processus (entier)
    progName nom du programme (chaîne de caractères)
  • Fonction de démarrage de l'instrumentation, zone _non_ threadée
    hpmStart (instID, label)
    f_hpmstart (instID, label)

    Les arguments sont :
    instID numéro de la région instrumentée (entier), entre 1 et 100.
    S'il y a plus de 100 régions, il faut utiliser la variable d'environnement HPM_NUM_INST_PTS
    label nom de la région, affiché dans les comptes-rendus (chaîne de caractères)
  • Fonction d'arrêt de l'instrumentation, zone _non_ threadée
    hpmStop (instID)
    f_hpmstop (instID)

    L'argument est :
    instID numéro de la région instrumentée (entier). Durant l'exécution, pour chaque appel à hpmStart, il doit y avoir un appel correspondant à hpmStop avec le même instID.
  • Fonction de démarrage de l'instrumentation, zone threadée
    hpmTstart (instID, label)
    f_hpmtstart (instID, label)

    Les arguments sont :
    instID numéro de la région instrumentée (entier), entre 1 et 100.
    S'il y a plus de 100 régions, il faut utiliser la variable d'environnement HPM_NUM_INST_PTS
    label nom de la région, affiché dans les comptes-rendus (chaîne de caractères)
  • Fonction d'arrêt de l'instrumentation, zone threadée
    hpmTstop (instID)
    f_hpmtstop (instID)

    L'argument est :
    instID numéro de la région instrumentée (entier). Durant l'exécution, pour chaque appel à hpmTstart, il doit y avoir un appel correspondant à hpmTstop avec le même instID.

    N.B. : pour instrumenter des applications threadées, il faut utiliser les fonctions hpmTstart/hpmTstop pour démarrer et arrêter les compteurs de chaque thread. Si deux threads distinctes utilisent le même instID, les compteurs seront additionnées.


flechehaut

Variables d'environnement

Les variables d'nevironnement suivantes sont accessibles pour hpmcount et libhpm.

  • HPM_EVENT_SET
    Elle permet de sélectionner un ensemble ("set") de compteurs d'évènements à mesurer pour la prochaine instrumentation. C'est un entier entre 1 et 9 (Power5) ou 0 et 60 (Power4) ;
  • HPM_NUM_INST_PTS
    Elle permet de modifier le nombre maximal de régions instrumentées dans l'application (100 par défaut). C'et un entier strictement positif ;
  • HPM_WITH_MEASUREMENTS_ERROR
    Elle permet de désactiver la procédure qui essaye de retirer les erreurs lors des mesures. C'est un entier qui vaut 0 (Faux) ou 1 (Vrai) ;
  • HPM_OUTPUT_NAME
    Elle permet de définir un nom différent de celui par défaut pour le compte-rendu.


flechehaut

Liste des groupes d'évènements et statistiques pour Power5

Le terme "compteur" réfère directement à un registre du processeur. Un tel compteur peut comptabiliser différents "évènements". Un évènement pouvant être le nombre d'addition en virgule flottante, le nombre de multiplications en virgule flottante, le nombre de FMA (Floating point Multiply and Add). Les compteurs peuvent être programmés pour compter un certain évènement (à l'aide de hpmcount et du paramètre approprié).

Tous les compteurs ne peuvent pas comptabiliser tous les évènements. Il y a aussi des restrictions sur les évènements qui peuvent être comptazbilisés simultanément. Des combinaisons valides d'évènements correspondant à des compteurs disponibles sont appelés "groupes". Certains groupes, qui peuvent être utiles aux programmeurs, reçoivent un nouveau nom et s'appellent "sets".

Les groupes relatifs au processeurs Power5 sont décrits ci-dessous.

Groupe 1

Il est composé des évènements suivants :

Mapped Group #140: pm_hpmcount1
Mapped Group name: HPM group for set 1
Mapped Group description: HPM group for set 1
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 56: PM_FPU_1FLOP : FPU executed one flop instruction
Counter 2, event 15: PM_CYC [shared] : Processor cycles
Counter 3, event 136: PM_MRK_FPU_FIN : Marked instruction FPU processing finished
Counter 4, event 44: PM_FPU_FIN : FPU produced a result
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_FPU_1FLOP (FPU executed one flop instruction ) : 720192632747
PM_CYC (Processor cycles) : 3043827404574
PM_MRK_FPU_FIN (Marked instruction FPU processing finished : 0
PM_FPU_FIN (FPU produced a result) : 1307467301488
PM_INST_CMPL (Instructions completed) : 2979539268722
PM_RUN_CYC (Run cycles) : 3043827404574
Utilization rate :   99.952 %
MIPS : 1861.037
Instructions per cycle :    0.979
HW Float point instructions per Cycle :    0.430
HW floating point / user time :  817.040 M HWflop/sec
HW floating point rate (HW Flops / WCT) :  816.651 M HWflops/sec

Les lignes en bleu sont intéressantes à suivre.

Groupe 2

Il est composé des évènements suivants :

Mapped Group #141: pm_hpmcount2
Mapped Group name: HPM group for set 2
Mapped Group description: HPM group for set 2
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 12: PM_CYC [shared] : Processor cycles
Counter 2, event 56: PM_FPU_STF : FPU executed store instruction
Counter 3, event 56: PM_INST_DISP : Instructions dispatched
Counter 4, event 115: PM_LSU_LDF : LSU executed Floating Point load instruction
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_CYC (Processor cycles) : 3032186068424
PM_FPU_STF (FPU executed store instruction) : 407973289645
PM_INST_DISP (Instructions dispatched) : 2983427011637
PM_LSU_LDF (LSU executed Floating Point load instruction) : 974142965735
PM_INST_CMPL (Instructions completed) : 2979539261337
PM_RUN_CYC (Run cycles) : 3032186068424
Utilization rate :      99.885 %
Total load and store operations : 1382116.255 M
Instructions per load/store :       2.156
MIPS :    1866.916
Instructions per cycle :       0.983
% Instructions dispatched that completed :      99.870 %

Les lignes en bleu sont intéressantes à suivre.

Groupe 3

Il est composé des évènements suivants :

Mapped Group #142: pm_hpmcount3
Mapped Group name: HPM group for set 3
Mapped Group description: HPM group for set 3
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 12: PM_CYC [shared] : Processor cycles
Counter 2, event 72: PM_INST_DISP_ATTEMPT : Instructions dispatch attempted
Counter 3, event 100: PM_LD_MISS_L1 : L1 D cache load misses
Counter 4, event 171: PM_ST_MISS_L1 : L1 D cache store misses
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_CYC (Processor cycles) : 3035400827181
PM_INST_DISP_ATTEMPT (Instructions dispatch attempted) : 5992881175342
PM_LD_MISS_L1 (L1 D cache load misses) : 19348128333
PM_ST_MISS_L1 (L1 D cache store misses) : 118867102419
PM_INST_CMPL (Instructions completed) : 2979539266373
PM_RUN_CYC (Run cycles) : 3035400827181
Utilization rate :       99.935 %
Total l2 data cache accesses :   138215.231 M
% accesses from L2 per cycle :        4.553 %
L2 traffic : 16871976.410 MBytes
L2 bandwidth per processor :    10565.736 MBytes/sec
MIPS :     1865.877
Instructions per cycle :        0.982

Les lignes en bleu sont intéressantes à suivre.

Groupe 4

Il est composé des évènements suivants :

Mapped Group #130: pm_lsref_tlbmiss
Mapped Group name: Load/Store operations and TLB misses
Mapped Group description: Load/Store operations and TLB misses
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 81: PM_ITLB_MISS : Instruction TLB misses
Counter 2, event 21: PM_DTLB_MISS : Data TLB misses
Counter 3, event 165: PM_ST_REF_L1 : L1 D cache store references
Counter 4, event 106: PM_LD_REF_L1 : L1 D cache load references
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_ITLB_MISS (Instruction TLB misses) : 7851
PM_DTLB_MISS (Data TLB misses) : 10074
PM_ST_REF_L1 (L1 D cache store references) : 413743143174
PM_LD_REF_L1 (L1 D cache load references) : 980560103431
PM_INST_CMPL (Instructions completed) : 2979539262411
PM_RUN_CYC (Run cycles) : 3035740441985
number of loads per TLB miss : 97335725.971
Total load and store operations :  1394303.247 M
Instructions per load/store :        2.137
MIPS :     1862.224

Les lignes en bleu sont intéressantes à suivre.

Groupe 5

Il est composé des évènements suivants :

Mapped Group #43: pm_L1_tlbmiss
Mapped Group name: L1 load and TLB misses
Mapped Group description: L1 load and TLB misses
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 20: PM_DATA_TABLEWALK_CYC : Cycles doing data tablewalks
Counter 2, event 21: PM_DTLB_MISS : Data TLB misses
Counter 3, event 100: PM_LD_MISS_L1 : L1 D cache load misses
Counter 4, event 106: PM_LD_REF_L1 : L1 D cache load references
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_DATA_TABLEWALK_CYC (Cycles doing data tablewalks) : 6000111
PM_DTLB_MISS (Data TLB misses) : 8702
PM_LD_MISS_L1 (L1 D cache load misses) : 19445075540
PM_LD_REF_L1 (L1 D cache load references) : 980582858470
PM_INST_CMPL (Instructions completed) : 2979539264682
PM_RUN_CYC (Run cycles) : 3042642621630
number of loads per TLB miss : 112684768.843
number of loads per load miss :        50.428
MIPS :      1861.966

Les lignes en bleu sont intéressantes à suivre.

Groupe 6

Il est composé des évènements suivants :

Mapped Group #44: pm_L1_DERAT_miss
Mapped Group name: L1 store and DERAT misses
Mapped Group description: L1 store and DERAT misses
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 13: PM_DATA_FROM_L2 : Data loaded from L2
Counter 2, event 137: PM_LSU_DERAT_MISS : DERAT misses
Counter 3, event 165: PM_ST_REF_L1 : L1 D cache store references
Counter 4, event 171: PM_ST_MISS_L1 : L1 D cache store misses
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_DATA_FROM_L2 (Data loaded from L2) : 29633555975
PM_LSU_DERAT_MISS (DERAT misses) : 2094932274
PM_ST_REF_L1 (L1 D cache store references) : 413732930875
PM_ST_MISS_L1 (L1 D cache store misses) : 118867124779
PM_INST_CMPL (Instructions completed) : 2979539263017
PM_RUN_CYC (Run cycles) : 3040003332201
number of stores per store miss :    3.481
MIPS : 1862.166

Les lignes en bleu sont intéressantes à suivre.

Groupe 7

Il est composé des évènements suivants :

Mapped Group #143: pm_hpmcount4
Mapped Group name: HPM group for set 7
Mapped Group description: HPM group for set 7
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 210: PM_TLB_MISS : TLB misses
Counter 2, event 15: PM_CYC [shared] : Processor cycles
Counter 3, event 165: PM_ST_REF_L1 : L1 D cache store references
Counter 4, event 106: PM_LD_REF_L1 : L1 D cache load references
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_TLB_MISS (TLB misses) : 52844
PM_CYC (Processor cycles) : 3029377468830
PM_ST_REF_L1 (L1 D cache store references) : 413767697806
PM_LD_REF_L1 (L1 D cache load references) : 980578989338
PM_INST_CMPL (Instructions completed) : 2979539256273
PM_RUN_CYC (Run cycles) : 3029377468830
Utilization rate :      99.694 %
Total load and store operations : 1394346.687 M
Instructions per load/store :       2.137
MIPS :    1865.084
Instructions per cycle :       0.984

Les lignes en bleu sont intéressantes à suivre.

Groupe 8

Il est composé des évènements suivants :

Mapped Group #49: pm_dsource2
Mapped Group name: L3 cache and memory data access
Mapped Group description: L3 cache and memory data access
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 16: PM_DATA_FROM_L3 : Data loaded from L3
Counter 2, event 18: PM_DATA_FROM_LMEM : Data loaded from local memory
Counter 3, event 187: PM_DATA_FROM_L2MISS : Data loaded missed L2
Counter 4, event 15: PM_DATA_FROM_RMEM : Data loaded from remote memory
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_DATA_FROM_L3 (Data loaded from L3) : 441154714
PM_DATA_FROM_LMEM (Data loaded from local memory) : 1367102447
PM_DATA_FROM_L2MISS (Data loaded missed L2) : 1808455013
PM_DATA_FROM_RMEM (Data loaded from remote memory) : 93055
PM_INST_CMPL (Instructions completed) : 2979539267953
PM_RUN_CYC (Run cycles) : 3036941741157
MIPS : 1864.489

Les lignes en bleu sont intéressantes à suivre.

Groupe 9

Il est composé des évènements suivants :

Mapped Group #144: pm_hpmcount5
Mapped Group name: HPM group for set 9
Mapped Group description: HPM group for set 9
Mapped Group status: Verified
Mapped Group members:
Counter 1, event 12: PM_CYC [shared] : Processor cycles
Counter 2, event 58: PM_MRK_FXU_FIN : Marked instruction FXU processing finished
Counter 3, event 45: PM_FXU_FIN : FXU produced a result
Counter 4, event 48: PM_FXU0_FIN : FXU0 produced a result
Counter 5, event 0: PM_INST_CMPL : Instructions completed
Counter 6, event 0: PM_RUN_CYC : Run cycles

Le compte-rendu pour une instrumentation avec ce groupe prend la forme suivante :

PM_CYC (Processor cycles) : 3017089748556
PM_MRK_FXU_FIN (Marked instruction FXU processing finished) : 0
PM_FXU_FIN (FXU produced a result) : 651318089779
PM_FXU0_FIN (FXU0 produced a result) : 298172082446
PM_INST_CMPL (Instructions completed) : 2979539268623
PM_RUN_CYC (Run cycles) : 3017089748556
Utilization rate :   99.754 %
MIPS : 1873.799
Instructions per cycle :    0.988

Les lignes en bleu sont intéressantes à suivre.


flechehaut

Exemples d'utilisation

Exemple en Fortran

Les programmes Fortran doivent appeler les fonctions commençant par le préfixe "f_". La déclaration suivante est aussi nécessaire dans tous les fichiers source qui ont des appels d'instrumentation.

Déclaration :
#include "f_hpm.h#

Utilisation :
call f_hpminit( taskID, “my program” )
call f_hpmstart( 1, “Do Loop” )
do …
  call do_work()
  call f_hpmstart( 5, “computing meaning of life” );
  call do_more_work();
  call f_hpmstop( 5 );
end do
call f_hpmstop( 1 )
call f_hpmterminate( taskID )

Problème dans l'instrumentation d'un programme multi-threadé

Lorsque l'on place de l'instrumentation au sein de régions parallèles, on foit utiliser différents instID pour chaque thread, comme montré dans l'exemple Fortran ci dessous :

!$OMP PARALLEL
!$OMP&PRIVATE (instID)
instID = 30+omp_get_thread_num()
call f_hpmtstart( instID, "computing meaning of life" )
!$OMP DO
do ...
do_work()
end do
call f_hpmtstop( instID )
!$OMP END PARALLEL

Il faut noter que les fonctions hpmTstart et hpmTstop sont nécessaires dans les programmes threadés.
Le paramètre instID doit toujours être une variable ou un nombre, il ne peut pas être une expression. Cela est du à la présence dans le fichier inclus de directives "define" utilisées durant la phase de pré-processing.
La librairie accepte l'utilisation du même instID pour différentes threads. Cependant, les compteurs seront additionnés pour toutes les instances avec le même instID.

Exemple en C,C++

La syntaxe pour le C et le C++ est la même. Cependant, les fichiers d'include sont différents puisque les routines de libhpm doivent être déclarées comme étant des "extern C".

Déclaration :
#include "libhpm.h#

Utilisation :
hpmInit( tasked, “my program” );
hpmStart( 1, “outer call” );
do_work();
hpmStart( 2, “computing meaning of life” );
do_more_work();
hpmStop( 2 );
hpmStop( 1 );
hpmTerminate( taskID );


flechehaut

Compilation et édition des liens

Afin d'utiliser la bibliothèque libhpm, on doit ajouter libpmapi.a libhpm.a (ou libhpm_r.a) et liblm (ou libmass.a) à l'édition des liens :
#
HPM_DIR = /usr/pmapi
HPM_INC = -I$(HPM_DIR)/include
HPM_LIB = -L$(HPM_DIR)/lib -lhpm_r -lpmapi -lm
FFLAGS = -qsuffix=cpp=f ...

my.x : my.f
     $(FF) $(HPM_INC) $(FFLAGS) my.f $(HPM_LIB) -o my.x

L'option de compilation -qsuffix=cpp=f est nécessaire pour la compilation des fichiers Fortran avec l'extension “.f”.


flechehaut

Glossaire

Quelques définitions utiles ...

Total time in user mode (User Time) User time = Cycles / Processor frequency
Utilization rate User time / Wall clock time
Instructions per cycle Instructions completed / Cycles
MIPS 0.000001 * Instructions completed /Wall clock time
Percentage of instructions dispatched that completed 100 * Instructions completed / Instructions dispatched
Load and store operations (Total LS) Total LS = Loads + Stores
Instructions per load/store Instructions completed / Total LS
Average number of loads per load miss Loads / Load misses in L1
Average number of stores per store miss Stores / Store misses in L1
Average number of loads per TLB miss Loads / TLB misses
Hardware float point instructions per cycle FPU 0 + FPU 1 ) / Cycles
Hardware float point instructions / user time FPU 0 + FPU 1 ) / User time
L2 traffic L2 loads * Cache Line Size * 0.000001
L2 bandwidth L2 traffic / wall clock time


flechehaut

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: