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 purgemodule load intel/18.2module load intelmpi/18.2module 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=18workdir=${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