Aller au contenu

Compilation avec prise en charge du GPU

FrontISTR peut s'exécuter sur des GPU à l'aide des fonctions OpenACC du NVIDIA HPC SDK. Cette page décrit la procédure de compilation avec prise en charge du GPU ainsi que la méthode d'exécution.

Pour les bibliothèques requises, voir Bibliothèques dépendantes obligatoires et facultatives.

Procédure de compilation

Utiliser les compilateurs du NVIDIA HPC SDK (nvc, nvc++, nvfortran). Dans un environnement de cluster HPC, il est nécessaire de charger NVIDIA HPC SDK avant la compilation conformément au manuel de l'environnement (par exemple module load nvhpc).

Les bibliothèques facultatives telles que METIS, MUMPS et MKL ne prennent pas en charge les GPU ; elles sont donc désactivées dans les exemples de commandes ci-dessous (par exemple WITH_METIS=OFF).

Comme indiqué dans Procédure de compilation avec CMake, lorsque NVIDIA HPC SDK (nvc, nvc++, nvfortran) est spécifié comme compilateur, -gpu=ccnative,mem:managed est défini dans CMakeLists.txt. ccnative détecte automatiquement le GPU de l'environnement de compilation et sélectionne la cible optimale ; aucune modification manuelle propre à l'environnement n'est donc nécessaire. mem: spécifie la gestion de la mémoire GPU ; il est obligatoire car l'implémentation GPU de FrontISTR repose sur Unified Memory. mem:managed est le réglage par défaut pour les environnements courants où le CPU et le GPU disposent de mémoires distinctes.

Note : Sur les architectures telles que Miyabi (GH200), où le CPU et le GPU sont intégrés via NVLink, mem:unified est utilisé à la place de mem:managed ; modifier le réglage en fonction de l'environnement utilisé (-gpu=ccnative,mem:unified).

OpenACC + OpenMP (sans MPI)

mkdir build
cd build
CC=nvc CXX=nvc++ FC=nvfortran cmake \
  -DWITH_MPI=OFF -DWITH_OPENMP=ON \
  -DWITH_METIS=OFF -DWITH_MUMPS=OFF \
  -DWITH_MKL=OFF -DWITH_LAPACK=OFF \
  -DWITH_ML=OFF -DWITH_REFINER=OFF -DWITH_REVOCAP=OFF \
  ..
make -j

OpenACC + OpenMP + MPI

Lors de l'utilisation de MPI, les compilateurs wrappers MPI (tels que mpicc) doivent être configurés pour appeler en interne les compilateurs NVIDIA HPC SDK (tels que nvc). Dans de nombreux environnements de cluster HPC, le chargement de NVIDIA HPC SDK et des bibliothèques MPI avec des commandes telles que module load fournit automatiquement cette configuration. Les versions recommandées et les procédures de chargement variant selon l'environnement, consulter le manuel utilisateur ou la documentation de chaque environnement pour plus de détails.

mkdir build
cd build
CC=mpicc CXX=mpic++ FC=mpif90 cmake \
  -DWITH_MPI=ON -DWITH_OPENMP=ON \
  -DWITH_METIS=OFF -DWITH_MUMPS=OFF \
  -DWITH_MKL=OFF -DWITH_LAPACK=OFF \
  -DWITH_ML=OFF -DWITH_REFINER=OFF -DWITH_REVOCAP=OFF \
  ..
make -j

Exécution

La procédure d'exécution d'une compilation GPU est fondamentalement la même que pour une compilation CPU. Pour les procédures générales d'exécution, voir le Guide d'exécution.

Profilage

Les données de profilage peuvent être collectées avec NVIDIA Nsight Systems (nsys).

Sans MPI

nsys profile -t cuda -s none -o profile_result /path/to/FrontISTR/build/fistr1/fistr1

Avec MPI

nsys profile -t cuda,mpi -s none -o profile_result \
  mpiexec -n <nombre_de_processus> /path/to/FrontISTR/build/fistr1/fistr1 -t 8