Turing : mesures de temps avec libhpcidris

L'IDRIS a développé la bibliothèque libhpcidris permettant de mesurer le temps d'exécution d'une application en l'instrumentant.

Un module est disponible. Il permet de positionner les chemins pour la bibliothèque, les fichiers d'include et les modules Fortran.

module load libhpcidris

Voici un exemple de ce que vous obtenez sur la sortie standard pour l'utilisation des sous-programmes HPCIDRIS_F03_MPI_timer_start_synch et HPCIDRIS_F03_MPI_timer_stop_synch en Fortran ou HPCIDRIS_MPI_timer_start_synch et HPCIDRIS_MPI_timer_stop_synch en C avec un niveau de détails de 2 :

  ----------------------------------------------------------------------
              ELAPSED TIME (libhpcidris version 4.0)
             (C)2009-2013 Philippe WAUTELET, IDRIS-CNRS
  ----------------------------------------------------------------------
     Max (position)   |   Min (position)   |   Average  |      Sum
  ----------------------------------------------------------------------
    0.094133s (    0) |  0.094133s (    5) |  0.094133s |     0.753062s
  ----------------------------------------------------------------------
  --------------------------------------------------------------------------------
                                SYNCHRONIZATION TIME
  --------------------------------------------------------------------------------
           |   Max (position)   |   Min (position)   |   Average  |      Sum
  --------------------------------------------------------------------------------
  At start |  0.000079s (    2) |  0.000001s (    0) |  0.000069s |     0.000550s
  At stop  |  0.082367s (    0) |  0.000005s (    7) |  0.041182s |     0.329453s
  Total    |  0.082368s (    0) |  0.000083s (    7) |  0.041250s |     0.330004s
  --------------------------------------------------------------------------------

Utilisation de libhpcidris dans un programme Fortran

Toutes les fonctionnalités de mesure de temps sont disponibles par le chargement du module Fortran hpcidris (ou hpcidris_timer). Dans votre programme Fortran, il suffit d'ajouter la ligne suivante partout où vous utilisez cette bibliothèque :

use hpcidris

Les sous-programmes disponibles sont les suivants :

  • HPCIDRIS_F03_MPI_timer_start(comm) : démarre la mesure de temps sur tous les processus du communicateur MPI comm. Chaque processus lance le début de sa mesure de temps indépendemment des autres (et donc sans synchronisation).
  • HPCIDRIS_F03_MPI_timer_start_synch(comm) : démarre la mesure de temps avec synchronisation sur tous les processus du communicateur MPI comm. Chaque processus lance le début de sa mesure une fois tous les processus synchronisés. La mesure de temps ne commence donc qu'après synchronisation. Le temps passé entre l'appel à ce sous-programme et le début de la mesure effective peut être affiché lors des appels à HPCIDRIS_F03_MPI_timer_stop et HPCIDRIS_F03_MPI_timer_stop_synch avec un niveau de détails d'au moins 2.
  • HPCIDRIS_F03_MPI_timer_stop(comm,level) : arrête et affiche la mesure de temps sur l'ensemble des processus du communicateur MPI comm. Chaque processus stoppe sa mesure de temps indépendemment des autres (et donc sans synchronisation). Le niveau de détails de l'affichage est choisi avec l'argument level :
    • 0 : pas de sorties,
    • 1 : résumé avec valeurs max, min, moyenne et totale et les rangs des processus avec les valeurs max et min,
    • 2 : idem 1 avec des informations sur les synchronisations (si disponibles),
    • 3 : sorties détaillées pour tous les processus.
  • HPCIDRIS_F03_MPI_timer_stop_synch(comm,level) : arrête après synchronisation et affiche la mesure de temps sur l'ensemble des processus du communicateur MPI comm. Chaque processus stoppe sa mesure de temps après synchronisation. Le temps passé entre l'appel à ce sous-programme et la fin de la mesure effective peut être affiché avec un niveau de détails d'au moins 2. HPCIDRIS_F03_MPI_timer_stop_synch est une fonction Fortran (et non pas une subroutine) qui retourne la mesure de temps en secondes du processus appellant dans un double précision. Le niveau de détails de l'affichage est choisi avec l'argument level :
    • 0 : pas de sorties,
    • 1 : résumé avec valeurs max, min, moyenne et totale et les rangs des processus avec les valeurs max et min,
    • 2 : idem 1 avec des informations sur les synchronisations (si disponibles),
    • 3 : sorties détaillées pour tous les processus.
  • HPCIDRIS_F03_timer_start : démarre la mesure de temps sur le(s) processus appelant(s). Ce sous-programme n'est pas MPI et est donc local au(x) processus l'utilisant.
  • HPCIDRIS_F03_timer_stop : arrête la mesure de temps. HPCIDRIS_F03_timer_stop est une fonction Fortran (et non pas une subroutine) qui retourne la mesure de temps en secondes du processus appellant dans un double précision.

Utilisation de libhpcidris dans un programme C

Toutes les fonctionnalités de mesure de temps sont disponibles en incluant le fichier hpcidris.h (ou hpcidris_timer.h). Dans votre programme C, il suffit d'ajouter la ligne suivante partout où vous utilisez cette bibliothèque :

#include ''hpcidris.h''

Les fonctions disponibles sont les suivantes :

  • void HPCIDRIS_MPI_timer_start(MPI_Comm comm) : démarre la mesure de temps sur tous les processus du communicateur MPI comm. Chaque processus lance le début de sa mesure de temps indépendemment des autres (et donc sans synchronisation).
  • void HPCIDRIS_MPI_timer_start_synch(MPI_Comm comm) : démarre la mesure de temps avec synchronisation sur tous les processus du communicateur MPI comm. Chaque processus lance le début de sa mesure une fois tous les processus synchronisés. La mesure de temps ne commence donc qu'après synchronisation. Le temps passé entre l'appel à ce sous-programme et le début de la mesure effective peut être affiché lors des appels à HPCIDRIS_MPI_timer_stop et HPCIDRIS_MPI_timer_stop_synch avec un niveau de détails d'au moins 2.
  • double HPCIDRIS_MPI_timer_stop(MPI_Comm comm,int level) : arrête et affiche la mesure de temps sur l'ensemble des processus du communicateur MPI comm. Chaque processus stoppe sa mesure de temps indépendemment des autres (et donc sans synchronisation). La valeur de retour correspond à la mesure de temps en secondes du processus appellant. Le niveau de détails de l'affichage est choisi avec l'argument level :
    • 0 : pas de sorties,
    • 1 : résumé avec valeurs max, min, moyenne et totale et les rangs des processus avec les valeurs max et min,
    • 2 : idem 1 avec des informations sur les synchronisations (si disponibles),
    • 3 : sorties détaillées pour tous les processus.
  • double HPCIDRIS_MPI_timer_stop_synch(MPI_Comm comm,int level) : arrête après synchronisation et affiche la mesure de temps sur l'ensemble des processus du communicateur MPI comm. Chaque processus stoppe sa mesure de temps après synchronisation. Le temps passé entre l'appel à ce sous-programme et la fin de la mesure effective peut être affiché avec un niveau de détails d'au moins 2. Le niveau de détails de l'affichage est choisi avec l'argument level :
    • 0 : pas de sorties,
    • 1 : résumé avec valeurs max, min, moyenne et totale et les rangs des processus avec les valeurs max et min,
    • 2 : idem 1 avec des informations sur les synchronisations (si disponibles),
    • 3 : sorties détaillées pour tous les processus.
  • void HPCIDRIS_timer_start() : démarre la mesure de temps sur le(s) processus appelant(s). Ce sous-programme n'est pas MPI et est donc local au(x) processus l'utilisant.
  • double HPCIDRIS_timer_stop() : arrête la mesure de temps. La valeur de retour correspond à la mesure de temps en secondes du processus appellant.

Remarques

  • Les appels engendrent des surcoûts très limités (inférieurs à 1 microseconde). Par contre, si le niveau de détail est supérieur à 0, l'affichage n'est pas instantané et entraîne des communications MPI entre les processus. Les mesures ayant été effectuées avant cette opération, l'affichage ne perturbe pas les mesures.
  • Tous les appels commencant par HPCIDRIS_F03_MPI_ sont des appels collectifs au sens MPI et doivent être réalisés par tous les processus du communicateur spécifié.
  • Toute mesure commencée doit être arrêtée une et une seule fois.
  • Il est tout à fait possible de faire une mesure avec ou sans synchronisation au début ou à la fin (par exemple enchaîner HPCIDRIS_F03_MPI_timer_start_synch avec HPCIDRIS_F03_MPI_timer_stop).