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 là ; il y a 9 sets pour Power5 et 60 pour Power4.
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.
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_PTSlabel 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_PTSlabel 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.
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.
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.
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 );
Compilation et édition des liens
Afin d'utiliser la bibliothèque
#
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”.
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 |