Turing : MPITRACE

Description

MPITRACE est un outil fourni et dévellopé par les équipes d'IBM. Il permet d'analyser le comportement d'une application MPI/OpenMP et d'identifier facilement les parties critiques.

Utilisation

L'utilisation de MPITRACE se fait en trois étapes :

  1. Instrumentation de l'application ;
  2. Exécution de l'application instrumentée ;
  3. Analyse des résultats.

Instrumentation

Pour instrumenter votre application MPI, il suffit de positionner, avant l'édition de liens, la commande module :

$ module load mpitrace/mpi
$ mpixlf90_r -o code.exe code.o

Pour instrumenter votre application MPI/OpenMP ou pour avoir des informations détaillées sur les performances de vos entrées-sorties, il faut positionner, avant la compilation, la commande module, et positionner l'option -qsmp à la compilation et l'édition de liens :

$ module load mpitrace/smp
$ mpixlf90_r -c -qsmp=omp code.f90
$ mpixlf90_r -qsmp=omp -o code.exe code.o

Exécution

Lors de l'exécution, nous conseillons le positionnement des variables d'environnement PROFILE_VPROF et PROFILE_JIO :

$ runjob --envs PROFILE_VPROF=yes PROFILE_JIO=yes -n 4096 -p 64 --exe code.exe

Par défaut, le profil du processus 0 est collecté. Après l'exécution, les fichiers suivants sont générés :

  • mpi_profile.<PID>.0 : fichier texte indiquant les performances MPI du processus 0 (voir ci-dessous).
  • vmon.out.0 : fichier binaire utilisé par l'utilitaire bfdprof (voir ci-dessous).
  • hpm_process_summary.<PID>.0 : fichier texte donnant des informations sur les compteurs Hardware.
  • hpm_job_summary.<PID>.0 : fichier texte résumant les informations sur les compteurs Hardware.

Analyse des communications MPI sur le processus 0

Voici ce que l'on peut voir dans le fichier mpi_profile.0 :

$ cat mpi_profile.0
elapsed time from clock-cycles using freq = 850.0 MHz
-----------------------------------------------------------------
MPI Routine                  #calls     avg. bytes      time(sec)
-----------------------------------------------------------------
MPI_Comm_size                     1            0.0          0.000
MPI_Comm_rank                     2            0.0          0.000
MPI_Sendrecv                    600        65536.0          1.087
MPI_Bcast                         1            4.0          0.000
MPI_Reduce                       30            8.0          0.019
MPI_Allreduce                   100            8.0          0.174
-----------------------------------------------------------------
total communication time = 1.280 seconds.
total elapsed time       = 4.318 seconds.

-----------------------------------------------------------------
Message size distributions:

MPI_Sendrecv              #calls    avg. bytes      time(sec)
                             400       32768.0          0.141
                             200      131072.0          0.946

MPI_Bcast                 #calls    avg. bytes      time(sec)
                               1           4.0          0.000

MPI_Reduce                #calls    avg. bytes      time(sec)
                              30           8.0          0.019

MPI_Allreduce             #calls    avg. bytes      time(sec)
                             100           8.0          0.174

-----------------------------------------------------------------
Communication summary for all tasks:

  minimum communication time = 1.280 sec for task 0
  median  communication time = 1.283 sec for task 215
  maximum communication time = 1.284 sec for task 9

taskid  xcoord  ycoord  zcoord  procid   total_comm(sec)   avg_hops
     0       0       0       0       0         1.280   21020696.00
     1       0       0       0       1         1.284   21020696.00
...
...
...
   254       3       3       3       2         1.284   21020696.00
   255       3       3       3       3         1.283   21020696.00

MPI tasks sorted by communication time:
taskid  xcoord  ycoord  zcoord  procid    total_comm(sec)  avg_hops
     0       0       0       0       0         1.280   21020696.00
    16       0       1       0       0         1.281   21020696.00
...
...
...
   253       3       3       3       1         1.284   21020696.00
     9       2       0       0       1         1.284   21020696.00

Profiling de l'application

L'analyse des performance peut se faire à l'aide de la commande bfdprof qui prend en argument le nom de l'exécutable et le fichier binaire vmon.out.0 généré par l'exécution.

module load mpitrace
bfdprof code.exe vmon.out.0 > cpu_profile.0

On peut alors lire le profiling dans le fichier texte “cpu_profile.0” qui contient notamment l’échantillonnage par ligne de code (tics) :

tics | source 
   58|          D2F(n1m1,1:n2,1:n3) = (F (n1,1:n2,1:n3)+F(n1m2,1:n2,1:n3))*B &
    5|          &                     + (F(n1m3,1:n2,1:n3)+G1(1,1:n2,1:n3))*C + F(n1m1,1:n2,1:n3)*A
   85|          D2F(n1  ,1:n2,1:n3) = (G1(         1,1:n2,1:n3)+F(n1m1,1:n2,1:n3))*B &
    5|          &                     + (F(n1m2,1:n2,1:n3)+G1(2,1:n2,1:n3))*C + F(n1  ,1:n2,1:n3)*A

Documentation

Pour aller plus loin :