Adapp : exécution d'un travail multitâche en batch

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

Pour soumettre un travail multitâche en batch depuis adapp, 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
    # specifique Adapp
    # @ requirements = (Feature == "prepost")
    # Temps Elapsed max. en hh:mm:ss (ici 30mn)
    # @ wall_clock_limit = 00: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 via la commande llsubmit :

    $ llsubmit openmp.ll

Remarques :

  • Ne pas oublier le mot-clef # @ requirements = (Feature == “prepost”) sinon votre calcul se fera sur les nœuds de calcul standards.
  • 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 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 à 30,0 Go par cœur. Si vous modifiez la limite mémoire, vous devez spécifier une limite par processus via le mot-clef as_limit. Ainsi, si un processus génère 4 threads occupant chacun 30 Go, la limite mémoire doit être positionnée à 4 * 30gb : # @ as_limit = 120gb
  • 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.