Ada : outils de mesure de la mémoire

Avant propos

Sur Ada, la mémoire qui est limitée est la mémoire virtuelle, via le paramètre as_limit dans le script de soumission. La mémoire virtuelle correspond à la quantité de mémoire demandée par chaque processus. Les outils suivants vont permettre de connaitre le maximum de consommation de mémoire virtuelle de vos codes, le module idrmemmpi est destiné au programme MPI, le module idrmem est destiné au programme OpenMP ou séquentiel et la sousroutine procstat peut être inséré dans votre code.

Module idrmemmpi

La bibliothèque idrmemmpi permet d'afficher la consommation maximum de la mémoire virtuelle d'un programme MPI pendant la durée de son exécution. Cet affichage a lieu au moment où l’exécution s'arrête . Il est indispensable de charger le module avant la compilation de votre programme :

$ module load idrmemmpi
$ mpiifort main.f90 -o main

Aucun changement n'est nécessaire dans le script de soumission. On obtient sur la sortie standard à la fin de l’exécution le temps elapsed, le maximum de consommation de mémoire virtuelle (VMSizeMax), le maximum de consommation de mémoire physique (RSSMax) et le maximum de consommation de la pile (StackMax), ainsi que les rangs des processus sur lesquels ces maximums sont atteints.

  IdrisMemMPI v1.4 : elapsed = 0.32 s, VMSizeMax = 497 mB on rank 1, RSSMax = 28 mB on rank 0, StackMax = 408 kB on rank 1

Si vous souhaitez afficher la consommation courante à un moment précis, il suffit d'insérer un appel à la routine idr_print_mem

  CALL idr_print_mem()

Problèmes connus du module idrmemmpi:

  • En mode MPMD, il est nécessaire que l'ensemble des codes soit compilé avec idrmemmpi.

Module idrmem

Nous fournissons l'outil idrmem, disponible avec la commande module. Cet outil permet d'afficher au moment où le programme s'arrête sa consommation maximum de mémoire virtuelle. Pour l'utiliser avec un code séquentiel ou OpenMP:

$ module load idrmem
$ idrmem ./executable

Pour les codes MPI, on peut utiliser aussi idrmem, mais idrmemmpi est à privilégier.

module load idrmem
poe idrmem ./executable

On obtient, dans la sortie standard, le temps elapsed, le maximum de consommation de mémoire virtuelle, le maximum de consommation de mémoire physique et le maximum de consommation de la pile (stack).

  IdrisMem v1.1 : elapsed = 24.61 s, VMSizeMax = 1257 MB, RSSMax = 791 MB, StackMax = 92 kB

Problèmes connus du module ''idrmem'':

  • ne s’arrête pas immédiatement lors d'un appel à MPI_ABORT, utilisez plutôt idrmemmpi;
  • ne fonctionne pas avec une commande qui est un alias;
  • ne donne pas les bons résultats si la commande est un script ou un exécutable qui lance d'autre exécutables;
  • si la limite en temps d'exécution (wall_clock_limit) est atteinte, il n'y aura pas d'affichage.

Subroutine procstat

Si vous souhaitez pouvoir afficher le maximum de consommation mémoire à n'importe quel moment, voici une sous-routine fortran que vous pouvez ajouter dans votre code.

subroutine_procstat
subroutine procstat()
  character(len=128) :: key, mot1, mot2
  integer :: iter
  ! Ouverture du fichier
  OPEN ( UNIT   = 42 ,          FILE     = '/proc/self/status', &
         FORM   = 'formatted' , ACCESS   = 'sequential',        &
         ACTION = 'read' ,      POSITION = 'rewind' )
 
  ! Lecture du nom de l'executable (pour verification)
  READ (UNIT =42 , FMT=* ) key, mot1
  ! Esquive les 10 lignes suivantes
  READ (UNIT=42, FMT='(9/)')
  ! Recupere Vmpeak
  READ (UNIT =42 , FMT=* ) key, mot1, mot2
  print *, 'procstat : VMSizeMax = ', trim(mot1), trim(mot2)
  ! Esquive les 2 lignes suivantes
  READ (UNIT=42, FMT='(1/)')
  READ (UNIT =42 , FMT=* ) key, mot1, mot2
  print *, 'procstat : RSSMax = ', trim(mot1), trim(mot2)
  READ (UNIT=42, FMT='(/)')
  READ (UNIT =42 , FMT=* ) key, mot1, mot2
  print *, 'procstat : StackMax = ', trim(mot1), trim(mot2)
  CLOSE ( UNIT =42 )
end subroutine procstat

Ensuite un call procstat() dans votre code provoquera l'affichage sur la sortie standard du maximum de la consommation de mémoire virtuelle, de mémoire physique et de la pile depuis le lancement de l'application.