Skip to content

Translation status

This page has not yet been translated into English, or its translation is out of date. The current 日本語 version is shown as a fallback.

GPU を用いたビルド

FrontISTR は NVIDIA HPC SDK の OpenACC 機能を用いて GPU 上で実行できる.このページでは GPU を有効にしたビルド手順と実行方法を説明する.

前提となるライブラリについては 必須・オプション依存ライブラリ を参照されたい.

ビルド手順

NVIDIA HPC SDK のコンパイラ(nvc, nvc++, nvfortran)を使用する.HPC クラスタ環境では,ビルド前に環境のマニュアルに従って NVIDIA HPC SDK をロードしておく必要がある(例: module load nvhpc).

METIS・MUMPS・MKL 等のオプションライブラリは GPU に対応していないため,以下のコマンド例では無効化している(WITH_METIS=OFF 等).

CMake によるビルド手順で述べたように,コンパイラに,NVIDIA HPC SDK(nvc, nvc++, nvfortran)が指定されると,CMakeLists.txt にて -gpu=ccnative,mem:managed が設定される.ccnative はビルド環境の GPU を自動検出して最適なターゲットを選択するオプションであり,環境ごとの手動変更は不要である.mem: は GPU メモリの扱いを指定するオプションで,FrontISTR の GPU 実装は Unified Memory を前提とするため指定が必須である.mem:managed は CPU と GPU が別々のメモリを持つ一般的な環境向けのデフォルト設定である.

Note: Miyabi(GH200)のように CPU と GPU が NVLink で統合されたアーキテクチャでは,mem:managed の代わりに mem:unified が使用されるため,利用する環境に応じて書き換える(-gpu=ccnative,mem:unified).

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

MPI を使用する場合,MPI ラッパーコンパイラ(mpicc 等)が内部で NVIDIA HPC SDK コンパイラ(nvc 等)を呼び出す構成になっている必要がある.HPC クラスタ環境では,module load 等のコマンドで NVIDIA HPC SDK および MPI ライブラリを読み込んだ場合,自動的にその構成になる環境が多いが,推奨バージョンや,ロード手順は環境によって異なるため,詳細は各環境のユーザーマニュアルなどを参照されたい.

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

実行方法

GPU ビルドの実行手順は基本的に CPU の場合と変わらない.汎用の実行手順については 実行ガイド を参照されたい.

プロファイリング

NVIDIA Nsight Systems(nsys)を用いてプロファイルデータを収集できる.

MPI なし

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

MPI あり

nsys profile -t cuda,mpi -s none -o profile_result \
  mpiexec -n <プロセス数> /path/to/FrontISTR/build/fistr1/fistr1 -t 8