Personal tools
You are here: Home Calcul Technique Documentation IBM cluster p575 (Power5) LoadLeveler
Document Actions

LoadLeveler

Description de la soumission des calculs avec le logiciel LoadLeveler


Introduction

Le mode d'exécution batch consiste à préparer un ensemble de commandes dans un fichier (appelé script) puis à le soumettre à Loadleveler, le gestionnaire de travaux d'IBM.

Cet ensemble de commandes est appelé "job". La soumission d'un job correspond à une requête de la part de l'utilisateur et l'exécution de ce job peut être caractérisée par un ou plusieurs processus.

Les ressources par job, demandées par l'utilisateur, correspondent à :

  • la mémoire par requête et par processus,
  • le temps de présence du job dans la queue (temps de restitution pour la requête),
  • le nombre de processus,
  • l'espace disque temporaire nécessaire à l'exécution (imposé pour le moment).

Lorsqu'un job est soumis à Loadleveler, celui-ci va analyser le script, prendre en compte les ressources demandées par le job et chercher un créneau pour l'exécution. Il utilise le principe du backfilling. C'est pour cette raison qu'il n'y a plus de queues batch avec des limites spécifiques pour chacune d'entre-elles.


flechehaut

Utilisation de Loadleveler

Quatre commandes permettent aux utilisateurs de gérer les soumissions de job sur le cluster IBM.

llstatus

La commande llstatus -R permet de connaitre les ressources disponibles (d'après les ionformations en possession de Loadleveler) :
llstatus -R
MachineConsumable Resource(Available, Total)
-------------------------------------------------------------------------------
p5-a1-n1.crihan.frConsumableCpusCrihan(5,8) ConsumableMemCrihan(8640,10240) ConsumableStackCrihan(1648,2048)
p5-a1-n10.crihan.frConsumableCpusCrihan(0,8) ConsumableMemCrihan(6240,10240) ConsumableStackCrihan(1048,2048)
p5-a1-n11.crihan.frConsumableCpusCrihan(0,8) ConsumableMemCrihan(6640,10240) ConsumableStackCrihan(1148,2048)
p5-a1-n12.crihan.frConsumableCpusCrihan(4,8) ConsumableMemCrihan(3240,10240) ConsumableStackCrihan(1460,2048)
p5-a1-n13.crihan.frConsumableCpusCrihan(2,8) ConsumableMemCrihan(4270,10240) ConsumableStackCrihan(764,2048)
p5-a1-n14.crihan.frConsumableCpusCrihan(0,8) ConsumableMemCrihan(640,10240) ConsumableStackCrihan(148,2048)
p5-a1-n17.crihan.frConsumableCpusCrihan(3,8) ConsumableMemCrihan(1240,10240) ConsumableStackCrihan(48,2048)
p5-a1-n18.crihan.frConsumableCpusCrihan(2,8) ConsumableMemCrihan(1240,10240) ConsumableStackCrihan(548,2048)
p5-a1-n19.crihan.frConsumableCpusCrihan(4,8) ConsumableMemCrihan(8984,10240) ConsumableStackCrihan(1548,2048)
p5-a1-n2.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n20.crihan.frConsumableCpusCrihan(6,8) ConsumableMemCrihan(7240,10240) ConsumableStackCrihan(1548,2048)
p5-a1-n21.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n22.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n23.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n24.crihan.frConsumableCpusCrihan(0,8) ConsumableMemCrihan(7390,10240) ConsumableStackCrihan(1148,2048)
p5-a1-n3.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n4.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n5.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n6.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n7.crihan.frConsumableCpusCrihan(3,8) ConsumableMemCrihan(1240,10240) ConsumableStackCrihan(48,2048)
p5-a1-n8.crihan.frConsumableCpusCrihan(8,8) ConsumableMemCrihan(10240,10240) ConsumableStackCrihan(2048,2048)
p5-a1-n9.crihan.frConsumableCpusCrihan(0,8) ConsumableMemCrihan(6990,10240) ConsumableStackCrihan(1048,2048)

Les ConsumableCpusCrihan correspondent à des tickets processeurs sur chacun des noeuds : un ticket = un processeur Power5.
Les ConsumableMemCrihan correspondent à des tickets mémoire (pour les données) sur chacun des noeuds : un ticket = un Mo de mémoire de LARGE PAGES
Les ConsumableStackCrihan correspondent à des tickets mémoire (pour la stack) sur chacun des noeuds : un ticket = un Mo de mémoire de SMALL PAGES

llsubmit

La commande llsubmit permet de soumettre un travail au calculateur. La syntaxe est llsubmit job_script. On obtient alors une référence numéro_job (de la forme ll-william.xxxxx.0 ou ll-averell.xxxxx.0) qui permet de suivre la soumission ou de détruire le job.

llq

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.

IdOwnerSubmittedSTPRIClassRunning On
-------------------------------------------------------------------------
william-a1.1761.0< login >1/25 08:14R50courtp5-a1-n1
william-a1.1765.0< login >1/25 09:18R50longp5-a1-n24
william-a1.1770.0< login >1/25 09:57R50hps_longp5-a1-n18
william-a1.1793.0< login >1/25 17:12R50courtp5-a1-n11
william-a1.1794.0< login >1/25 17:12R50longp5-a1-n24
william-a1.1870.0< login >1/30 13:22R50hps_courtp5-a1-n2
william-a1.1867.0< login >1/30 11:59R50indusp5-a1-n19
william-a1.1848.0< login >1/30 09:21I50hps_indus
william-a1.1869.0< login >1/30 12:41I50long

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

llcancel

La commande llcancel permet de détruire un job à n'importe quel moment. L'espace temporaire est détruit sans récupération de fichiers résultats. La syntaxe est llcancel numéro_job.
flechehaut

Fonctionnement du batch au CRIHAN

Le batch repose sur l'utilisation de scripts de soumission, des exemples sont proposés.

Ces scripts contiennent l'expression des besoins en ressources diverses pour la bonne exécution des travaux à soumettre. Il s'agit de :
- le nombre de processeurs (applications parallèles) avec le mot clé # @ cri_total_tasks
- la quantité de mémoire PAR processus (au sens AIX, attention aux codes threadés tels OpenMP, Gaussian, ...) avec le mot clé # @ data_limit
- la quantité de stack PAR processus (au sens AIX, attention aux codes threadés tels OpenMP, Gaussian, ...) avec le mot clé # @ stack_limit
- le temps de présence de l'application avec le mot clé # @ wall_clock_limit
- la limite en taille des fichiers core avec le mot clé # @ core_limit

L'UTILISATEUR DOIT SPECIFIER SES BESOINS À L'AIDE DES MOTS CLES PRECEDENTS.

La procédure contient un prologue et un épilogue pour gérer l'espace disque et les transferts des fichiers. En effet, les exécutions des jobs des utilisateurs n'ont pas lieu dans les espaces permanents mais dans un espace temporaire spécialement conçu à cette fin. Cela permet de profiter d'espaces diques plus grands que ceux alloués de manière permanente aux utilisateurs.
L'espace temporaire total est de l'ordre de 8 To.

Les différentes étapes de la procédure sont les suivantes :

  1. Le job est soumis à Loadleveler au travers d'un script par la commande llsubmit.

  2. Le script est alors analysé pour vérifier que les informations nécessaires sont bien présentes. Si ce n'est pas le cas, la soumission est rejetée.

  3. Loadleveler cherche à réserver les ressources demandées. Si elles sont disponibles, le job est alors exécuté. Dans le cas contraire, il est mis en attente et Loadleveler recherche un créneau horaire pour le faire passer. Cela signifie qu'il réserve les ressources demandées pour un moment bien précis. Cette procédure, appelée backfilling, lui permet de boucher les trous entre les gros jobs avec ses petits jobs. Pour pouvoir appliquer cette stratégie, Loadleveler utilise le temps de restitution du job sur le calculateur (paramètre wall_clock_limit).

  4. C'est à ce moment que l'on connait le(s) noeud(s) d'exécution : c'est forcément un noeud p575.

  5. Une fois les ressources disponibles, commence le prologue : la préparation de l'environnement d'exécution. Elle consiste d'une part en la création d'espace de travail temporaire d'autre part au transfert des fichiers spécifiés par l'utilisateur vers cet espace.

  6. Les commandes utilisateurs sont alors exécutées. Seule cette partie est concernée par le wall_clock_limit, i.e. le temps de restitution du job sur la machine. L'exécution a lieu dans les espace temporaire crée dans le prologue.

  7. En fin d'exécution, arrive l'épilogue. A ce moment est renvoyée dans la sortie standard une valeur échantillonnée de la mémoire consommée par processus pour les données globales. Elle donne un ordre de grandeur fiable pour la data_limit à renseigner dans les scripts et permet d'affiner ainsi les besoins en ressources pour des soumissions analogues ultérieures.
    Attention : si le wall_clock_limit est atteint, l'espace disque temporaire est préservé pendant trois semaines (et non plus détruit immédiatement) afin de permettre à l'utilisateur de récupérer ses fichiers).

    Les fichiers spécifiés par l'utilisateur sont alors mis de côté (déplacés et non pas copiés pour être le plus rapide possible) dans un espace spool. Ils sont ensuite transférés vers le répertoire spécifique de l'espace permanent de l'utilisateur. Si un problème survient lors du transfert final (e.g., quota disque de l'espace permanent atteint), l'utilisateur est averti et les fichiers sont préservés quelques jours le temps qu'il fasse le ménage.
    Il faut noter que le but est de ne renvoyer dans l'espace de l'utilisateur que les fichiers réellement souhaités par celui-ci : on pourrait en effet renvoyer tous les fichiers en fin d'exécution, mais dans le cas de certaines applications très gourmandes en espace disque temporaire, cela remplirait l'espace permanent de l'utilisateur et engorgerait le réseau entre les noeuds et la baie de stockage FastT500 sans intérêt pour lui.

Le diagramme suivant reprend la procédure de la gestion des jobs. Voici la signification des variables y figurant :

Variable employée Usage
$LOCAL_WORK_DIRElle représente le répertoire temporaire crée par le système et alloué au job pour son exécution ;
->/dlocal/run/ll-william.xxxx.0 ou ->/dlocal/run/ll-averell.xxxx.0
CRI_INITIALDIRElle représente le répertoire spécifié par l'utilisateur dans son espace permanent sur la baie FastT500 dont le contenu est dupliqué dans l'espace temporaire $LOCAL_WORK_DIR. Ce répertoire est soit dans le /home, soit dans le /work de l'utilisateur, il doit être lisible, non vide et ne doit contenir aucun lien symbolique ;
->/work/projet/login/REPERTOIRE_ENTREE
CRI_FINALDIRElle représente le répertoire spécifié par l'utilisateur dans son espace permanent sur la baie FastT500 dans lequel les fichiers spécifiés par l'utilisateur sont rapatriés par le système. Il doit être dans le/home ou le /work de l'utilisateur avec des droits d'écriture. S'il n'existe pas, le système essaye de le créer ;
->/work/projet/login/REPERTOIRE_SORTIE
$LOCAL_SPOOL_DIRElle représente le répertoire temporaire crée par le système qui sert de transit avant le rapatriement vers l'espace permanent de l'utilisateur situé dans la baie FastT500.
->/dlocal/spool/ll-william.xxxx.0 ou ->/dlocal/run/ll-averell.xxxx.0
$LOCAL_SCRATCH_DIRVariable obsolète

principe de soumission
flechehaut

Codes d'erreur lors de la soumission

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'erreurSignification
0tout va bien !
Erreurs liées à l'environnement
101l'exécution a lieu en dehors de l'environnement Loadleveler
102utilisateur ou groupe non autorisé
103les variables d'environnement Loadleveler sont absentes
104les variables d'environnement $HOME_DIR et $WORK_DIR ne désignent pas des répertoires
105l'utilisateur n'a pas les droits de lecture et d'écriture sur $HOME_DIR
106l'utilisateur n'a pas les droits de lecture et d'écriture sur $WORK_DIR
Erreurs liées au prologue
110on a perdu le système de fichiers /dlocal/run
111on a perdu le système de fichiers /dlocal/spool
112la variable cri_initialdir n'est pas renseignée
113il y a une erreur de syntaxe dans le nom du cri_initialdir (pas de ../ et de ;)
114le répertoire cri_initialdir n'est pas dans /home/... ou /work/...
115le répertoire cri_initialdir n'existe pas
116le cri_initialdir doit être un répertoire
117le cri_initialdir n'est pas autorisé en lecture
118le cri_initialdir est vide
119il y a des liens symboliques dans l'arborescence du cri_initialdir qui ne sont jamais suivis
120la variable cri_finaldir n'est pas renseignée
121il y a une erreur de syntaxe dans le nom du cri_finaldir (pas de ../ et de ;)
122le répertoire cri_finaldir n'est pas dans /home/... ou /work/...
123le répertoire cri_finaldir n'existe pas et n'a pu être crée
124le cri_finaldir doit être un répertoire
125le cri_finaldir n'est pas autorisé en écriture
126la copie des fichiers du cri_initialdir vers le $LOCAL_WORK_DIR s'est mal passée
127le répertoire $LOCAL_WORK_DIR ne peut pas être crée
128le répertoire $LOCAL_SPOOL_DIR ne peut pas être crée
129le répertoire $LOCAL_SCRATCH_DIR ne peut pas être crée
Erreurs liées à l'épilogue
210crash du job durant l'exécution
211le répertoire temporaire $LOCAL_SPOOL_DIR n'existe plus
212$LOCAL_SPOOL_DIR n'est plus un répertoire
213une erreur est survenue lors de la recopie des fichiers du $LOCAL_SPOOL_DIR vers le répertoire cri_finaldir
255autre erreur ; contacter l'assistance technique

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


flechehaut

Gestion des ressources demandées

Expressions des ressources demandées

Le batch repose sur l'utilisation de scripts de soumission.

Ces scripts contiennent l'expression des besoins en ressources diverses pour la bonne exécution des travaux à soumettre. Il s'agit de :
- le nombre de processeurs (applications parallèles) avec le mot clé # @ cri_total_tasks
- la quantité de mémoire PAR processus (au seins AIX, attention aux codes threadés tels OpenMP, Gaussian, ...) avec le mot clé # @ data_limit
- la quantité de stack PAR processus (au seins AIX, attention aux codes threadés tels OpenMP, Gaussian, ...) avec le mot clé # @ stack_limit
- le temps de présence de l'application avec le mot clé # @ wall_clock_limit
- la limite en taille des fichiers core avec le mot clé # @ core_limit

L'UTILISATEUR DOIT SPECIFIER SES BESOINS À L'AIDE DES MOTS CLES PRECEDENTS.

Limitations des ressources demandées

Les applications de cri_job_type mpi sont par défaut autorisées à s'exécuter à cheval sur plusieurs noeuds.

Remarque :
Pour forcer l'exécution d'une application mpi sur un seul noeud, pour un nombre de tâches inférieur ou égal à huit, il faut insérer la ligne suivante dans le script de soumission :

# @ blocking = la même valeur que cri_total_tasks

Cela a pour effet d'imposer le partage de votre application en blocs de processus dont la taille est le nombre total de processus de l'application MPI, soit 1 seul bloc et donc 1 seul noeud. Bien évidemment, les noeuds n'étant qu'octo-processeurs, cela ne fonctionne qu'avec moins de 8 processeurs et moins de 10 Go de mémoire pour les données.

Les limites ne sont pas liées uniquement au type de l'application et la taille du cluster : pour les travaux MPI, les nombre de processeurs et la mémoire accessibles dépendant de la durée demandée (wall_clock_limit).

  • Les 6 noeuds de calcul non switchés reçoivent des travaux de type serial, openmp, mpi (4 tâches), gaussian, gamess, jaguar, de classe "court" (durée inférieure ou égale à 48 H), "long" (durée inférieure ou égale à 100 H) ou "tlong" (durée inférieure ou égale 300 H).
  • Sur les 16 noeuds de calcul switchés (interconnectés par le réseau haute performance Federation) :
    • les jobs de tous types d'une durée supérieure à 48 H (16 tâches MPI au maximum), de classe "long" ou "hps_long", accèdent à 4 noeuds,
    • les jobs de tous types d'une durée inférieure ou égale à 48 H (64 tâches MPI au maximum), de classe "court" ou hps_court", accèdent à la totalité des 16 noeuds.


La durée maximale d'un job est de 300 H.


Le tableau suivant résume les limitations de ressources :

              Application / cri_job_type
              Contraintes
              serial
              1 processeur / 10 Go de mémoire data
                                           2 Go de mémoire stack
              openmp
              8 processeurs / 10 Go de mémoire data
                                           2 Go de mémoire stack
              gaussian
              8 processeurs / 10 Go de mémoire data
                                             2 Go de mémoire stack
              gamess (version 2003)
              8 processeurs / 10 Go de mémoire data
                                             2 Go de mémoire stack
              jaguar
              8 processeurs / 10 Go de mémoire data
                                             2 Go de mémoire stack
              mpi
              Si wall_clock_limit inférieur ou égal à 48 H :
              64 processeurs / 80 Go de mémoire data
                                                 16 Go de mémoire stack

              Si wall_clock_limit supérieur à 48 H,
              inférieur ou égal à 100 H :

              16 processeurs / 20 Go de mémoire data
                                               4 Go de mémoire stack

              Si wall_clock_limit supérieur à 100 H,
              inférieur ou égal à 300 H :

                4 processeurs / 10 Go de mémoire data
                                               2 Go de mémoire stack


flechehaut

Estimation des ressources mémoire et utilisation des processeurs

L'épilogue des travaux fournit des informations aux utilisateurs concernant la consommation mémoire et l'utilisation des processeurs.

La consommation mémoire maximale (max_rss) des données du programme (le "heap" ou "tas") est déterminé par LoadLeveler durant l'exécution en échantillonnant. Cela donne une idée assez précise du besoin maximal de l'application.
La valeur est comparée à la quantité de mémoire par processus transmise à LoadLeveler avec la data_limit. Si la proportion est inférieure à 80%, cela signifie que la demande mémoire est surdimensionnée de manière trop importante. Dans le cas d'une soumission ultérieure d'un travail analogue, il faut revoir à la baisse la quantité de mémoire requise. Ainsi le travail demandant moins de ressources peut être un peu plus facilement exécuté et les ressources réservées sont mieux utilisées.

Exemple de retour :
==========================================================================
ESTIMATION DE LA CONSOMMATION MEMOIRE DE VOTRE JOB
Utilisateur : gm
Projet : crihan
Script : /home/crihan/gm/.../omp_script.cmd
Maximum de memoire consommee : 5245012 ko
Memoire demandee a la soumission : 5632000 ko
Pourcentage utilise : 93 %
Quotient > 80 % : OK
==========================================================================
ou alors en situation de trop grand surdimensionnement :
==========================================================================
ESTIMATION DE LA CONSOMMATION MEMOIRE DE VOTRE JOB
Utilisateur : gm
Projet : crihan
Script : /home/crihan/gm/.../run/ll_mpi
Maximum de memoire consommee : 264068 ko
Memoire demandee a la soumission : 593920 ko
Pourcentage utilise : 44 %
Quotient < 80 % : probleme, vous demandez beaucoup trop de memoire
==========================================================================

L'occupation des processeurs permet de s'assurer que les processeurs demandés sont réellement occupés. Cela ne donne pas pour autant une estimation de la scalabilité ou de l'efficacité de l'application parallèle.
L'occupation des processeurs n'est effectuée que dans le cas de programmes parallèles et une durée d'exécution supérieure à 10 minutes. Exemple de sortie :
==========================================================================
ESTIMATION DE L'UTILISATION DES PROCESSEURS PAR VOTRE JOB
Utilisateur : gm
Projet : crihan
Script : /home/crihan/gm/.../run/ll_mpi
dispatchtime : 2007 Jan 23 15 01
currenttime : 2007 Jan 23 15 15
cputime : 24
nbprocs : 2
Utilisation : 85.714286 %
Utilisation > 80 % : OK
==========================================================================


flechehaut

Scripts de soumission

Les scripts de soumissions comportent plusieurs types d'informations :
  1. l'expression des besoins des jobs : la mémoire par processus (pour les données ET pour la stack), le temps de présence du job dans la queue (temps de restitution pour la requête), le nombre de processus.

  2. des informations relatives aux fichiers transférés et aux espaces permanents correspondants.

  3. des informations sur l'environnement de l'utilisateur (variables, mails, ...).

  4. les commandes utilisateurs proprement dites.

Les trois premiers points reposent sur des directives, des mots-clés et exigent une syntaxe particulière. Le quatrième demande une syntaxe analogue aux commandes shell.

Plusieurs paramètres sont essentiels lors de la soumissions : le type de job, le nombre de processeurs demandés, le besoin en mémoire, etc ...
La liste des types de job est exhaustive et peut être complétée selon les besoins des utilisateurs. Elle comprend les types suivants : serial, mpi, openmp, gaussian, jaguar, gamess.

Les rubriques suivantes décrivent des exemples de scripts pour les différents types de jobs. Cette liste est exhaustive et sera complétée selon les besoins des utilisateurs.

---------------------------- flechehaut

Script job séquentiel


#!/bin/csh
# Script de soumission Loadleveler, job sequentiel
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = sequentiel
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = serial
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 1:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale par processus (mb, gb, mw, gw, ..)
# @ data_limit = 256mb
obligatoireattention à l'option -bmaxdata du compilateur (rubrique édition des liens)
# Stack maximale par processus (mb, gb, mw, gw, ..)
# @ stack_limit = 100mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal par processus (mb, gb, mw, gw, ..)
# @ core_limit = 500mb
optionnelValeur mise à zéro par défaut
# Repertoire initial a envoyer
# @ cri_initialdir = /work/projet/login/IN_SEQ
obligatoirerépertoire copié par le système dans l'espace temporaire au début du job
# Repertoire final pour les resultats
# @ cri_finaldir = /work/projet/login/OUT_SEQ
obligatoirerépertoire où sont placés les fichiers récupérés par le système, à la demande de l'utilisateur, à la fin du job
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = login@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


cd $LOCAL_WORK_DIRobligatoiredéplacement dans l'espace temporaire
gunzip in.dat.gz
./a_seq_pwr5.out < in.dat > $LOCAL_SPOOL_DIR/out.dat
gzip resultat.dat

les commandes du job
mv out.dat resultat.dat.gz $LOCAL_SPOOL_DIRobligatoiredéplacement (et non pas copie !!) des fichiers à récupérer dans le répertoire de spool adéquat

Ce lien permet de récupérer le script pour un job séquentiel.

---------------------------- flechehaut

Script job parallèle MPI


#!/bin/csh
# Script de soumission Loadleveler, job MPI
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = MPI
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = mpi
# Nombre de processus MPI
# @ cri_total_tasks = 4
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 1:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale par processus (mb, gb, mw, gw, ..)
# @ data_limit = 550mb
obligatoireattention à l'option -bmaxdata du compilateur (rubrique édition des liens)
# Stack maximale par processus (mb, gb, mw, gw, ..)
# @ stack_limit = 100mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal par processus (mb, gb, mw, gw, ..)
# @ core_limit = 500mb
optionnelValeur mise à zéro par défaut
# Repertoire initial a envoyer
# @ cri_initialdir = /work/projet/login/IN_MPI
obligatoirerépertoire copié par le système dans l'espace temporaire au début du job
# Repertoire final pour les resultats
# @ cri_finaldir = /work/projet/login/OUT_MPI
obligatoirerépertoire où sont placés les fichiers récupérés par le système, à la demande de l'utilisateur, à la fin du job
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = login@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


cd $LOCAL_WORK_DIRobligatoiredéplacement dans l'espace temporaire
gunzip in.dat.gz
./a_mpi_pwr5.out < in.dat > $LOCAL_SPOOL_DIR/out.dat
gzip resultat.dat

les commandes du job
mv out.dat resultat.dat.gz $LOCAL_SPOOL_DIRobligatoiredéplacement (et non pas copie !!) des fichiers à récupérer dans le répertoire de spool adéquat

N.B. :
Les bonnes variables d'environnement de tuning MPI sont mises en place par Loadleveler.

Ce lien permet de récupérer le script pour un job parallèle MPI.

---------------------------- flechehaut

Script job parallèle OpenMP

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.

#!/bin/csh
# Script de soumission Loadleveler, job OpenMP
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = openmp
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = openmp
# Nombre de threads openmp
# @ cri_total_tasks = 4
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 1:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale POUR L'APPLICATION (mb, gb, mw, gw, ..)
# @ data_limit = 1024mb
obligatoireattention à l'option -bmaxdata du compilateur (rubrique édition des liens)
# Stack maximale POUR L'APPLICATION (mb, gb, mw, gw, ..)
# @ stack_limit = 256mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal POUR L'APPLICATION (mb, gb, mw, gw, ..)
# @ core_limit = 500mb
optionnelValeur mise à zéro par défaut
# Repertoire initial a envoyer
# @ cri_initialdir = /work/projet/login/IN_OMP
obligatoirerépertoire copié par le système dans l'espace temporaire au début du job
# Repertoire final pour les resultats
# @ cri_finaldir = /work/projet/login/OUT_OMP
obligatoirerépertoire où sont placés les fichiers récupérés par le système, à la demande de l'utilisateur, à la fin du job
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = login@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


cd $LOCAL_WORK_DIRobligatoiredéplacement dans l'espace temporaire
gunzip in.dat.gz
./a_omp_pwr5.out < in.dat > $LOCAL_SPOOL_DIR/out.dat
gzip resultat.dat

les commandes du job
mv out.dat resultat.dat.gz $LOCAL_SPOOL_DIRobligatoiredéplacement (et non pas copie !!) des fichiers à récupérer dans le répertoire de spool adéquat

N.B. :
Les bonnes variables d'environnement de tuning OpenMP sont mises en place par Loadleveler.

Ce lien permet de récupérer le script pour un job parallèle OpenMP.

---------------------------- flechehaut

Script job parallèle Gaussian

Le descriptif ci-dessous fait référence à la version G03 c02 du code Gaussian. A la fin de cette rubrique vous pouvez aussi récupérer des scripts pour Gaussian G98.
#!/bin/csh
# Script de soumission Loadleveler, job Gaussian
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = gaussian
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = gaussian
# Nombre de threads gaussian
# @ cri_total_tasks = 4
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 1:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale POUR L'APPLICATION (mb, gb, mw, gw, ..)
# @ data_limit = 1500mb
obligatoire
# Stack maximale POUR L'APPLICATION (mb, gb, mw, gw, ..)
# @ stack_limit = 256mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal POUR L'APPLICATION (mb, gb, mw, gw, ..)
# @ core_limit = 100mb
optionnelValeur mise à zéro par défaut
# Repertoire initial a envoyer
# @ cri_initialdir = /work/projet/login/IN_GAUSSIAN
obligatoirerépertoire copié par le système dans l'espace temporaire au début du job
# Repertoire final pour les resultats
# @ cri_finaldir = /work/projet/login/OUT_GAUSSIAN
obligatoirerépertoire où sont placés les fichiers récupérés par le système, à la demande de l'utilisateur, à la fin du job
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = login@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


cd $LOCAL_WORK_DIRobligatoiredéplacement dans l'espace temporaire
set path=($path . /soft/g03c02)
setenv g03root /soft
setenv GAUSS_SCRDIR $LOCAL_WORK_DIR
setenv GAUSS_EXEDIR /soft/g03c02
setenv LD_LIBRARY64_PATH /soft/g03c02
obligatoirel'environnement d'exécution Gaussian
g03 < molecule.com > $LOCAL_SPOOL_DIR/molecule.log
gzip molecule.log molecule.chk
Compilation crihanles commandes du job
mv molecule.chk $LOCAL_SPOOL_DIRobligatoiredéplacement (et non pas copie !!) des fichiers à récupérer dans le répertoirede spool adéquat

Ce lien permet de récupérer le script pour un job Gaussian G03 en C-shell.
Ce lien permet de récupérer le script pour un job Gaussian G03 en Korn-shell.
Ce lien permet de récupérer le script pour un job Gaussian G98 en C-shell.
Ce lien permet de récupérer le script pour un job Gaussian G98 en Korn-shell.

---------------------------- flechehaut

Script job parallèle Jaguar

Le descriptif ci-dessous fait référence à la version 6.5 du code Jaguar. A la fin de cette rubrique vous pouvez aussi récupérer des scripts pour les versions 6.0, 5.1 et 4.0 .
#!/bin/csh
# Script de soumission Loadleveler, job Jaguar
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = jaguar
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = jaguar
# Nombre de processus Jaguar
# @ cri_total_tasks = 4
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 1:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale par processus (mb, gb, mw, gw, ..)
# @ data_limit = 600mb
obligatoire
# Stack maximale par processus (mb, gb, mw, gw, ..)
# @ stack_limit = 100mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal par processus (mb, gb, mw, gw, ..)
# @ core_limit = 500mb
optionnelValeur mise à zéro par défaut
# Repertoire initial a envoyer
# @ cri_initialdir = /work/projet/login/IN_JAGUAR
obligatoirerépertoire copié par le système dans l'espace temporaire au début du job
# Repertoire final pour les resultats
# @ cri_finaldir = /work/projet/login/OUT_JAGUAR
obligatoirerépertoire où sont placés les fichiers récupérés par le système, à la demande de l'utilisateur, à la fin du job
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = login@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


cd $LOCAL_WORK_DIRobligatoiredéplacement dans l'espace temporaire
setenv JAGUAR_HOME /soft/jaguar6.5
setenv SCHRODINGER /soft/jaguar6.5
set path=($path /soft/jaguar6.5)
$JAGUAR_HOME/make.hosts
obligatoirel'environnement d'exécution Jaguar
Constitution du fichier schrodinger.hosts
jaguar run -w -p 4 data.in
gzip job.log data.out
Compilation crihanles commandes du job
mv job.log.gz data.out.gz $LOCAL_SPOOL_DIRobligatoiredéplacement (et non pas copie !!) des fichiers à récupérer dans le répertoire de spool adéquat

Ce lien permet de récupérer le script pour un job Jaguar version 7.0 en C-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 7.0 en Korn-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 6.5 en C-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 6.5 en Korn-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 6.0 en C-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 6.0 en Korn-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 5.1 en C-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 5.1 en Korn-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 4.0 en C-shell.
Ce lien permet de récupérer le script pour un job Jaguar version 4.0 en Korn-shell.

---------------------------- flechehaut

Script job parallèle Gamess 2003

#!/bin/csh
# Script de soumission Loadleveler, job Gamess 2003
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = mpi
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = gamess
# Nombre de threads Gamess
# @ cri_total_tasks = 4
obligatoire# IMPORTANT :
# Gamess 2003 lance 2 processus par processeur donc positionnez le
# nombre de processeurs à la moitié du nombre de processus ($(cri_total_tasks)/2)
# Ici 4 processus donc exécution sur 2 processeurs
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 1:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale par processus (mb, gb, mw, gw, ..)
# @ data_limit = 800mb
obligatoire
# Stack maximale par processus (mb, gb, mw, gw, ..)
# @ stack_limit = 100mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal par processus (mb, gb, mw, gw, ..)
# @ core_limit = 100mb
optionnelValeur mise à zéro par défaut
# Repertoire initial a envoyer
# @ cri_initialdir = /work/projet/login/IN_Gamess
obligatoirerépertoire copié par le système dans l'espace temporaire au début du job
# Repertoire final pour les resultats
# @ cri_finaldir = /work/projet/login/OUT_Gamess
obligatoirerépertoire où sont placés les fichiers récupérés par le système, à la demande de l'utilisateur, à la fin du job
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = login@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


cd $LOCAL_WORK_DIRobligatoiredéplacement dans l'espace temporaire
setenv NBPROC 2
setenv SCR $LOCAL_WORK_DIR/.gamess.scr
obligatoirel'environnement d'exécution Gamess 2003
Exécution du script "crihan" gamess avec 4 processus sur 2 processeurs
gamess exam33 2 > $LOCAL_SPOOL_DIR/Gamess.out
gzip *.dat *.out
Compilation crihanles commandes du job
mv *.gz $LOCAL_SPOOL_DIRobligatoiredéplacement (et non pas copie !!) des fichiers à récupérer dans le répertoire de spool adéquat

Ce lien permet de récupérer le script pour un job Gamess version 2003 en C-shell.
Ce lien permet de récupérer le script pour un job Gamess version 2003 en Korn-shell.

# IMPORTANT :
# Gamess 2003 lance 2 processus par processeur donc positionnez le
# nombre de processeurs à la moitié du nombre de processus ($(cri_total_tasks)/2)
# Ici 4 processus donc exécution sur 2 processeurs

---------------------------- flechehaut

Script job parallèle Gamess 2009


La version 2009 de Gamess offre davantage fonctionnalités que celle de 2003 ( http://www.msg.ameslab.gov/gamess/index.html ).

Les limites de ressources pour un job Gamess 2009 sont celles d'un job parallèle MPI ; le nombre maximal de processus est donc fixé à 64.
Pour obtenir un bon compromis entre les temps d'attente et d'exécution d'un job, il est conseillé de ne pas dépasser 16 processus (voir Gestion des ressources demandées ).

Ce lien permet de récupérer le script pour un job Gamess version 2009 en C-shell.


Script de calcul en 2 étapes avec reprise automatique

flechehaut

L'exemple suivant s'applique à un calcul MPI 16 tâches de 96 H, réalisé en deux étapes de 48 H avec reprise automatique à la fin de la première étape.
ll est directement transposable aux autres types de job (serial, openmp, etc.) : remplacer le mot clé "mpi" du paramètre "# @ cri_job_type" et enlever "#@ cri_total_tasks" dans le cas serial.

Dans le script de la première étape, on ne se place pas dans le scratch (/dlocal/run) mais dans dans le "cri_initialdir" qui sert ici de répertoire de travail.
Le "cri_initialdir" ne doit contenir que le minimum : les données d'entrée de la première étape du calcul ainsi que le script de soumission de la deuxième étape (appelé ici "ll_mpi_job2"), lancé par la commande llsubmit à la fin du script de la première étape.

#!/usr/local/bin/bash
# Script de soumission Loadleveler, job MPI
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = reprise_mpi
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = mpi
# Nombre de processus MPI
# @ cri_total_tasks = 16
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 48:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale par processus (mb, gb, mw, gw, ..)
# @ data_limit =1000mb
obligatoire

attention à l'option -bmaxdata du compilateur dans le cas 32 bits

(rubrique édition des liens)

# Stack maximale par processus (mb, gb, mw, gw, ..)
# @ stack_limit = 256mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal par processus (mb, gb, mw, gw, ..)
# @ core_limit = 500mb
optionnelValeur mise à zéro par défaut
# @ cri_initialdir = /work/crihan/pbousq01/TEST_MPI/Input_1obligatoire

répertoire de travail qui ne doit contenir que le minimum :

input et script de lancement de la 2e étape

# @ cri_finaldir = /work/crihan/pbousq01/TEST_MPI/Input_1
obligatoirene sert pas dans ce cas, mais le filtre le requiert
# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = pbm@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###
#### Le script du 2e job doit etre place dans le "cri_initialdir"


OUT_JOB1=/home/crihan/pbousq01/TEST_MPI/Output_1
# Resultats du 1er job
mkdir -p $OUT_JOB1
obligatoireRépertoire de résultats du 1er job
# On choisit le "cri_initialdir" comme repertoire de travail
cd $CRI_INITDIR
obligatoireRépertoire de travail
./a_mpi_pwr5.out < in.dat > job1.log
gzip resultat.dat

les commandes du job
# On sauvegarde les resultats du 1er job
cp result.dat.gz job1.log $OUT_JOB1
obligatoire

# Les fichiers de reprise doivent être dans le repertoire de travail.
# Le script du 2e job aussi
# On soumet le 2e job
llsubmit ll_mpi_job2

# La sauvegarde des resultats du 2e job est faite dans son script

obligatoire


Ce lien permet de récupérer le script précédent (1e étape d'un calcul en deux parties avec reprise)

Le script ll_mpi_job2, lancé à la fin du script précédent, est le suivant.

Le répertoire "cri_initialdir" est le même que dans le script de la première étape.

#!/usr/local/bin/bash
# Script de soumission Loadleveler, job MPI
# CRIHAN v 3.00
obligatoiretype de shell au choix de l'utilisateur
# Nom du job
# @ job_name = reprise_mpi
optionnel
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
obligatoire
# Type du job
# @ cri_job_type = mpi
# Nombre de processus MPI
# @ cri_total_tasks = 16
obligatoire
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 48:00:00
obligatoirepour utiliser le backfilling
# Memoire maximale par processus (mb, gb, mw, gw, ..)
# @ data_limit = 1000mb
obligatoire

attention à l'option -bmaxdata du compilateur dans le cas 32 bits

(rubrique édition des liens)

# Stack maximale par processus (mb, gb, mw, gw, ..)
# @ stack_limit = 256mb
optionnelValeur mise à 256mb par défaut
# Fichier core maximal par processus (mb, gb, mw, gw, ...)
# @ core_limit = 500mb
optionnelValeur mise à zéro par défaut

# Même cri_intialdir que dans la 1e étape

# Repertoire initial a envoyer
# @ cri_initialdir=/work/crihan/pbousq01/TEST_MPI/Input_1

obligatoire

répertoire copié par le système dans l'espace temporaire

au début du job.

# Repertoire final pour les resultats
# @ cri_finaldir=/work/crihan/pbousq01/TEST_MPI/Output
obligatoire

répertoire où sont placés les fichiers récupérés par le système

à la fin du job

# Politique d'envoi des mels
# @ notification = complete
# Adresse d'envoi des mels
# @ notify_user = pbm@crihan.fr
optionnelenvoi d'un mel à l'utilisateur à la fin du job
#
# @ queue
obligatoireconclut les directives du job
###
### Commandes utilisateur
###


#
# On se positionne dans le repertoire temporaire
#
cd $LOCAL_WORK_DIR
obligatoire
déplacement dans l'espace temporaire



/a_mpi_pwr5.out < in.dat > job2.log
gzip resultat.dat
obligatoireles commandes du job
# On deplace les fichiers resultats dans le repertoire
# temporaire de rappatriement : $LOCAL_SPOOL_DIR
#
mv result.dat.gz job2.log $LOCAL_SPOOL_DIR
obligatoire




Ce lien permet de récupérer le script précédent (deuxième étape d'un calcul en deux parties avec reprise)


Script de soumissions de jobs en cascade

flechehaut

L'exemple suivant s'applique à un calcul MPI 16 tâches réalisé en plusieurs étapes de 48 H chacune. Le nombre d'étapes est paramétré.
La reprise automatique se fait à l'aide de la commande llsubmit à la fin du script qui sexécute lui-même de manière récursive.
Cet exemple est directement transposable aux autres types de job (serial, openmp, etc.) : remplacer le mot clé "mpi" du paramètre "# @ cri_job_type" et enlever "#@ cri_total_tasks" dans le cas serial.

Le script doit être lancé depuis le "cri_initialdir" qui sera le répertoire de travail dans lequel la séquence de jobs s'exécutera. Les données d'entrée du premier job doivent s'y trouver. Ne pas y placer de fichiers inutiles. Il est conseillé de changer de répertoire "cri_initialdir" pour chaque séquence de jobs.

L'indice du job (itération) est placé dans un fichier step.dat créé par le script.
Si on ne modifie pas la variable RESTART, le nombre de jobs executés sera egal a MAXJOBS.
En cours d'exécution, pour stopper l'enchaînement des jobs,il suffit d'éditer le script pour y mettre "RESTART=NO" a la place de "RESTART=YES" puis de le sauvegarder : le calcul en cours se terminera et ne lancera pas d'autre job. Dans ce cas, ne pas oublier de réinitialiser RESTART à la valeur YES si on lance le même script pour une nouvelle séquence.

===============================================================================
#!/bin/sh
# Script de soumission Loadleveler, job MPI
# CRIHAN v 3.00 - janvier 2006
# crihan-sci@crihan.fr
#
# Nom du job
# @ job_name = resub
#
# Nom du fichier de sortie standard
# @ output = $(job_name).o$(jobid)
#
# Nom du fichier d'erreur standard
# @ error = $(job_name).e$(jobid)
#
# Type du job
# @ cri_job_type = mpi
#
# Nombre de processus MPI
# @ cri_total_tasks = 16
#
# temps de restitution (heures[:minutes[:secondes]])
# @ wall_clock_limit = 48:00:00
#
# Memoire maximale par processus (mb, gb, mw, gw,..)
# @ data_limit = 1000mb
#
# Stack maximale par processus (mb)
# @ stack_limit = 256mb
#
# Repertoire de travail
# @ cri_initialdir = /work/crihan/pbousq01/jobs_mpi_280708
# @ cri_finaldir = /work/crihan/pbousq01/jobs_mpi_280708
#
# Politique d'envoi des mels
# @ notification = complete
#
# Adresse d'envoi des mels
# @ notify_user = pbm@crihan.fr
#
# Obligatoire
# @ queue

###
### Commandes utilisateur
###

# On lance ce script depuis le "cri_initialdir"
# qui sera le repertoire de travail dans lequel
# la sequence de jobs s'executera.
# L'input du premier job doit s'y trouver.
# Ne pas y placer de fichiers inutiles.
# Il est conseille de changer de repertoire
# "cri_initialdir" d'une sequence de jobs a une autre.

cd $CRI_INITDIR

# L'indice du job (iteration) est place dans un fichier step.dat
# cree par le script.
# Si on ne modifie pas la variable RESTART, le nombre de jobs executes
# sera egal a MAXJOBS.
# En cours d'execution, pour stopper l'enchainement des jobs,
# il suffit d'editer le script pour y mettre
# "RESTART=NO" a la place de "RESTART=YES"
# puis de le sauvegarder : le calcul en cours se terminera
# et ne lancera pas d'autre job.
# Dans ce cas, ne pas oublier de reinitialiser RESTART a la valeur YES
# si on lance le meme script pour une nouvelle sequence.

if ! test -f step.dat; then echo 1 > step.dat; fi
isub0=`cat step.dat`
echo Run $isub0

###############################
RESTART=YES

# Nom de ce fichier
SCRIPT=ll_mpi_recursive

# Nombre maximal de jobs
MAXJOBS=4

# Execution du calcul
./a.out < input_reprise.dat > a.log

# Repertoire de sauvegarde du calcul
OUTPUT=RESULT
mkdir -p $OUTPUT.$isub0
mv a.log $OUTPUT.$isub0 # Rangement de ce qui ne sert pas pour le job suivant
cp input_reprise.dat $OUTPUT.$isub0 # Copie du ou des fichier(s) de reprise
################################

# On incremente l'indice du run
isub=`expr $isub0 + 1`
echo $isub > step.dat

# On lance le run suivant
if test $isub -le $MAXJOBS && test `grep ^RESTART $SCRIPT | sed 's/.*=//'` = YES
then
         llsubmit $SCRIPT
else
         echo DONE
         mv step.dat step.dat_old
fi
===============================================================================

Ce lien permet de récupérer le script précédent.

Powered by Plone CMS, the Open Source Content Management System

This site conforms to the following standards: