Utilisation

Le calculateur est composé de processeurs disposant de 24 coeurs chacun, pour un total de 384 coeurs. La gestion des ressources s'effectue plutôt en attribuant 24 coeurs par chunk (ou 12 coeurs si on souhaite disposer de plus de mémoire par cpu).

calcul "MPI"

Plusieurs implémentations de Mpi sont disponibles, directement géré par les modules : openmpi, intelmpi, hpempi ; les codes sont généralement associés à la librairie mpi/hpempi-1.6

[homer@vision]$ module av mpi
-------------------------------------- /zfs/softs/modulefiles ---------------------------------------
mpi/hpempi-1.6/mpt/2.22      mpi/openmpi/gcc-4.8.5/4.0.4  mpi/openmpi/gcc-10.2/4.0.4
mpi/intelmpi/2020u2          mpi/openmpi/gcc-4.8.5/4.0.5  mpi/openmpi/gcc-10.2/4.0.5
mpi/openmpi/gcc-4.8.5/3.1.6  mpi/openmpi/gcc-10.2/3.1.6

Exemple de script

#!/bin/bash
#PBS -l walltime=48:00:00
#PBS -l select=2:ncpus=24:mpiprocs=24
#PBS -j oe
#PBS -q calcul_small
#PBS -N MPIJOB
#PBS -A project
#PBS -m ae -M homer@springfield.fr

# purge and load module for dependency (and mpi)
module purge
module load compilers/intel/compilers_2020u2 mpi/hpempi-1.6/mpt/2.22
module load lib/mkl/2020u2 lib/boost/1.70_gcc4.8 lib/vtk/7.1.0 lib/petsc/3.11/opt/hpmpt_intel20

# go to working directory (the place where you submit)
cd ${PBS_O_WORKDIR}

# count number of CPU (optional if you use mpi/hpempi-1.6/mpt
NCPU=`wc -l < $PBS_NODEFILE`

# manage dependency if necessary
export LD_LIBRARY_PATH=/home/homer/lib/:$LD_LIBRARY_PATH
CODE=/home/homer/bin/Release/mpi_code
INP_FILE=file.inp

ulimit -s unlimited

mpiexec_mpt -np $NCPU $CODE $INP_FILE > ${INP_FILE%.inp}.out.$PBS_JOBID 2>&1

calcul "Threads"

Pour utiliser des solveurs multithread, il est intéressant de placer les processus en fonction des ressources de la manière la plus compacte possible. Assigner (ou "pinning") un processus à un coeur de calcul du processeur pour améliorer les performances des codes en augmentant les accès à la mémoire locale. Ce placement peut jouer un rôle important sur la performance des codes.
Étant donné un ensemble de cœurs disponibles dans un calcul PBS, le noyau Linux fait généralement un assez bon travail de mise en correspondance des processus/threads avec les cœurs physiques, bien que le noyau puisse également faire migrer les processus/threads. Dans les cas où les placements par le noyau ou les bibliothèques MPI ou OpenMP ne sont pas optimaux, vous pouvez essayer plusieurs méthodes pour contrôler le placement afin d'améliorer les performances de votre code. L'utilisation du même placement d'une exécution à l'autre présente également l'avantage supplémentaire de réduire la variabilité de l'exécution.
Plusieurs outils existent : numactl, dplace et omplace (fourni avec le module mpi/hpempi-1.6/mpt)

omplace

omplace is a wrapper script for dplace. It pins processes and threads for better performance and provides an easier syntax than dplace for pinning processes and threads.

The omplace wrapper works with SGI MPT as well as with Intel MPI. In addition to pinning pure MPI or pure OpenMP applications, omplace can also be used for pinning hybrid MPI/OpenMP applications.

To avoid interference between dplace/omplace and Intel's thread affinity interface, set the environment variable KMP_AFFINITY to disabled or set OMPLACE_AFFINITY_COMPAT to ON ;


  • Syntax :
    Some useful omplace options are listed below:
WARNING: For omplace, a blank space is required between -c and cpulist. Without the space, the job will fail.
  • -b basecpu Specifies the starting CPU number for the effective CPU list.
  • -c cpulist Specifies the effective CPU list. This is a comma-separated list of CPUs or CPU ranges.
  • -nt nthreads Specifies the number of threads per MPI process. If this option is unspecified, it defaults to the value set for the OMP_NUM_THREADS environment variable.
    If OMP_NUM_THREADS is not set, then nthreads defaults to 1.
  • -v Verbose option. Portions of the automatically generated placement file will be displayed.
  • For information about additional options, see man omplace.
  • Usage : script example with omplace tool
#!/bin/bash
#PBS -N 48UCSB
#PBS -l select=1:ncpus=48:ompthreads=48:mem=96GB
#PBS -l walltime=24:00:00
#PBS -j oe
#PBS -q calcul_small

cd ${PBS_O_WORKDIR}

echo " ------------" 
echo " Begin at " 
date
echo " ------------" 
echo "OMPTHREADS = $OMP_NUM_THREADS" 

module add mpi/hpempi-1.6/mpt/2.22

OMPCODE=/bin/Release/fft_mech3D

omplace -nt ${OMP_NUM_THREADS} $OMPCODE -f file_${OMP_NUM_THREADS}.fxt > file${OMP_NUM_THREADS}.log 2>&1

echo " ------------" 
echo " DONE !!" 
date
echo " ------------"