Aller au contenu

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 partition gpu_all (Ampere) ou gpu_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 :

module purge
module load cpe/24.07
module load PrgEnv-nvidia 
module load craype-x86-spr
module list

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


Dernière mise à jour: 28 mars 2025 16:58:12