Vai al contenuto

Compilazione con supporto GPU

FrontISTR può essere eseguito su GPU utilizzando le funzionalità OpenACC di NVIDIA HPC SDK. Questa pagina descrive la procedura di compilazione con supporto GPU abilitato e il relativo metodo di esecuzione.

Per le librerie richieste come prerequisiti, consultare Dipendenze obbligatorie e opzionali.

Procedura di compilazione

Utilizzare i compilatori NVIDIA HPC SDK (nvc, nvc++, nvfortran). In un ambiente cluster HPC, prima della compilazione è necessario caricare NVIDIA HPC SDK seguendo il manuale dell’ambiente (ad esempio: module load nvhpc).

Le librerie opzionali come METIS, MUMPS e MKL non supportano la GPU, pertanto negli esempi di comando seguenti sono disabilitate (ad esempio WITH_METIS=OFF).

Come descritto in Compilazione con CMake, quando come compilatori vengono specificati quelli di NVIDIA HPC SDK (nvc, nvc++, nvfortran), in CMakeLists.txt viene impostato -gpu=ccnative,mem:managed. ccnative è un’opzione che rileva automaticamente la GPU dell’ambiente di compilazione e seleziona il target ottimale, quindi non sono necessarie modifiche manuali specifiche per ogni ambiente. mem: è un’opzione che specifica la gestione della memoria GPU ed è obbligatoria perché l’implementazione GPU di FrontISTR presuppone l’uso della Unified Memory. mem:managed è l’impostazione predefinita per gli ambienti generali in cui CPU e GPU dispongono di memorie separate.

Nota: nelle architetture come Miyabi (GH200), in cui CPU e GPU sono integrate tramite NVLink, viene utilizzato mem:unified al posto di mem:managed; modificare pertanto l’impostazione in base all’ambiente utilizzato (-gpu=ccnative,mem:unified).

OpenACC + OpenMP (senza 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

Quando si utilizza MPI, i compilatori wrapper MPI (come mpicc) devono essere configurati in modo da richiamare internamente i compilatori NVIDIA HPC SDK (come nvc). In molti ambienti cluster HPC, il caricamento di NVIDIA HPC SDK e delle librerie MPI mediante comandi come module load configura automaticamente questa situazione. Tuttavia, le versioni consigliate e le procedure di caricamento variano a seconda dell’ambiente; per i dettagli, consultare il manuale utente o altra documentazione dell’ambiente utilizzato.

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

Esecuzione

La procedura di esecuzione di una build GPU è sostanzialmente la stessa di una build CPU. Per la procedura di esecuzione generale, consultare la Guida all’esecuzione.

Profilazione

I dati di profilazione possono essere raccolti mediante NVIDIA Nsight Systems (nsys).

Senza MPI

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

Con MPI

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