Ada : exécution sous environnement Intel d'un travail MPI en batch

Les travaux sont gérés sur l'ensemble des nœuds par le logiciel LoadLeveler. Ils sont répartis dans des classes principalement en fonction du temps Elapsed, du nombre de cœurs et de la mémoire demandés. Vous pouvez consulter ici la structure des classes sur Ada.

Pour optimiser les performances des codes lors des exécutions sous un environnement Intel, l'IDRIS positionne automatiquement certaines variables d'environnement. Ainsi, la variable Intel I_MPI_PIN_DOMAIN est valorisée pour permettre le binding des processus MPI et des threads (jobs hybrides) sur les cœurs physiques de la machine.

Attention : un code compilé sous intel/2015.2 ou une version utlérieure (intel/2016.x, intel/2017.x) NE PEUT PAS être exécuté sous l'environnement IBM (via poe) : il y a incompatibilité entre la bibliothèque MPI IBM actuellement en production et les bibliothèques MPI Intel faisant partie de ces environnements Intel récents.

Attention : l'environnement intel/2013.0 ne doit pas être utilisé pour une exécution batch (job LoadLeveler). En effet, la commande mpirun associée est buggée et renvoie alors le message d'erreur suivant :

$ mpirun -np 8 ./a.out
[mpiexec@ada295] HYDT_bscd_ll_launch_procs (./tools/bootstrap/external/ll_launch.c:67): ll does not support user-defined host lists
*** glibc detected *** mpiexec.hydra: munmap_chunk(): invalid pointer: 0x00000000024bb660 ***

Pour soumettre un travail MPI en batch, il faut :

  • Créer un script de soumission. Voici un exemple enregistré dans le fichier intel_mpi.ll :
intel_mpi.ll
# Nom arbitraire du travail LoadLeveler
# @ job_name = Intel_mpi
# Fichier de sortie standard du travail
# @ output   = $(job_name).$(jobid)
# Fichier de sortie d'erreur du travail
# @ error= $(job_name).$(jobid)
# Type de travail
# @ job_type = mpich
# Nombre de processus MPI demandes
# @ total_tasks = 8
# Permet le passage de total_tasks a mpirun via NB_TASKS
# @ environment = NB_TASKS=$(total_tasks)
# Temps du job hh:mm:ss (1h30mn ici)
# @ wall_clock_limit = 1:30:00
# @ queue
 
# Recommandation : compilez et exécutez vos codes sous un même environnement Intel.
# Donc, si necessaire, utilisez la commande module pour charger l'environnement approprie.
# Par exemple, si votre code est compile avec Intel/2016.2, de-commenter la ligne suivante :
# module load intel/2016.2
 
# Pour avoir l'echo des commandes
set -x
# Repertoire temporaire de travail
cd $TMPDIR
# La variable LOADL_STEP_INITDIR est automatiquement positionnee par
# LoadLeveler au repertoire dans lequel on tape la commande llsubmit
cp $LOADL_STEP_INITDIR/a.out .
# Execution d'un programme parallèle MPI.
mpirun -np $NB_TASKS ./a.out
  • Soumettre ce script (uniquement depuis Ada) via la commande llsubmit :
$ llsubmit intel_mpi.ll

Remarques :

  • Nous vous recommandons de compiler et d'exécuter vos codes sous le même environnement Intel : utilisez la même commande module load intel/… à l'exécution qu'à la compilation.
  • Dans cet exemple, on suppose que l'exécutable a.out se situe dans le répertoire de soumission, c'est-à-dire le répertoire dans lequel on entre la commande llsubmit (la variable LOADL_STEP_INITDIR est automatiquement valorisée par LoadLeveler).
  • Pour une exécution de type Intel, vous devez spécifier la directive # @ job_type = mpich (au lieu de # @ job_type = parallel pour poe IBM).
  • Le nombre de processus MPI est indiqué par la directive # @ total_tasks =… comme pour un job MPI IBM.
  • L'exécution du binaire s'effectue via la commande mpirun avec, comme paramètre le nombre total de processus MPI : mpirun -np $NB_TASKS ./a.out.
  • Le fichier de sortie du calcul Intel_mpi.numero_job se trouve également dans le répertoire de soumission, il est créé dès le début de l'exécution du travail; l'éditer ou le modifier pendant le déroulement du travail peut perturber celui-ci.
  • Mémoire : La valeur par défaut est de 3.5 Go par cœur réservé (donc par tache MPI). Si vous demandez plus de 64 cœurs (mot-clef total_tasks) alors vous ne pouvez pas dépasser cette limite. Sinon, la valeur maximale que vous pouvez demander est de 7.0 Go par cœur réservé via le mot-clef # @ as_limit = 7.0gb.
  • Si votre travail comporte des commandes séquentielles relativement longues (pré ou post-traitement, transferts ou archivages de gros fichiers,…), l'utilisation de travaux multisteps peut se justifier.