Exécution hybride MPI et OpenMP

A travers des exemples nous montrons le moyens d’exécuter des jobs mixtes MPI+OpenMP, en attachant explicitement les processus et les threads aux cœurs physiques des nœuds.

Premier exemple

En-têtes slurm:

  • Job MPI+OpenMP avec 36 processus MPI en tout et 2 threads par processus MPI
  • On réserve 2 nœuds
  • 18 processus MPI par nœud et 2 threads openMP par processus MPI
#!/bin/bash
#SBATCH -N 2
#SBATCH -n 36
#SBATCH --ntasks-per-node=18
#SBATCH --threads-per-core=1
#SBATCH --cpus-per-task=2
#SBATCH --cpu_bind=none
-N Nombre de nœuds
-n Nombre de tâches MPI
--ntasks-per-node= Nombre de tâches MPI par nœud (doit correspondre au nombre de total de tâches MPI divisé par le nombre de nœuds)
--threads-per-core= Nombre de threads par cœur (pas d’utilisation de l’hyperthreading): laisser à 1
--cpus-per-task= Nombre de threads par processus MPI
$SLURM_CPUS_PER_TASK Cette variable contient le nombre défini pour --cpus-per-task

Environnement

module purge
module load intel/18.2
module load intelmpi/18.2
module li

Préparation :

workdir=${SLURM_SUBMIT_DIR}/${SLURM_JOBID}
mkdir ${workdir}
cd ${workdir}
cp $0 .

Variable d'environnement obligatoire:

export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}
OMP_NUM_THREADS Nombre de threads OpenMP par processus (ou tâche) MPI
SLURM_CPUS_PER_TASK

Variable SLURM définissant le nombre de core réservé par processus MPI

Exécution du code:

srun  $(placement) ../mon_appi_MPI_OpenMP.x

Second exemple

  • Job MPI+OpenMP avec 10 processus MPI en tout et 18 threads par processus MPI
  • On réserve 5 nœuds
  • 2 processus MPI par nœud et 18 threads openMP par processus MPI
#!/bin/bash
#SBATCH -N 5
#SBATCH -n 10
#SBATCH --ntasks-per-node=2
#SBATCH --threads-per-core=1
#SBATCH --cpus-per-task=18

workdir=${SLURM_SUBMIT_DIR}/${SLURM_JOBID}
mkdir ${workdir}
cd ${workdir}
cp $0 .

export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}

srun  $(placement) ../mon_appi_MPI_OpenMP.x

 

Voir aussi

Script SLURM pour une réservation de PLUS de 18 cœurs

Écrire un script pour un code utilisant plus de 18 cœurs