Vous êtes ici : Support technique → Calcul scalaire → Exécution/contrôle d'un code en batch → code multitâche (OpenMP ou Pthreads).
Les travaux sont gerés sur l'ensemble des noeuds par le logiciel LoadLeveler; ils sont répartis après soumission dans des "classes". Vous pouvez consulter ici les limites des classes sur Vargas.
Pour soumettre un travail multitâche en batch, il faut :Créer un script de soumission. Voici un exemple, enregistré dans le fichier openmp.ll, qui consiste à exécuter un travail nécessitant au maximum 5 Go de mémoire globale, 1h30mn de temps Elapsed et demandant 4 tâches OpenMP :
> vargas : more openmp.ll # Nom arbitraire du travail LoadLeveler # @ job_name = OpenMP # Fichier de sortie standard du travail # @ output = $(job_name).$(jobid) # Fichier de sortie d'erreur du travail # @ error = $(job_name).$(jobid) # Type de travail # @ job_type = serial # Nombre de threads demandes (ici 4) # @ parallel_threads = 4 # Temps Elapsed max. en hh:mm:ss (ici 1h30mn) # @ wall_clock_limit = 1:30:00 # Memoire max. en data (ici 5 Gigaoctets pour l'ensemble des threads) # @ data_limit = 5Gb # Memoire max. en stack (ici 1 Gigaoctet pour l'ensemble des threads) # @ stack_limit = 1Gb,1Gb # pour recevoir un mail en cas de depassement du temps Elapsed (ou autre pb.) # @ notification = error # @ queue # Pour avoir l'echo des commandes set -x # Repertoire temporaire de travail cd $TMPDIR # La variable LOADL_STEP_INITDIR est automatiquement positionnee par # LoadLeveler au repertoire dans lequel on tape la commande llsubmit cp $LOADL_STEP_INITDIR/source.f . # Compilation et edition de liens d'un programme OpenMP au format libre xlf90_r -qsmp=omp source.f # La memoire STACK max. utilisee (ici 64 Mo) par les variables privees # de chaque thread : ATTENTION, defaut = 4Mo export XLSMPOPTS=$XLSMPOPTS:stack=65536000 # Execution ./a.out
vargas : llsubmit openmp.ll
dans cet exemple, on suppose que l'exécutable a.out se situe dans le répertoire de soumission, c'est-à-dire le répertoire dans lequel on entre la commande llsubmit (la variable LOADL_STEP_INITDIR est automatiquement valorisée par LoadLeveler).
le fichier de sortie du calcul OpenMP.numero_job se trouve également dans le répertoire de soumission, il est créé dès le début de l'exécution du travail; l'éditer ou le modifier pendant le déroulement du travail peut perturber celui-ci.
le mot-clef parallel_threads remplace l'ancien paramètre resources=ConsumableCpus(n) pour indiquer au gestionnaire de travaux le nombre cœurs sur lesquels vont s'exécuter les threads (un thread par cœur). La dénomination "parallel_threads" prend toute sa signification dans l'exécution de programmes mixtes MPI et OpenMP/Pthreads pour lesquels il faut indiquer à la fois le nombre de processus MPI et le nombre de threads par processus MPI.
Mémoire (stack + data) :
La valeur minimum est de 0.2 Go; si vous ne positionnez qu'une seule
des deux limites, l'autre sera automatiquement positionnée
par défaut à 1 Go par cœur.
ATTENTION : quand vous modifiez une valeur de mémoire,
cette valeur est specifiée PAR PROCESSUS. Ainsi, dans le cas
d'un job OpenMP ou Pthreads, il n'y a qu'un seul processus, aussi vous
faut-il spécifier une limite mémoire globale
pour l'ensemble des threads.
les variables privées OpenMP sont stockées dans des zones dites STACK associées à chaque thread. Chacune d'elle est limitée par défaut à 4Mo. Pour dépasser cette limite et par exemple aller jusqu'à 64Mo par thread, il faut utiliser la variable d'environnement XLSMPOPTS en la concaténant avec "stack=65536000".
le mot-clef # @ environment permet de définir des variables d'environnement au niveau LoadLeveler ; ne pas l'utiliser pour certaines variables spécifiques d'OpenMP ou du multi-threading (comme OMP_NUM_THREADS) car elles sont définies automatiquement et valorisées par l'IDRIS au début de l'exécution du travail.