Ir para o conteúdo

Build com suporte a GPU

O FrontISTR pode ser executado em GPUs usando os recursos OpenACC do NVIDIA HPC SDK. Esta página descreve como fazer o build do FrontISTR com suporte a GPU habilitado e como executá-lo.

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

Procedimento de build

Use os compiladores do NVIDIA HPC SDK (nvc, nvc++ e nvfortran). Em um ambiente de cluster HPC, o NVIDIA HPC SDK deve ser carregado antes do build, de acordo com o manual do ambiente (por exemplo, module load nvhpc).

Bibliotecas opcionais como METIS, MUMPS e MKL não oferecem suporte a GPU; por isso, são desativadas nos exemplos de comando abaixo (por exemplo, WITH_METIS=OFF).

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

Nota: Em arquiteturas como o Miyabi (GH200), em que CPU e GPU são integradas via NVLink, em vez de mem:managed usa-se 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 usar MPI, os compiladores wrapper do MPI (como mpicc) devem ser configurados para invocar internamente os compiladores do NVIDIA HPC SDK (como nvc). Em muitos ambientes de cluster HPC, carregar o NVIDIA HPC SDK e as bibliotecas MPI com comandos como module load fornece essa configuração automaticamente. Entretanto, as versões recomendadas e os procedimentos de carregamento variam conforme o ambiente; consulte o manual do usuário ou outra documentação do respectivo 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 um build para GPU é basicamente o mesmo de um build para CPU. Para os procedimentos gerais de execução, consulte o Guia de execução.

Profiling

Os dados de profiling podem ser coletados usando 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 <numero_de_processos> /path/to/FrontISTR/build/fistr1/fistr1 -t 8