Version mise à jour le : 1 mars 2012

Les recommandations de l'IDRIS pour le portage de codes depuis Brodie


La machine vectorielle NEC Brodie est arrêtée depuis février 2012 : voici quelques recommandations afin que la migration des codes vers la machine IBM Vargas puisse s'effectuer correctement.

Utilisation de Vargas, les recommandations de l'IDRIS

La structure actuelle de classes de Vargas (en exploitation depuis le 12/01/2009) impose aux utilisateurs d'exprimer dans leurs scripts de soumission LoadLeveler les limites de temps en temps Elapsed (aussi appelé temps de restitution ou temps d'horloge) et non plus en temps CPU. Ce changement a des conséquences importantes sur l'utilisation optimale de la machine Vargas.

Historiquement, on recommandait d'utiliser en début et fin de job les commandes mfget/mfput pour recopier depuis/vers Gaya des fichiers d'entrée ou de résultat. Cette technique est maintenant à proscrire :

Une nouvelle gestion du flux des données

Les utilisateurs doivent aujourd'hui privilégier l'utilisation du WORKDIR pour stocker localement leurs fichiers sur la machine de calcul. Comparé à un stockage sur Gaya, les gains en performance (vitesse et en latence d'accès) sont considérables (plusieurs ordres de grandeur) pour des fichiers stockés localement . Attention cependant, l'espace WORKDIR n'est pas sauvegardé, la pérennité des données n'y est donc pas garantie. En cas d'incident grave sur ce système de fichiers, événement que l'on ne peut exclure totalement, certains fichiers pourraient être irrémédiablement perdus. En conséquence, il est à la charge des utilisateurs de recopier régulièrement sur Gaya les fichiers considérés comme importants, parce que sensibles ou encore impossibles à recalculer.

Désynchronisation des parties «calcul» et «transferts de fichiers avec Gaya»

Pour certains utilisateurs qui ont développé des chaînes de traitement complexes mettant en œuvre de nombreux fichiers, il est parfois utile - voire indispensable - de pouvoir chaîner des phases de transfert de fichiers depuis/vers Gaya avec des phases de calcul. Dans ces cas particuliers, il est demandé aux utilisateurs d'isoler et de désynchroniser ces phases de transfert de données utilisant les commandes mfput/mfget, des phases de calcul (séquentiel ou parallèle) . En conséquence, les commandes mfput/mfget ne devraient plus apparaître dans les travaux dits de calcul. Des travaux LoadLeveler multi-étapes comprenant des étapes spécifiques séquentielles seront utilisées pour réaliser ces transferts. À cet effet, une classe dédiée nommée « archive » a été créée. L'aiguillage dans cette classe se fait via l'utilisation du mot clé LoadLeveler « # @ class = archive » dans le script de soumission. Aucune limite de temps n'est à préciser dans cette classe : on hérite par défaut des limites maximum de la classe ( 20 heures en Elapsed) afin de s'affranchir de  tout problème ponctuel sur Gaya, via la sécurisation des commandes mfget/mfput. En cas d'incident plus important sur la machine fichiers, cette classe pourra être suspendue en attendant que Gaya soit de nouveau opérationnelle; ainsi aucun transfert ne sera perdu ni aucun travail de calcul affecté par un incident sur Gaya. L'utilisation de cette classe n'est pas facturée; par contre, un suivi est mis en place pour éviter toute dérive de son utilisation.

Choix de l'espace disque à utiliser lors de l'exécution

Lors de l'exécution d'un code, seuls deux types d'espace disque sont accessibles, le WORKDIR et le TMPDIR (il est en effet fortement déconseillé d'utiliser le HOME). L'accès se fait grâce à des variables d'environnement prédéfinies dans le script de soumission du travail (cd $WORKDIR ou cd $TMPDIR). Suivant les caractéristiques du travail, le TMPDIR sera un TMPDIR local (non visible) pour les travaux intra-nœud ou un TMPDIR GPFS partagé (visible) pour les travaux multi-nœuds. Les avantages et les inconvénients liés à l'utilisation de ces différents espaces disque pour l'exécution d'un travail sont résumés dans ces tableaux récapitulatifs. L'IDRIS recommande fortement l'utilisation du TMPDIR, en particulier pour les travaux intensifs en entrées-sorties (I/O) ou pour les travaux qui utilisent fréquemment des fichiers temporaires lors de leur exécution : les performances des I/O y sont bien meilleures et cela se concrétise par une bonne stabilité et des gains significatifs des temps Elapsed des travaux .

Le choix du type d'espace disque optimal à utiliser lors de l'exécution d'un travail est relativement simple : s'il n'est pas indispensable d'avoir la visibilité des fichiers de cet espace disque durant l'exécution (ce qui devrait être le cas genéral), alors il faut utiliser le TMPDIR. Dans les cas exceptionnels ou la visibilité sur les fichiers est indispensable, il faudra utiliser soit le TMPDIR si le travail est parallèle multi-nœuds, soit le WORKDIR dans tous les autres cas. Les travaux multi-étapes sont des cas particuliers pour lesquels on peut toujours utiliser le TMPDIR, espace rémanent d'une étape à l'autre et sur lequel on a la visibilité.

Les différentes étapes d'une exécution type

L'IDRIS recommande de n'avoir recours aux travaux multi-étapes que lorsque cela est vraiment indispensable.
En particulier, si tous les fichiers sont stockés sur le WORKDIR - ce qui est conseillé - il est inutile d'avoir recours à un travail multi-étapes; un travail mono-étape standard est moins lourd à gérer et plus performant (utilisation potentielle du TMPDIR local).

Les travaux multi-étapes ne doivent être utilisés que dans les situations suivantes :

Prototype de travail où les fichiers de l'utilisateur (script de soumission, fichiers d'entrée, exécutable) sont stockés sur le WORKDIR :
  1. se placer dans le TMPDIR,
  2. recopier les fichiers d'entrée et l'exécutable du WORKDIR dans le TMPDIR,
  3. lancer l'exécutable dans le TMPDIR,
  4. recopier les fichiers résultats du TMPDIR dans le WORKDIR.
Voici les exemples de scripts LoadLeveler pour l'exécution d'un code séquentiel, d'un code parallèle OpenMP, d'un code parallèle MPI ou d'un code parallèle hybride MPI+OpenMP.

Une comparaison ligne à ligne d'un job MPI, applicable à tout autre type de travail :
            BRODIE                                                      VARGAS

# ligne obligatoire                                              # ne rien spécifier, shell de connexion pris par défaut
#PBS -S /bin/ksh                                
#PBS -q multi                                                    # @ job_type = parallel

# nom de la requete                                              Nom du travail LoadLeveler
#PBS -N script_sx8                                               # @ job_name = test_MPI

# reservation de 8 processeurs                                   # Nombre de processus demandes
#PBS -l cpunum_job=8                                             # @ total_tasks = 8

# concatene la sortie standard avec l erreur standard            # Fichier de sortie standard, fichier de sortie d'erreur du travail
#PBS -j o                                                        # @ output = $(job_name).$(jobid)    
                                                                 # @ error =  $(job_name).$(jobid)

# temps CPU max par process                                      # n existe pas pour LoadLeveler
#PBS -l cputim_prc=01:00:00
# temps CPU max par job                                          # Temps ELAPSED max. pour l'ensemble du job (1h30mn ici)
#PBS -l cputim_job=04:10:00                                      # @ wall_clock_limit = 1:30:00       
# memoire max par job                                            # Memoire max. demandee par coeur; par defaut stack_limit a 0,5Go
#PBS -l memsz_job=3gb                                            # @ data_limit = 3.1gb  

                                                                 # ligne obligatoire, fin des caracteristiques du travail LoadLeveler.
                                                                 # @ queue

# Echo des commandes passees                                     # Pour avoir l'echo des commandes
set -x                                                           set -x

# On se place dans le repertoire temporaire TMPDIR               # Repertoire temporaire de travail
cd $TMPDIR                                                       cd $TMPDIR
 
# Copie de l'executable depuis le repertoire de soumission       # La variable LOADL_STEP_INITDIR est automatiquement valorisee par 
                                                                 # LoadLeveler avec le repertoire dans lequel on tape la commande llsubmit
cp $PBS_O_WORKDIR/a.out .                                        cp $LOADL_STEP_INITDIR/a.out .
 
# Execution                                                      # Execution
mpirun -np 4 ./a.out                                             ./a.out 

# Sauvegarde des resultats dans le repertoire de soumission      # Sauvegarde des resultats dans le repertoire de soumission
cp solution $PBS_O_WORKDIR/.                                     cp solution $LOADL_STEP_INITDIR

Remarques :

Système de compilation IBM

Vous trouverez dans cette page le moyen d'utiliser le compilateur Fortran xlf sur la machine Vargas; les principales options de ce système de compilation (optimisation, déboggage, endianness) sont décrites ici.

Remarques :