Ir para o conteúdo

Compilação com suporte de GPU

O FrontISTR pode ser executado em GPUs utilizando a funcionalidade OpenACC do NVIDIA HPC SDK. Esta página descreve como compilar o FrontISTR com suporte de GPU ativado e como o executar.

Para as bibliotecas necessárias, consulte Dependências obrigatórias e opcionais.

Procedimento de compilação

Utilize os compiladores do NVIDIA HPC SDK (nvc, nvc++ e nvfortran). Num ambiente de cluster HPC, o NVIDIA HPC SDK tem de ser carregado antes da compilação, de acordo com o manual do ambiente (por exemplo, module load nvhpc).

As bibliotecas opcionais, como METIS, MUMPS e MKL, não suportam GPUs, pelo que são desativadas nos exemplos de comandos abaixo (por exemplo, WITH_METIS=OFF).

Como descrito em Compilação com CMake, quando o NVIDIA HPC SDK (nvc, nvc++, nvfortran) é especificado para os compiladores, -gpu=ccnative,mem:managed é definido em CMakeLists.txt. ccnative é uma opção que deteta automaticamente a GPU no ambiente de compilação e seleciona o alvo ideal, pelo que não são necessárias alterações manuais para cada ambiente. mem: é uma opção que especifica como é tratada a memória da GPU; é obrigatória porque a implementação GPU do FrontISTR pressupõe Unified Memory. mem:managed é a configuração predefinida para ambientes gerais em que a CPU e a GPU possuem memórias separadas.

Nota: Em arquiteturas como Miyabi (GH200), nas quais a CPU e a GPU estão integradas através de NVLink, mem:managed deve ser substituído por mem:unified; altere a configuração de acordo com o ambiente utilizado (-gpu=ccnative,mem:unified).

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

Ao utilizar MPI, os compiladores wrapper de MPI (como mpicc) têm de estar configurados para invocar internamente os compiladores do NVIDIA HPC SDK (como nvc). Em muitos ambientes de cluster HPC, o carregamento do NVIDIA HPC SDK e das bibliotecas MPI através de comandos como module load fornece automaticamente esta configuração. No entanto, as versões recomendadas e os procedimentos de carregamento variam consoante o ambiente, pelo que deverá consultar o manual do utilizador ou outra documentação de cada ambiente para obter detalhes.

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

Execução

O procedimento de execução de uma compilação para GPU é, em termos gerais, o mesmo que para uma compilação para CPU. Para procedimentos gerais de execução, consulte o Guia de execução.

Profiling

Os dados de profiling podem ser recolhidos utilizando o NVIDIA Nsight Systems (nsys).

Sem MPI

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

Com MPI

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