Turing : exécution d'un code parallèle hybride MPI/OpenMP en batch

La Blue Gene/Q supporte les applications hybrides MPI/OpenMP et MPI/pthreads. Le choix du nombre de processus maximum par nœud de calcul fixe également le nombre maximum de threads par processus MPI.

Voici un exemple de soumission d'un job pour exécuter un code sur 1024 cœurs avec 512 processus MPI et 4 threads OpenMP par processus MPI, soit un total de 2048 threads avec 2 threads par cœur physique de la machine et 8 processus MPI par nœud de calcul. La soumission se fait, en supposant que le fichier de soumission s'appelle job.ll, via la commande :

llsubmit job.ll

Le fichier de soumission contient les lignes suivantes :

job.ll
# @ job_name = job_hybride
# @ job_type = BLUEGENE
# Fichier sortie standard du travail
# @ output = $(job_name).$(jobid)
# Fichier erreur standard du travail
# @ error = $(output)
# Temps elapsed maximum demande
# @ wall_clock_limit = 1:00:00
# Taille bloc d'execution
# en nombre de noeuds de calcul (16 coeurs/noeud)
# @ bg_size = 64
# @ queue
 
runjob --ranks-per-node 8 --envs "OMP_NUM_THREADS=4" --np 512 : ./my_code_mpi_omp my_arg1 my_arg2

La variable d'environnement OMP_NUM_THREADS indique le nombre de threads OpenMP par processus MPI que l'on veut. Ce nombre ne doit pas dépasser le nombre maximum de threads hardware disponibles (càd 64 threads hardware par nœud de calcul). Elle n'est pas obligatoire et a pour valeur en cas d'omission le nombre maximum de threads possible.

Pour rappel, il est fortement conseillé de créer des jobs multisteps pour traiter vos parties séquentielles (pré ou post-traitement et transferts de fichiers).

Attention : par défaut, la mémoire stack par thread OpenMP est limitée à 4 Mio. Pour la modifier, il suffit d'utiliser la variable d'environnement OMP_STACKSIZE (par exemple : runjob –envs OMP_STACK_SIZE=16M … pour la positionner à 16 Mio).

Vous trouverez plus d'informations sur comment soumettre des jobs dans les sections exécution d'un code parallèle en batch et principaux paramètres de la commande runjob.