Adapp : exécution d'un travail MPI 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 ici la structure des classes sur Adapp.

Attention : depuis le 4 mars 2014, nous avons positionné par défaut la variable MP_USE_BULK_XFER à yes pour activer le RDMA. Cette fonctionnalité permet d'accroître les performances des communications collectives ainsi que le recouvrement calcul/communication. Cependant, quelques codes peuvent voir leurs performances baisser lorsque cette variable est positionnée à yes : vous pouvez désactiver le RDMA pour votre code en valorisant la variable à no juste avant l'exécution de votre binaire (export MP_USE_BULK_XFER=no ou setenv MP_USE_BULK_XFER no).

Pour soumettre un travail MPI en batch depuis adapp, il faut :

  • Créer un script de soumission. Voici un exemple enregistré dans le fichier mpi.ll :

    mpi.ll
    # Nom du travail LoadLeveler
    # @ job_name    = 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    = parallel
    # specifique Adapp
    # @ requirements = (Feature == "prepost")
    # Nombre de processus demandes (ici 16)
    # @ total_tasks = 16
    # Temps ELAPSED max. pour l'ensemble du job en hh:mm:ss (10mn ici)
    # @ wall_clock_limit = 00:10: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 .
    cp $LOADL_STEP_INITDIR/input.data .
    # Execution du programme MPI.
    poe ./a.out
  • Soumettre ce script via la commande llsubmit :

    $ llsubmit mpi.ll

Remarques :

  • Ne pas oublier le mot-clef # @ requirements = (Feature == “prepost”) sinon votre calcul se fera sur les nœuds de calcul “normaux” d'Ada.
  • 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 tape la commande llsubmit (la variable LOADL_STEP_INITDIR est automatiquement valorisée par LoadLeveler).
  • Le fichier de sortie du calcul 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). La valeur maximale que vous pouvez demander est de 30.0 Go par cœur réservé via le mot-clef as_limit. Par exemple, pour demander 7 Go par cœur : # @ as_limit = 7.0gb.
  • La limite de temps Elapsed associée au mot-clef wall_clock_limit est relative à l'ensemble du job. Elle est de 20h maximum pour les classes spécifiques à Adapp.
  • Attention : vous ne pouvez pas dépasser la limite de 32 cœurs pour le pré et le post-traitement.
  • Si votre travail comporte des commandes séquentielles relativement longues (traitements multiples, transferts ou archivages de gros fichiers,…), l'utilisation de travaux multisteps peut se justifier.