Ada: exécution d'un travail multitâche 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 la structure des classes sur Ada.

Pour soumettre un travail multitâche en batch, il faut :

  • Créer un script de soumission. Voici un exemple, enregistré dans le fichier openmp.ll :
openmp.ll
# Nom arbitraire du travail LoadLeveler
# @ job_name = OpenMP
# 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 = serial
# Nombre de threads demandes (ici 4)
# @ parallel_threads = 4
# Temps Elapsed max. en hh:mm:ss (ici 1h30mn)
# @ wall_clock_limit = 1:30:00
# @ queue
# 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 .
# La memoire STACK max. (defaut 4Mo) utilisee (ici 16 Mo) par
# les variables privees de chaque thread.
export KMP_STACKSIZE=16m
# Il est aussi possible d'utiliser OMP_STACKSIZE
# export OMP_STACKSIZE=16M
# Execution
./a.out
  • Soumettre ce script (uniquement depuis Ada) via la commande llsubmit :
$ llsubmit openmp.ll

Remarques :

  • 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).
  • Le fichier de sortie du calcul OpenMP.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.
  • Le mot-clef parallel_threads indique le nombre cœurs réservés : un thread par cœur. La dénomination parallel_threads prend toute sa signification dans l'exécution de programmes mixtes MPI et OpenMP/Pthreads pour lesquels il faut indiquer à la fois le nombre de processus MPI et le nombre de threads par processus MPI.
  • La valeur de la mémoire par défaut est 3,5 Go par cœur réservé (donc par thread). Cette valeur peut être étendue au maximum à 7 Go par cœur. Le mot-clef #@as_limit désigne une limite mémoire par processus. Ainsi, si un processus génère 4 threads occupant chacun 7 Go, la limite mémoire doit être positionnée à 4 * 7gb : # @ as_limit = 28gb
  • Les variables privées OpenMP sont stockées dans des zones dites STACK associées à chaque thread. Chacune d'elle est limitée par défaut à 4Mo. Pour dépasser cette limite et aller par exemple jusqu'à 16Mo par thread, il faut utiliser la variable d'environnement KMP_STACKSIZE=16m ou OMP_STACKSIZE=16M. Notez que la valeur de OMP_STACKSIZE est automatiquement ajustée sur la valeur de KMP_STACKSIZE lorsque cette dernière est positionnée.
  • Le mot-clef # @ environment permet de définir des variables d'environnement au niveau LoadLeveler ; ne pas l'utiliser pour certaines variables spécifiques d'OpenMP ou du multi-threading (comme OMP_NUM_THREADS) car elles sont définies automatiquement et valorisées par LoadLeveler au début de l'exécution du travail.