Expérimental : OpenMPI UCX Cuda Aware

Le module correspondant :

module purge
module load openmpi/pgi/4.0.4-UCX-cuda
module li
Currently Loaded Modulefiles:
 1) cuda/10.1.105                2) gcc/7.3.0                    3) pgi/19.10                    4) openmpi/pgi/4.0.4-UCX-cuda

Dans le cas ou l'application est linkée statiquement (voir https://github.com/openucx/ucx/wiki/NVIDIA-GPU-Support ), il est nécessaire d'activer le paramètre -x UCX_MEMTYPE_CACHE=n et donc d'utiliser la commande mpirun :

mpirun -x UCX_MEMTYPE_CACHE=n -np 4 ./$EXE

ou bien

export UCX_MEMTYPE_CACHE=n
mpirun -np 4 ./$EXE

Exemple de placement 2 processus par socket sur un nœud Volta d’Olympe (+ activation Nivida MPS):

#!/bin/bash
#SBATCH --time 00:15:00
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=8
#SBATCH --gres=gpu:4
# -----------

module purge
module load openmpi/pgi/4.0.4-UCX-cuda

# -----------
##---UCX
#fichier machinefile
ExpandNodeList -r -p $SLURM_NTASKS_PER_NODE $SLURM_NODELIST > machine_file
#--MPS
#Activation Nvidia MPS
clush -bw ${SLURM_JOB_NODELIST} "nvidia-cuda-mps-control -d"
# -----------
# Positionnement des compteurs Nvlink à zero - set counters:
nvidia-smi nvlink -sc 0bz

#placement de de processus par socket : --map-by ppr:2:socket - ppr : process per ressource ; ressource=socket
mpirun --bind-to core --map-by ppr:2:socket -x UCX_MEMTYPE_CACHE=n --machinefile machine_file -n 16  ./$EXE | tee $LOG

# lecture des compteurs -read counters:
nvidia-smi nvlink -g 0
# ràz - reset counters:
nvidia-smi nvlink -sc 0bn

#Désactivation Nvidia MPS
clush -bw ${SLURM_JOB_NODELIST} "echo quit | nvidia-cuda-mps-control"

Voir aussi

OpenMPI

La bibliothèque mpi - Version libre Openmpi