Compilation des codes GPU¶
Généralités¶
Sur Austral, pour les communications de GPU à GPU avec les applications utilisant la fonctionnalité GPU-aware MPI
- en inter-nœuds, un protocole RDMA est mise en œuvre
- en intra-nœud dans le cas des GPU NVIDIA, le lien rapide NVLink est utilisé
Pour l'exécution d'un tel code, il faut ajouter dans le script de soumission par Slurm la variable d'environnement suivante de Cray MPICH :
export MPICH_GPU_SUPPORT_ENABLED=1
GPU NVIDIA¶
Les frontales n'ont pas toutes les bibliothèques des nœuds de calcul ciblés, ni l'OS de certains d'entre eux.
Les compilations doivent donc se faire sur les nœuds de calcul.
Depuis une frontale :
- exécuter
module purge
avant de soumettre un travail Slurm, en partitiongpu_all
(Ampere) ougpu_h200
(Hopper) - les commandes
module
et de compilation qui suivent doivent être exécutées sous un tel travail Slurm
Architecture Ampere (A100)¶
La mention 80
dans le nom du module craype-accel-nvidia80
ou des options de compilation correspond à la compute capability des GPU A100
Code mono-GPU CUDA ou OpenCL¶
Le compilateur nvcc
pour CUDA ou la librairie OpenCL est fourni(e) par l'environnement :
module purge
module load cpe_env/gcc12.2.1-mpich8.1.30-milan-02.25
module load nvhpc-byo-compiler/23.11
module list
Pour OpenCL, compiler avec CC
(correspondant à g++
) et ajouter dans un Makefile les options d'édition de lien :
-L$(NVHPC_ROOT)/cuda/12.3/targets/x86_64-linux/lib -lOpenCL
Code mono-GPU OpenACC ou OpenMP target¶
Pour ces langages par directives, l'environnement suivant fournit les compilateurs nvc
/ nvc++
/ nvfortran
:
module purge
module load cpe_env/gcc12.2.1-mpich8.1.30-milan-02.25
module load nvidia-mixed/23.11
module list
Code multi-GPU, GPU-aware MPI avec CUDA¶
L'environnement suivant doit être utilisé
module purge
module load cpe_env/gcc12.2.1-mpich8.1.30-milan-02.25
module load nvidia-mixed/23.11
module load cuda/12.3
module load craype-accel-nvidia80
module list
Le wrapper CC
embarquant Cray MPICH (et g++
), les commandes de compilation de l'exemple suivant sont utilisables
nvcc -ccbin CC -gencode arch=compute_80,code=sm_80 -O2 -c poisson.cu
nvcc -ccbin CC -gencode arch=compute_80,code=sm_80 -O2 -c parallel.cu
nvcc -ccbin CC -gencode arch=compute_80,code=sm_80 -O2 -c calcul.cu
nvcc -ccbin CC -gencode arch=compute_80,code=sm_80 -O2 -c device_func.cu
nvcc -ccbin CC -gencode arch=compute_80,code=sm_80 -O2 -o poisson poisson.o parallel.o calcul.o device_func.o
L'exécutable généré doit être automatiquement lié à la libraire libmpi_gtl_cuda
de HPE (_gtl_
pour GPU Transport Layer)
[login@austral-c23gpu2 gpu]$ ldd ./poisson | grep libmpi_gtl_
libmpi_gtl_cuda.so.0 => /opt/cray/pe/lib64/libmpi_gtl_cuda.so.0 (0x00001537919ba000)
Code multi-GPU, GPU-aware MPI avec OpenACC ou OpenMP target¶
L'environnement suivant doit être utilisé
module purge
module load cpe/24.03
module load PrgEnv-nvidia
module load cuda/12.3
module load craype-accel-nvidia80
module load craype-x86-milan
module list
Les wrappers ftn
, cc
ou CC
correspondent respectivement à nvfortran
, nvc
, nvc++
, mais ils embarquent aussi les librairies Cray MPICH.
Pour OpenACC les commandes de compilation de l'exemple suivant sont utilisables :
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c mod_mpi.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c mod_prec.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c communication.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c domaine.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c init_device.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c initialisation.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c mod_interface.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c poisson.F90
ftn -acc -Minfo=accel -gpu=cc80 -Mpreprocess -O2 -tp=zen3 -c voisinage.F90
ftn -cuda -mp=gpu -noacc -Minfo=mp -gpu=cc80 -O2 -tp=zen3 -o bin/poisson *.o -L/opt/cray/pe/mpich/8.1.29/gtl/lib -lmpi_gtl_cuda
Les options d'édition de lien -L/opt/cray/pe/mpich/8.1.29/gtl/lib -lmpi_gtl_cuda
sont fournies par deux variables du CPE (Cray Programming Environment), exploitables sous la forme $(PE_MPICH_GTL_DIR_nvidia80) $(PE_MPICH_GTL_LIBS_nvidia80)
dans un Makefile.
Pour OpenMP target, les options -acc -Minfo=accel
doivent être remplacées par -mp=gpu -noacc -Minfo=mp
Architecture Hopper (H200)¶
La mention 90
dans le nom du module craype-accel-nvidia90
ou des options de compilation correspond à la compute capability des GPU H200
Code mono-GPU, CUDA ou OpenCL¶
Le compilateur nvcc
pour CUDA ou la librairie OpenCL est fourni(e) par l'environnement :
module purge
module load cpe_env/gcc13.2.1-mpich8.1.30-spr-02.25
module load nvhpc-byo-compiler/25.1
module load craype-x86-spr
module list
Pour OpenCL, compiler avec CC
(correspondant à g++
) et ajouter dans un Makefile les options d'édition de lien :
-L$(NVHPC_ROOT)/cuda/12.6/targets/x86_64-linux/lib -lOpenCL
Code mono-GPU OpenACC ou OpenMP target¶
Pour ces langages par directives, l'environnement suivant fournit les compilateurs nvc
/ nvc++
/ nvfortran
:
Code multi-GPU, GPU-aware MPI avec CUDA¶
L'environnement suivant doit être utilisé
module purge
module load cpe_env/gcc13.2.1-mpich8.1.30-spr-02.25
module load cudatoolkit/12.4
module load craype-accel-nvidia90
module load craype-x86-spr
module list
Le wrapper CC
embarquant Cray MPICH (et g++
), les commandes de compilation de l'exemple suivant sont utilisables
nvcc -ccbin CC -gencode arch=compute_90,code=sm_90 -O2 -c poisson.cu
nvcc -ccbin CC -gencode arch=compute_90,code=sm_90 -O2 -c parallel.cu
nvcc -ccbin CC -gencode arch=compute_90,code=sm_90 -O2 -c calcul.cu
nvcc -ccbin CC -gencode arch=compute_90,code=sm_90 -O2 -c device_func.cu
nvcc -ccbin CC -gencode arch=compute_90,code=sm_90 -O2 -o poisson poisson.o parallel.o calcul.o device_func.o
L'exécutable généré doit être automatiquement lié à la libraire libmpi_gtl_cuda
de HPE (_gtl_
pour GPU Transport Layer)
[login@austral-c23meso2 gpu]$ ldd ./poisson|grep libmpi_
libmpi_gtl_cuda.so.0 => /opt/cray/pe/lib64/libmpi_gtl_cuda.so.0 (0x0000147a1c233000)
Code multi-GPU, GPU-aware MPI avec OpenACC ou OpenMP target¶
L'environnement suivant doit être utilisé
module purge
module load cpe/24.07
module load PrgEnv-nvidia
module load cudatoolkit/12.4
module load craype-accel-nvidia90
module load craype-x86-spr
module list
Les wrappers ftn
, cc
ou CC
correspondent respectivement à nvfortran
, nvc
, nvc++
, mais ils embarquent aussi les librairies Cray MPICH.
Pour OpenACC les commandes de compilation de l'exemple suivant sont utilisables :
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c mod_mpi.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c mod_prec.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c communication.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c domaine.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c init_device.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c initialisation.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c mod_interface.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c poisson.F90
ftn -acc -Minfo=accel -gpu=cc90 -Mpreprocess -O2 -c voisinage.F90
ftn -acc -Minfo=accel -gpu=cc90 -O2 -o bin/poisson *.o -L/opt/cray/pe/mpich/8.1.30/gtl/lib -lmpi_gtl_cuda
Les options d'édition de lien -L/opt/cray/pe/mpich/8.1.30/gtl/lib -lmpi_gtl_cuda
sont fournies par deux variables du CPE (Cray Programming Environment), exploitables sous la forme $(PE_MPICH_GTL_DIR_nvidia90) $(PE_MPICH_GTL_LIBS_nvidia90)
dans un Makefile.
Pour OpenMP target, les options -acc -Minfo=accel
doivent être remplacées par -mp=gpu -noacc -Minfo=mp
GPU AMD¶
Les codes peuvent être compilés sur l'une des frontales d'Austral
Cray compiler couplé à ROCM supporte les langages de programmation suivants pour les GPU AMD
- OpenACC (FORTRAN uniquement)
- OpenMP target
- HIP
ROCM embarque aussi OpenCL
Code OpenACC ou OpenMP target, mono-GPU ou multi-GPU (GPU-aware MPI)¶
L'environnement suivant doit être utilisé
module purge
module load cpe_env/craycc17.0.1-mpich8.1.29-milan-08.24
module load rocm/6.1.3
module load craype-accel-amd-gfx90a
module list
Le module craype-accel-amd-gfx90a
cible l'architecture des GPU MI210.
ftn
, cc
ou CC
correspondent respectivement à crayftn
, craycc
, crayCC
, mais ils embarquent aussi les librairies Cray MPICH.
Pour OpenACC les commandes de compilation de l'exemple suivant sont utilisables :
ftn -hacc -hnoomp -e F -O2 -hlist=a -c mod_mpi.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c mod_prec.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c communication.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c domaine.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c init_device.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c initialisation.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c mod_interface.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c poisson.F90
ftn -hacc -hnoomp -e F -O2 -hlist=a -c voisinage.F90
ftn -hacc -hnoomp -O2 -hlist=a -o bin/poisson communication.o domaine.o init_device.o initialisation.o mod_interface.o mod_prec.o poisson.o voisinage.o mod_mpi.o
Pour OpenMP target, remplacer les options -hacc -hnoomp
précédentes par -homp -hnoacc
L'exéctubale d'un code utilisant GPU-aware MPI doit automatiquement être lié à la librairie libmpi_gtl_hsa
(_gtl_
pour GPU Transport Layer)
[login@austral-s23front4 amdgpu]$ ldd bin/poisson | grep libmpi_gtl_
libmpi_gtl_hsa.so.0 => /opt/cray/pe/lib64/libmpi_gtl_hsa.so.0 (0x00007fcf0794b000)
Code OpenCL¶
L'environnement suivant doit être utilisé
module purge
module load cpe_env/gcc12.2.1-mpich8.1.29-milan-08.24
module load rocm/6.1.3
module list
Compiler avec CC
(correspondant à g++
) et ajouter dans un Makefile l'option d'édition de lien -lOpenCL
Exemple
CC -std=c99 -Wall -DUNIX -g -DDEBUG -m64 -c add_numbers.c
CC -std=c99 -Wall -DUNIX -g -DDEBUG -m64 -o add_numbers add_numbers.o -lOpenCL