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 |
|
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