Vous êtes ici : Support technique → Calcul scalaire → Exécution/contrôle d'un code en batch → Code mixte MPI+threads (OpenMP ou pthreads).
Les travaux sont gerés sur l'ensemble des noeuds par le logiciel LoadLeveler. Ils sont répartis après leur soumission dans des "classes". Vous pouvez consulter ici la structure des classes sur Vargas.
Pour soumettre un travail mixte MPI/threads (OpenMP ou pthreads) en batch, il faut :Créer un script de soumission.
Voici un exemple, enregistré
dans le fichier mixte.ll, qui définit un travail
d'1h30mn Elapsed maximum, dont l'exécution se
déroulera sur 8 processus MPI nécessitant chacun
au plus 1.7 Go de mémoire (1.2Go de DATA demandee + 0.5Go de STACK par defaut)
et demandant chacun 4 tâches OpenMP ou pthreads :
vargas : cat mixte.ll
# Nom arbitraire du travail LoadLeveler
# @ job_name = Mixte
# Fichier de sortie standard du travail
# @ output = $(job_name).$(jobid)
# Fichier de sortie d'erreur du travail
# @ error = $(job_name).$(jobid)
# Type de travail
# @ job_type = parallel
# Nombre de processus MPI demandes
# @ total_tasks = 8
# Nombre de tâches OpenMP/pthreads par processus MPI
# @ parallel_threads = 4
# Temps du job hh:mm:ss (1h30mn ici)
# @ wall_clock_limit = 1:30:00
# Memoire max. utilisee par processus (ici 1,2 Gigaoctets)
# @ data_limit = 1.2Gb
# 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/a.out .
# La memoire STACK max. (defaut 4Mo) utilisee (ici 64 Mo) par
# les variables privees de chaque thread.
export XLSMPOPTS=$XLSMPOPTS:stack=65536000
# Execution du programme parallèle mixte
./a.out
vargas : llsubmit mixte.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 Mixte.numero_job sera également créé dans le répertoire de soumission; l'éditer ou le modifier pendant le déroulement du travail peut bloquer celui-ci.
le mot-clef parallel_threads indique au gestionnaire de travaux
le nombre threads par processus MPI souhaité.
ATTENTION : le nombre total_tasks de processus MPI à indiquer est tel
que le nombre total de de cœurs total_tasks*parallel_threads
soit inférieur ou égal à 1024 .
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 defaut à 0.5 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 réservant
nb_mpi tâches MPI et nb_omp tâches OpenMP, la limite
mémoire à spécifier correspond à la quantité
maximale de mémoire partagée par les nb_omp tâches
associées à chaque processus MPI.
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 LoadLeveler au début de l'exécution du travail.
si votre travail a des étapes séquentielles relativement longues (pré ou post-traitement, transferts ou archivages de gros fichiers,...), l'utilisation de travaux multisteps peut se justifier.