Personal tools
You are here: Home Calcul Technique Documentation IBM cluster p690 (Power4) Foire aux Questions
Document Actions

Foire aux Questions

Questions / réponses fréquentes des utilisateurs

Configuration matérielle

Configuration logicielle

Passage Illiac8 -> cluster IBM

Compilation

Portage

Déboguage

Optimisation

Exécution

Soumission batch Loadleveler

En cas de problème


Configuration matérielle


Quels espaces de travail sont à ma disposition ?

Chaque utilisateur dispose d'un compte informatique sur le cluster IBM qui contient trois espaces disques permanents, munis de quotas disques.
Il s'agit :
  • d'un espace pour ses fichiers sources, $HOME_DIR dans le /home,
  • d'un espace de travail, $HOME_WORK dans le /work,
  • d'un espace dédié à la migration $HOME_SAVE dans le /save.

Ces trois espaces, sécurisés en RAID 5, sont physiquement localisés dans la baie externe FastT500 (voir la configuration du cluster).
L'espace $HOME_DIR sera prochainement doté d'un logiciel de sauvegarde.

La migration des fichiers se fait au travers du logiciel TSM, propriété d'IBM, sur le robot ADIC/Grau Scalar 1000. Voir la page consacrée au service de migration des données.

Enfin, lors de la soumission des calculs en batch, un espace de travail temporaire est alloué, au sein des disques locaux (400 Go disponibles par noeud), sur le noeud d'exécution du job, pour chaque soumission. Cet espace est libéré à la fin du job.

La procédure de soumission avec les contraintes qu'elle engendre est présentée dans la page consacrée au mode batch.

Voir aussi la page consacrée aux espaces de travail.


flechehaut

Comment connaitre l'espace disque occupé dans /home, /work ?

Tous les espaces disques attribués aux comptes utilisateurs sont soumis aux quotas.
La commande quota usuelle ne s'applique par pour les espaces /home et /work car ce sont des systèmes de fichiers particuliers, de type GPFS (Global Parallel File System).
Il faut employer une commande particuliere

/usr/lpp/mmfs/bin/mmlsquota -v
On peut par exemple créer un alias :
(en C Shell) alias qt '/usr/lpp/mmfs/bin/mmlsquota -v'
(en Korn Shell) alias qt='/usr/lpp/mmfs/bin/mmlsquota -v'

On obtient alors les informations suivantes (ou analogues) :

Block Limits
Filesystem type KB quota limit in_doubt grace
home USR 118262 204800 225280 0 none
indus USR 0 0 0 0 none
work USR 4679528 7340032 7864320 0 none

Dans l'espace /home, 118262 ko sont occupés avec une limite de 204800 ko et un maximum de 225 280 ko. Si on dépasse la limite, il faut y rester moins de 7 jours consécutifs.
Dans l'espace /work, 4679528 ko sont occupés avec une limite de 7340032 ko et un maximum de 7864320 ko. L'espace /indus ne concerne que certains utilisateurs particuliers.


flechehaut

Quelle vision a-t-on du cluster d'IBM ?

L'utilisateur ne voit que la partie du cluster sur laquelle il se connecte, à savoir 4 processeurs et 4 Go de mémoire du noeud joe. Le reste de la configuration, inaccessible, est dédiée au batch.
Les jobs soumis en mode interactif prennent leurs ressources dans la partie de connection du noeud joe.
Les jobs soumis en mode batch prennent leurs ressources soit dans le reste du noeud joe soit dans le noeud jack selon les disponibilitées.

Les espaces permanents sont installés physiquement sur la baie FastT500 et sont vus par les deux noeuds. La procédure de soumission de calculs en batch inclut les phases de transfert automatique des fichiers entre l'espace permanent initial et le répertoire temporaire alloué dans les disques locaux du noeud d'exécution.
Il est important d'utiliser ces disques internes plutôt que les espaces permanents car les débits d'écriture / ecture sont nettement meilleurs et l'application en cours d'exécution n'est pas pénalisée.


flechehaut

Configuration logicielle


Quels types d'application sont supportés par le cluster IBM ?

Il n'y a, a priori, aucun exclusion particulière.
Les applications à base d'échanges de messages (MPI, PVM, ...) s'exécutent indifféremment sur un noeud ou à cheval sur plusieurs. Ce mode est choisi par défaut. Il est possible de l'inhiber, job par job, selon les besoins en communication de l'application. Voir la page consacrée à LoadLeveler pour plus de détails.
Les applications utilisant la mémoire partagée (OpenMP, p-threads, ...) ont comme contrainte de ne pas pouvoir sortir d'un noeud.


flechehaut

Quelles librairies scientifiques sont installées sur le cluster IBM ?

Plusieurs librairies scientifiques sont installées sur le cluster IBM :

  • la librairie de fonctions mathématiques standards MASS ;
  • la librairie scientifique ESSL et sa version parallèle P-ESSL ;
  • la librairie domaine public BLAS est incluse dans ESSL ;
  • la librairie domaine public LAPACK (en partie seulement dans ESSL).

Pour le détail des contenus et les modalités d'utilisation, vous pouvez consulter la page des bibliothèques scientifiques.


flechehaut

Passage Illiac8 -> cluster IBM


Peut-on ré-utiliser des fichiers binaires d'Illiac8 ?

Les fichiers de données binaires, comme les fichiers de reprise, les fichiers non formatées, ont la même représentation interne sur les machines SGI (en particulier les Origin2000 et Origin3000) et IBM (p690-Power4 et p575-Power5). Il n'y a donc aucun problème pour relire ces fichiers. Par contre, les fichiers objets, librairies, archives et exécutables doivent être recompilés.
flechehaut

Comment porter un code d'Illiac8 vers le cluster IBM ?

Dans la mesure où le programme est écrit en respectant les rèles et la norme du langage, le portage devrait s'effectuer facilement avec peut-être quelques modifications mineures concernant la mesure du temps (s'il y a lieu).
Pour un programme qui ne respecte pas complètement la norme, cela peut être plus long car le compilateur XLF n'accepte pas forcément des écarts tolérés par d'autres compilateurs, e.g. MIPSpro de SGI, et vice versa.

De manière générale, on peut suivre les principes énoncés ci-dessous :


flechehaut

Correspondance d'options SGI / IBM

Le tableau suivant fournit quelques correspondances importantes lors du portage du code. Toutefois, il est vivement conseillé de parcourir les rubriques des pages sur les environnements XLF ou XLC.
Catégorie Option SGI Option IBM
Déboguage -O0 -g -DEBUG:subscript_check=ON:
trap_uninitialized=ON:
div_check=3:verbose_runtime=ON
-qnooptimize -qcheck -qdbg -qextchk -qflttrap=:ov:und:zero:inv:en -qfullpath -qinitauto=FF -qfloat=nans
Portage -r8 -qdpc=e -qautodbl=dbl4
Optimisation (équivalence toute relative) -r10000 -mips4 -O3 -OPT:IEEE_arithmetic=1:roundoff=0 -qhot -O3 -qstrict -qarch=auto -qtune=auto

flechehaut

Comment mesure-t-on le temps dans un programme ?

Les routines de mesure du temps sont décrites dans la partie page des conseils pratiques.


flechehaut

Quelles sont les différences matérielles entre Illiac8 et le cluster IBM ?

Illiac8 est un supercalculateur SGI Origin2000, 64 processeurs 32 Go de mémoire ccNUMA à image système unique. Cela signifie qu'une application peut utiliser toutes les ressources, qu'elle repose sur l'échange de messages ou la mémoire partagé.

Le cluster IBM est composé de deux noeuds p690 Turbo (32 processeurs et 32 Go de mémoire chacun), indépendants, interconnectés par un switch haut débit Colony. Les applications à base d'échanges de messages (MPI, PVM, ...) s'exécutent indifféremment sur un noeud ou à cheval sur plusieurs, bien que ce dernier mode ne soit pas conseillé car peu performant. Les applications utilisant la mémoire partagée (OpenMP, p-threads, ...) ont comme contrainte de ne pas pouvoir sortir d'un noeud.

Les processeurs Power4 sur le cluster ont une fréquence d'horloge de 1.3 GHz, soit environ 6.5 fois celle des processeurs MIPS R10000 d'Illiac8 (195 MHz). Une différence importante est la capacité des processeurs Power4 de réaliser 4 opérations en virgule flottante par cycle d'horloge (2 couples addition-multiplication, ), soit le double des processeurs R10000. Ainsi chaque processeur a une puissance crête théorique de 5.2 GFlops par comparaison aux 390 MFlops des processeurs R10000. La nouvelle configuration est théoriquement 13 fois plus puissante.


flechehaut

Quelles sont les différences logicielles entre Illiac8 et le cluster IBM ?

L'environnement de tout calculateur comprend des fonctionnalitées analogues : compilateurs, débogueur, outils l'analyse, bibliothèques scientifiques, soumission batch, etc ... ces outils étant plus ou moins équivalents. Le petit tableau suivant reprend ces comparaisons :
Logiciel SGI IBM Liens vers les pages de la documentation
Compilateur F77, F90, cc xlf_r, xlf90_r, xlc, ... XLF ou XLC
Débogueur cvd, dbx dbx, pdbx Déboguage
Outils d'analyse perfex, speedshop, workshop prof, gprof outils d'analyse
Bibliothèques scientifiques BLAS, LAPACK, SCSL BLAS, LAPACK, ESSL, P-ESSL bibliothèques scientifiques
Soumission batch NQE / NQS Loadleveler mode batch ,
Loadleveler.

flechehaut

Comment fonctionne la migration des données ?

Le service de migration des données permet de placer des fichiers de résultats sur des bandes magnétiques dans le robot ADIC/Scalar 1000 comme c'était le cas auparavant sur Illiac8. Le fichier est soit présent sur disque uniquement, soit sur disque et sur bande magnétique, soit uniquement sur bande ce qui permet de libérer de la place disque tout en conservant un exemplaire du fichier. Il faut noter qu'il s'agit de migration et non pas de sauvegarde.
Il repose sur le logiciel TSM, plus particulièrement son module HSM (Hierarchical Storage Manager). Vous pouvez consulter la page qui lui est consacrée.
flechehaut

Compilation


Quel compilateur choisir ?

Pour le Fortran, comme pour le C, il existe plusieurs commandes de compilation, toutes faisant référence au compilateur XLF ou XLC.

Pour les applications séquentielles il est conseillé d'utiliser la version threadsafe des compilateurs (extension _r) : xlf_r, xlf90_r ou xlf95_r selon la norme du Fortran souhaitée.

Cela est obligatoire pour les applications utilisant les threads (comme les programmes OpenMP).

Pour les applications MPI, il faut ajouter le préfixe mp : mpxlf_r, mpxlf90_r ou mpxlf95_r. Pour qu'un job soumis en batch puisse être checkpointé (arrêté et relancé aprè un reboot par exemple), il doit être compilé avec une version threadsafe des compilateurs.

voir les rubriques des compilateurs dans les pages sur leur environnement, XLF ou XLC qui reprennent ces informations.


flechehaut

Quelles options de compilation choisir ?

Les compilateurs XLF et b>XLC possèdent de très nombreuses options qui sont regroupées par catégorie. Ces différentes catégories sont présentées dans les pages consacrées à leur environnement, XLF ou XLC.
Chaque rubrique propose un groupe d'options de base selon le but de la compilation : déboguage, portage, optimisation, analyse des optimisations au travers des listings de sortie de compilation, etc...

On peut aussi récupérer des fichiers de compilation Makefile qu'il suffit de compléter avec la liste des fichiers à compiler. Pour cela, vous pouvez consulter la rubrique Exemples de Makefile des pages consacrées aux environnements XLF ou XLC.


flechehaut

Portage

Existe-t'il un générateur de nombres pseudo-aléatoires portable en Fortran ?

Le Fortran 90 dispose de son propre générateur pseudo-aléatoire qui peut être appelé par des codes séquentiels, parallèles (MPI, OpenMP).
La page des Conseils pratiques propose des exemples pour son usage.


flechehaut

Déboguage


Comment comprendre les messages d'erreur ?

Les messages d'erreurs sont décrits dans la rubrique Messages d'erreur courants des pages consacrées aux environnements XLF ou XLC.


flechehaut

Comment comprendre les listings produits par le compilateur ?

Les listings produits par le compilateur sont décrits dans la rubrique Listings du compilateur des pages consacrées aux environnements XLF ou XLC.


flechehaut

Comment déboguer un programme ?

Déboguer un programme est une phase préliminaire à toute exploitation.
Pour cela (par exemple en Fortran) :

  1. on compile le code avec une séquence d'options adéquates (rubrique options de déboguage) ;
  2. on autorise la création de fichiers core avec la commande ulimit coredumpsize ;
  3. lors d'un éventuel plantage à l'exécution on utilise un débogueur symbolique comme dbx ou pdbx (une version parallèle de dbx) pour analyser les causes de l'arrêt.

On peut aussi consulter la pages desconseils pratiques.


flechehaut

Que faire en cas de Segmentation Fault ?

Le Segmentation Fault survient en cours d'exécution de programme lorsque l'espace mémoire que peuvent occuper les données est trop petit. Il peut y avoir plusieurs causes :

  • limites interactives : le shell, environnement d'exécution du programme possède des limites par défaut qui peuvent être trop restrictives pour le programme : avec la commande unlimit on fait sauter cette barrière. On relance alors simplement le code.

  • limites données à l'édition des liens : par défaut, les programmes sont compilés pour un espace d'adressage stocké sur 32 bits, soit un volume mémoire total de 2 Go pour la pile (stack) et le tas (heap). La pile a le droit d'occuper un volume maximal de un segment soit 256 Mo, elle contient les variables locales, les tableaux automatiques, ... . Cette limite ne peut être dépassée en mode 32bits. Le tas a aussi une limite par défaut de un segment soit 256 Mo, on peut la faire monter jusqu'à 8 segments soit 2 Go avec l'option -bmaxdata avec -bmaxdata:0xY0000000 où Y indique le nombre de segments de 256 Mo que l'on veut réserver.
    Pour un espace d'adressage sur 64bits, il n'y a plus de limites ni pour la stack, ni pour le heap, dans ce cas il ne faut pas utiliser l'option -bmaxdata.

  • sortie de l'adressage 32 bits : si l'ensemble des données adressées par un processus est supérieur à 2 Go de mémoire, on peut soit envisager de répartir différemment les données, soitd'augmenter le nombre de processus de l'application pour repasser sous la barre des 2 Go soit encore recompiler intégralement son programme en mode 64 bits, i.e les adresses mémoire sont stockées sur 64 bits et non plus sur 32. Dans ce cas il faut faire attention, surtout en C, ou les types entiers sont souvent utilisés comme pointeurs t contiennent alors es adresses mémoire !

  • débordement de tableaux : il peut aussi s'agir d'un bogue du code lié à un débordement de tableaux. Dans ce cas il faut recompiler (rubrique options de déboguage) le code avec des options de déboguage adaptées, autoriser la création de fichiers core (ulimit coredumpsize) et ensuite analyser le fichier core généré lors du crash de l'application avec le débogueur symbolique dbx.


flechehaut

Optimisation


Comment optimiser un programme ?

L'optimisation se fait après le déboguage. Pour cela (par exemple en Fortran) :

  1. on compile le code avec une séquence d'options adéquates : rubriques optimisation (sans oublier les options de profilage comme -pg) et listing ;
  2. on étudie les listings générés lors de la compilation, voir la page sur l'environnement XLF, rubrique listings du compilateur ;
  3. on exécute le code en batch pour avoir des mesures plus fiables ;
  4. on analyse le compte-rendu d'exécution à l'aide d'outils de profilage comme gprof pour localiser les goulots d'étranglement.
  5. on valide la précision des résultats numériques pour chaque niveau d'optimisation testé.

Il ne faut pas trop se reposer sur les compilateurs XLF et b>XLC. En effet un travail d'optimisation à la main peut parfois être nécessaire pour obtenir de meilleures performances. Pour cela on peut consulter les pages des techniques d'optimisation et des conseils pratiques.


flechehaut

Comment localiser la consommation CPU d'un programme ?

L'analyse de la consommation CPU se fait à l'aide d'outils de profilage. Pour cela (par exemple en Fortran) :

  1. on compile le code avec des options d'optimisation et les options de profilage comme -pg ;
  2. on exécute le code en batch pour avoir des mesures plus fiables ;
  3. on analyse le compte-rendu d'exécution à l'aide d'outils de profilage comme gprof.


flechehaut

Comment analyser les communications d'une application parallèle MPI ?

Les communications représentent une phase importante dans une application parallèle MPI : par définition, elles sont un surcoût par rapport aux calculs effectués. Il est donc important de limiter au maximum leur impact. Pour tracer leur déroulement, on peut utiliser l'option trace de l'outil pct (Performance Collection Tool du PE Benchmarker d'IBM) qui permet de marquer les différents types de communications. Pour plus d'informations sur cet outil, voir sa page.
On peut ensuite visualiser graphiquement (ou sous forme de statistiques) ces traces à l'aide de pvt (Profile Visualization Tool du PE Benchmarker d'IBM). Pour plus d'informations sur cet outil, voir sa page.


flechehaut

Comment localiser les cache misses d'un programme ?

Les cache misses (défauts de cache) surviennent lorsque le processeur a besoin de données qui ne figurent ni dans ses registres ni dans les différents niveaux de cache. Chercher ces données en mémoire est alors très pénalisant en terme de performances. Pour localiser les zones du programme qui génèrent beaucoup de cache misses, on peut les comptabiliser à l'aide des compteurs matériels. Pour cela, on utilise l'option profilage de l'outil pct. Pour plus d'informations sur cet outil, voir sa page.

On peut ensuite visualiser graphiquement (ou sous forme de statistiques) ces traces à l'aide de jumpshot, outil graphique de l'Argonne National Laboratory. Pour plus d'informations sur cet outil, voir sa rubrique.


flechehaut

Exécution


Exécution en interactif ou en batch ?

Le cluster IBM est séparé en deux parties distinctes :

  • une partie connection, compilation, interactif doté de ressources propres : 4 processeurs Power4 et 4 Go de mémoire, provenant du noeud 1, joe. Cela permet aux utilisateurs de travailler sur leurs fichiers source, faire des compilations, faire du déboguage, faire des courtes exécutions en interactif puisqu'une limite maximale de 900 secondes CPU est fixée (ce qui représente près de deux heures CPU sur un processeur d'Illiac8). Ces différentes activités se partagent ces ressources. Il faut noter que toute commande agit alors sur les fichiers stockés sur la baie externe FastT500, au travers de liens Fiber Channel dont le débit est inférieur d'un ordre de grandeur à ceux de disques locaux. Par conséquent il n'est pas recommandé de faire des tests d'écriture en interactif puisque les performances ne sont pas optimales et que ces liens servent aussi à ceux qui éditent des fichiers.
  • une partie batch qui englobe le reste du noeud 1, soit 28 processeurs Power4 / 28 Go de mémoire d'une part et l'intégralité du noeud 2, jack, 32 processeurs Power4 / 32 Go de mémoire d'autre part. Il s'agit de deux "noeuds" indépendants. La possibilité de faire tourner un job à cheval sur les deux "noeuds" n'est pas activée en raison du manque de performances du switch d'interconnection Colony. L'accès à ces ressources se fait uniquement en mode batch au travers du logiciel de soumission loadleveler dont la procédure d'utilisation est présentée dans la page consacrée au mode batch.


flechehaut

Comment déterminer la consommation mémoire d'un code ?

Dès la compilation, le volume mémoire des données est imposé par le compilateur.
La mémoire est vue comme des segments de 256 Mo chacun. Par défaut, un seul est alloué pour les données globales (le heap). Si vous avez besoin de plus, cela peut se paramétrer avec l'option -bmaxdata lors de l'édition des liens.

Un corollaire direct est qu'un code qui passe en interactif vous donne le nombre de segments mémoire nécessaires pour votre programme et donc vous permet de renseigner la demande en mémoire pour une soumission en batch. Il est impératif de donner à loadleveler une valeur au moins égale au nombre de segments demandés lors de la compilation : loadleveler se base aussi sur cela pour vérifier que le code ne prend pas plus de mémoire que celle demandée.
Il faut noter qu'aussi bien lors de la compilation que pour loadleveler, il s'agit de valeur par processus : il n'y a pas de multiplication à faire !


flechehaut

Pourquoi le système me dit qu'il n'y a pas assez de mémoire disponible ?

Le message d'erreur suivant :

exec(): 0509-036 Cannot load program ./ram.out because of the following errors:
0509-026 System error: There is not enough memory available now.
indique, au premier abord, qu'il n'y a pas assez de mémoire disponible pour exécuter le programme.

En fait, il faut souvent chercher l'origine ailleurs que dans la surcharge de la machine !
La mémoire est vue comme des segments de 256 Mo chacun. Par défaut, un seul est alloué pour les données globales (le heap).
Si les données statiques (common, variables statiques, variables initialisées, ...) remplissent plus que ce segment, le programme ne peut démarrer. Il faut alors augmenter le nombre de segments que le code peut être amener à occuper.
On employe alors l'option -bmaxdata lors de l'édition des liens.

La commande size permet de connaitre le volume en mémoire de ces données et donc de déterminer le nombre de segments à allouer. Par exemple le programme suivant :

size -d -f ram.out
ram.out: 3697(.text) + 335(.data) + 1316928012(.bss) + 949(.loader) + 12(.except) = 1316933005
occupe 1.3 Go de mémoire avec des variables statiques.
Il faut donc ajouter l'option -bmaxdata à la compilation qui devient alors :
xlf90 ram.f -qfixed -O2 -bmaxdata:0x50000000 -o ram.out
Et l'exécution se passe sans soucis.

Dans le cas où les données représentent plus de 2 Go de mémoire, il faut compiler en mode 64 bits avec l'option -q64 (les limites du compilateur).


flechehaut

Comment compiler et faire tourner un job MPI ?

L'exécution d'une application MPI repose sur l'environnement parallèle PE.
Prenons l'exemple du Fortran.
Un code MPI doit être compilé avec une commande de la famille mpxlf comme : mpxlf_r, mpxlf90_r ou mpxlf95_r. Voir la page de l'environnement de compilation.
On utilise des options analogues à celles d'un code séquentiel : déboguage, optimisation, etc ... Il faut simplement préciser la librairie MPI lors de l'édition des liens avec -lmpi.

Voir l'exemple simple de programme MPI : programme source, makefile, script de soumission à loadleveler.


Il y a plusieurs manières de lancer l'exécution d'un code MPI (ici sur 4 processus) :

  • la commande poe : poe ./a.out -procs 4 ;
  • la variable d'environnement MP_PROCS : setenv MP_PROCS 4 puis le lancement avec ./a.out.
  • l'exécutable avec le nombre de processus : ./a.out -procs 4.

  • Il convient de renseigner plusieurs variables d'environnement :

  • setenv MP_PROCS nbprocs
  • setenv MP_EUILIB ip
  • setenv MP_SHARED_MEMORY yes
  • setenv MP_WAIT_MODE poll

  • Ces initialisations sont faites par défaut.


    Les commandes loadleveler pour l'exécution en mode batch sont :

  • soumission : llsubmit ;
  • suivi : llq ;
  • arrêt : llcancel.
  • Voir les pages consacrées à loadleveler et aux modes de soumission des jobs.


    flechehaut

    Comment compiler et faire tourner un job OpenMP ?

    Un code OpenMP est un code séquentiel qui crée des threads. Il doit donc être compilé avec un compilateur threadsafe. Pour un programme écrit en fortran, il faut donc prendre une commande de la famille xlf_r comme : xlf_r, xlf90_r ou xlf95_r. Voir la page de l'environnement de compilation.
    On utilise des options analogues à celles d'un code séquentiel : déboguage, optimisation, etc ... Il faut simplement préciser l'option -qsmp=omp à la compilation. Le niveau d'optimisation doit au moins être -O3 pour que les optimisations liées à la parallélisation soient efficaces.

    Voir l'exemple simple de programme OpenMP : programme source, makefile, script de soumission à loadleveler.


    Il convient de renseigner plusieurs variables d'environnement :

  • setenv AIXTHREAD_SCOPE S
  • setenv SPINLOOPTIME 1000000
  • setenv YIELDLOOPTIME 1000000
  • setenv OMP_NUM_THREADS 4

  • Ces initialisations sont faites par défaut.



    Les commandes loadleveler pour l'exécution en mode batch sont :

  • soumission : llsubmit ;
  • suivi : llq ;
  • arrêt : llcancel.
  • Attention !!
    Sur les machines IBM, les threads OpenMP ne sont pas des "vrais" processus, mais des processus légers. D'un point de vue ressources consommées, elles sont donc incluses au sein de la thread maîtresse soit le "vrai" processus de l'application.

    Il ne faut pas oublier que la data_limit est la mémoire par processus (au sens IBM), il faut donc que vous déterminez la consommation mémoire de toutes les threads et que vous affectiez cette somme à la variable data_limit dans le script de soumission batch.

    Voir les pages consacrées à loadleveler et aux modes de soumission des jobs.


    flechehaut

    Comment compiler et faire tourner un job PVM ?

    La librairie PVM installée est la librairie domaine public puisque IBM ne supporte plus une version optimisée.

    Il faut employer un compilateur threadsafe comme : xlf_r, xlf90_r ou xlf95_r. Voir la page de l'environnement de compilation.
    On utilise des options analogues à celles d'un code séquentiel : déboguage, optimisation, etc ... Il faut simplement préciser les chemins vers les includes, les librairies PVM qui sont basés sur les variables d'environnement PVM_ROOT et PVM_ARCH :

  • setenv PVM_ROOT /usr/lpp/aix4pub/pvm3
  • setenv PVM_ARCH AIX46K

  • d'où :

  • PVMINCLUDE= $(PVM_ROOT)/include
  • PVMLIB = $(PVM_ROOT)/lib/$(PVM_ARCH)
  • On ajoute à la compilation -I$(PVMINCLUDE).
    On ajoute à l'édition des liens -L$(PVMLIB) -lpvm3 -lfpvm3 -lgpvm3

    Le lancement de l'exécution se fait après l'initialisation du daemon pvm avec echo quit | pvm.


    Les commandes loadleveler pour l'exécution en mode batch sont :

  • soumission : llsubmit ;
  • suivi : llq ;
  • suppression : llcancel.

  • flechehaut

    Soumission batch Loadleveler


    Comment fonctionne la soumission des calculs ?

    On peut consulter les pages consacrées d'une part à Loadleveler et d'autre part aux modes de soumission des jobs.


    flechehaut

    Comment construire un script de soumission batch ?

    On peut consulter les pages consacrées d'une part à Loadleveler et d'autre part aux modes de soumission des jobs.

    On peut aussi récupérer des scripts type pour des soumissions de jobs séquentiels, MPI ou OpenMP, Gaussian ksh ou csh, Jaguar (ksh ou csh) et Gamess (ksh ou csh) .

    Si vous ne trouvez pas de type de jobs qui corresponde à vos besoins, alors prenez contact avec nous en ouvrant un ticket d'assistance.


    flechehaut

    Comment soumettre, suivre ou détruire un job en batch ?

    La commande llstatus -R permet de connaitre les ressources disponibles (d'après les ionformations en possession de Loadleveler) :

    llstatus -R
    Machine Consumable Resource(Available, Total)
    ------------------------------ -------------------------------------------------
    ll-jack ConsumableCpusCrihan(0,36) ConsumableMemCrihan(4400,36864)
    ll-joe ConsumableCpusCrihan(0,32) ConsumableMemCrihan(1556,32768)

    Les ConsumableCpusCrihan correspondent à des tickets processeurs sur chacun des noeuds : un ticket = un processeur Power4.
    Les ConsumableCpusCrihan correspondent à des tickets mémoire sur chacun des noeuds : un ticket = un Mo de mémoire

    La commande llsubmit permet de soumettre un job sur le cluster IBM.
    La syntaxe est llsubmit job_script. On obtient alors une référence numéro_job de la forme ll-joe.xxxxx.0.

    La commande llq permet de suivre son exécution.
    On obtient un tableau récapitulatif de tous les jobs présents à ce moment classés par autres décroissant de priorité. Pour chaque job, on connait son numéro_job, le login de son propriéraire, le jour et l'heure de sa soumission, son statut (R = Running, I = Idle soit en attente) et le cas échéant le noeud d'exécution.
    Pour les jobs MPI à cheval, il s'agit du noeud père.

    Id               Owner     Submitted   ST PRI Class       Running On
    ---------------- --------- ----------- -- --- ----------- -----------
    ll-joe.19412.0 < login >   11/1 13:45   R  50 large       ll-joe
    ll-joe.19475.0 < login >   11/4 16:12   R  50 medium      ll-jack
    ll-joe.19448.0 < login >   11/4 09:37   R  50 large       ll-joe
    ll-joe.19455.0 < login >   11/4 11:03   R  50 large       ll-jack
    ll-joe.19510.0 < login >   11/5 15:22   R  50 large       ll-jack
    ll-joe.19456.0 < login >   11/4 11:48   R  50 large       ll-joe
    ll-joe.19536.0 < login >   11/8 10:43   R  50 large       ll-jack
    ll-joe.19509.0 < login >   11/5 15:22   I  50 large
    ll-joe.19515.0 < login >   11/5 17:22   I  50 large
    ll-joe.19530.0 < login >   11/7 12:33   I  50 large
    ll-joe.19537.0 < login >   11/8 10:45   I  50 large

    13 job step(s) in queue, 4 waiting, 0 pending, 9 running, 0 held, 0 preempted

    La commande llcancel permet de supprimer une requête soumise à Loadleveler.
    La syntaxe est llcancel numéro_job.


    flechehaut

    Peut-on avoir accès aux fichiers d'un job durant son exécution en batch ?

    Oui, tout à fait.

    Voici la règle :
    Faites un llq pour savoir sur quel noeud tourne votre job.

    Exemple 1 :
    Votre job est "Running On" ll-joe et son "jobid" est ll-joe.2222.0
    Faites un "cd /local/run/ll-joe.2222.0"
    Tous vos fichiers sont là.

    Exemple 2 :
    Votre job est "Running On" ll-jack et son "jobid" est ll-joe.1111.0
    Faites un "cd /local2/run/ll-joe.1111.0"
    Tous vos fichiers sont là.

    Attention, depuis octobre 2003, les jobs de cri_job_type mpi sont autorisés tourner "à cheval" sur deux noeuds. Par conséquent, les espaces temporaires alloués pour leur exécution se trouvent respectivement dans /dlocal/run/job-id et /dlocal/spool/job-id.
    Tous les autres jobs ne sont pas autorisés à tourner "à cheval" sur deux noeuds.
    Pour les limites des ressources par type de job, suivre ce lien.

    Remarque :
    si vous ne trouvez pas le répertoire portant comme nom le "jobid" de votre job, il se peut qu'il vient de finir et qu'il ait été déplacé dans le spool en attendant le rapatriement vers votre espace permanent /work.


    flechehaut

    Que signifie le code d'erreur lors de la soumission du job ?

    Lors de la soumission des jobs, une erreur fatale peut survenir. Dans ce cas elle renvoie un code qui se trouve dans le tableau ci-dessous :

    Codes d'erreur Signification
    0 tout va bien !
    Erreurs liées à l'environnement
    101 l'exécution a lieu en dehors de l'environnement Loadleveler
    102 utilisateur ou groupe non autorisé
    103 les variables d'environnement Loadleveler sont absentes
    104 les variables d'environnement $HOME_DIR et $WORK_DIR ne désignent pas des répertoires
    105 l'utilisateur n'a pas les droits de lecture et d'écriture sur $HOME_DIR
    106 l'utilisateur n'a pas les droits de lecture et d'écriture sur $WORK_DIR
    Erreurs liées au prologue
    110 on a perdu le système de fichiers /local/run
    111 on a perdu le système de fichiers /local/spool
    112 la copie des fichiers du cri_initialdir vers l'espace temporaire s'est mal passée
    113 il y a une erreur de syntaxe dans le nom du cri_initialdir (pas de ../ et de ;)
    114 la variable cri_initialdir n'est pas renseignée
    115 le cri_initialdir doit être un répertoire
    116 le cri_initialdir n'est pas autorisé en lecture
    117 il y a des liens symboliques dans l'arborescence du cri_initialdir qui ne sont jamais suivis
    118 le répertoire $LOCAL_WORK_DIR ne peut pas être crée
    119 le répertoire $LOCAL_SPOOL_DIR ne peut pas être crée
    120 le cri_initdir est un chemin absolu qui n'est ni dans /home/.., ni dans /work/...
    121 le cri_initdir n'existe pas
    122 le cri_initdir est vide
    Erreurs liées à l'épilogue
    210 crash du job durant l'exécution
    211 une erreur est survenue lors du déplacement des fichiers du cri_spool vers le répertoire $LOCAL_SPOOL_DIR
    212 le répertoire /work/projet/login/SPOOL n'a pu être crée
    213 la création du répertoire cri_finaldir n'a pu se faire
    214 il y a une erreur de syntaxe dans la variable cri_spool (pas de ../ et de ;)
    215 la variable cri_spool doit être un répertoire

    Tous les codes supérieurs à 100 sont des codes CRIHAN.


    flechehaut

    A quoi servent les variables cri_initialdir et cri_finaldir ?

    les calculs sont effectués dans les disques internes du noeud d'exécution et non pas dans les espaces permanents situés sur la baie FastT500 pour avoir les meilleures performances d'I/O : la bande passante de ces disques est nettement supérieure à celle de la fibre optique qui relie les noeuds à la baie.
    Ainsi on envoye au prologue les fichiers nécessaires au job vers le noeud d'exécution et on récupère lors de l'épilogue les fichiers résultats. Le système gère les espaces temporaires alloués dans les disques internes des noeuds pendant le job mais il ne sais pas où se trouvent les fichiers à duppliquer lors du prologue ni où il doit ramener les fichiers de résultats à l'épilogue. Ces deux localisations sont transmises à Loadleveler à l'aide respectivement des deux variables cri_initialdir et cri_finaldir.

    cri_initialdir est

    • soit un chemin absolu dans le $WORK_DIR (/work/projet/login/REP_ENTREE) ;
    • soit un chemin relatif (./CODE/run/test_1) par rapport à l'endroit où est effectuée la soumission.
    cri_finaldir est un chemin absolu dans le $WORK_DIR (/work/projet/login/REP_SORTIE).
    • Si le répertoire REP_SORTIE existe, les fichiers y sont directement placés : attention si un fichier existe déjà dans le répertoire, il est écrasé !!
    • S'il n'existe pas, REP_SORTIE est crée et les fichiers y sont placés.

    En cas d'absence ou d'erreur dans cri_finaldir, un répertoire $WORK_DIR/SPOOL/ll-joe.xxxx.0 est crée et les fichiers recopiés dedans.


    flechehaut

    Quelles sont les limites de ressources des jobs en batch ?

    Seules les limites liées à la taille du cluster ou au type de l'application persistent. Le tableau suivant les reprend :

    Application / cri_job_type Contraintes restantes
    serial  1 processeur   / 32 Go de mémoire
    mpi60 processeurs / 60 Go de mémoire
    les jobs mpi ont la possibilité d'être à cheval sur les deux noeuds
    openmp32 processeurs / 32 Go de mémoire
    gaussian32 processeurs / 32 Go de mémoire
    gamess32 processeurs / 32 Go de mémoire
    jaguar32 processeurs / 32 Go de mémoire

    Remarque :
    Les 4 processeurs et 4 Go de mémoire de la partie interactive ne peuvent jamais être prises par le batch. Loadleveler pondère chaque soumission par rapport aux ressources demandées : temps de présence, nombre de processus, volume mémoire. Un poids est ainsi attribué. Ce poids permet de placer le job dans une des trois classes (nouvellement créees et remplaçant les précédentes) : small, medium, large. Moins le job est lourd plus il est prioritaire. Ensuite, la procédure de back filling tient compte des ressources demandées pour le lancement du job.

    Par exemple, deux jobs demandant 32 processeurs pendant 24 heures ou bien 32 Go de mémoire pendant 24 heures auront le même poids. La formule de calcul du poids est basé sur la part de processeurs et la part de mémoire demandées par le job par rapport aux ressources physiques du cluster.
    La formule de calcul est la suivante :

    Poids = MAX( CPU demandé / CPU total , mémoire demandée / mémoire totale ) * wall_clock limit

    Le poids maximal autorisé actuellement est fixé à l'occupation de l'ensemble du cluster (60 processeurs ou 60 Go de mémoire) pendant 3 journées complètes ou bien un quart du cluster pendant 12 jours, etc ...

    Pour d'autres informations sur la soumission batch, voir la page consacrée à loadleveler.


    flechehaut

    Que signifie (alloc) dans la sortie de llq ?

    Cela signifie qu'il y a une erreur dans l'écriture du script de soumission sur la ligne data_limit.
    En effet, un caractère "espace" s'est glissé entre la quantité de mémoire demandée et son unité. Par exemple :
    # @ data_limit = 1 gb est erronée. Il faut écrire :
    # @ data_limit = 1gb


    flechehaut

    Que se passe-t'il si le wall_clock limit est atteint ?

    Attention : si le wall_clock_limit est atteint, l'espace disque temporaire est immédiatement détruit ainsi que son contenu (i.e. tous vos fichiers).
    Il est donc important de bien évaluer le temps d'éxecution du job, quitte à le majorer dans un premier temps.

    Il n'y a pas moyen de récupérer les fichiers ainsi perdus, ou de modifier la durée du job après le démarrage de delui-ci.


    flechehaut

    Que signifient les temps fournis dans le mail de fin par Loadleveler ?

    Dans le mail final envoyé par Loadleveler, (si demandé par l'utilisateur dans son script), on trouve plusieurs durées temporelles qui peuvent être comprises de la manière suivante :

    Intitulé Valeur fournie Traduction Signification
    Real Time: 0 05:58:36 0 jour 5 heures, 58 mn, 56 sec écoulées temps "physique" , "a la montre"
    Job Step User Time: 1 10:01:49 1 jour 10 heures, 1 mn, 49 sec temps cpu consommé
    Job Step System Time: 0 19:30:09 0 jour 19 heures, 30 mn, 9 sec temps system consommé
    Total Job Step Time: 2 05:31:58 2 jours 5 heures, 31 mn, 58 secondes Job Step User Time + Job Step System Time


    flechehaut

    En cas de problème


    Pensez ticket d'assistance

    Pour tout problème ou question, n'hésitez pas à ouvrir un ticket d'assistance.


    flechehaut


    Powered by Plone CMS, the Open Source Content Management System

    This site conforms to the following standards: