Some modifications for NVIDIA GPU acceleration with OpenACC
Closes #770 (closed), #771 (closed)
NVIDIA HPC SDK / OpenACC を用いた GPU ビルドの可搬性と実行安定性を改善し、あわせて GPU 対応を README に明記する。3つのコミットからなる。
1. GPU ターゲットを ccnative に変更
変更内容: CMakeLists.txt の NVIDIA コンパイラ用フラグで、-gpu=cc80,mem:managed を -gpu=ccnative,mem:managed に変更した(C / C++ / Fortran の3言語)。
理由: cc80(compute capability 8.0)はビルド対象を A100 世代に固定してしまい、他世代の GPU では再ビルドが必要になる。ccnative はビルドホストに搭載された GPU の compute capability を自動検出するため、環境に応じて適切なコードが生成され、特定世代への決め打ちを避けられる。
2. TL_UCX の asymmetric memory type エラーの解消
変更内容: hecmw1/src/solver/communication/hecmw_comm_f.F90 の hecmw_allreduce_R / hecmw_allreduce_I で、入力 val を一旦 allocatable な送信バッファ sbuf にコピーしてから MPI_allREDUCE に渡すように変更した。これに伴い、従来の _OPENACC 用コードパス(acc_malloc / acc_map_data / host_data 等による明示的なデバイスポインタ操作)を削除し、コードを大幅に簡素化した(14 挿入 / 43 削除)。
理由: -gpu=mem:managed 環境では allocatable 配列はマネージドメモリに置かれる一方、引数 val はホストメモリのことがある。送信バッファ(val)と受信バッファ(VALM、allocatable=マネージド)でメモリタイプが食い違うと、UCX/UCC が "asymmetric src/dst memory types" エラーを出す。送受信ともに allocatable(マネージドメモリ)に揃えることでメモリタイプを一致させ、エラーを解消する。マネージドメモリにより従来の手動デバイスマッピングが不要になるため、関連コードも整理した。
3. README への GPU 対応の追記
変更内容: README.md と README.ja.md の両方に、以下を最小限の追記で反映した。
- 主な特徴: 「OpenACC による NVIDIA GPU 対応」を追加
- 動作環境・依存関係: 「GPU 利用時」として NVIDIA HPC SDK と NVIDIA HPC-X(推奨)を追記
- ビルド: GPU ビルド時に NVIDIA コンパイラを指定する旨の注記を追加
理由: 上記の改善により GPU ビルドが実用的になったため、利用者が GPU 対応・必要なソフトウェア・ビルド方法を把握できるようドキュメントを整備する。既存の体裁を崩さないよう、新規セクションは設けず既存項目への差し込みに留めた。
4. 行列統合処理の初期化フェーズ非依存化
変更内容: GPU 反復法向けの統合配列(A / indexA / itemA)の確保と NPA(= NP + NPL + NPU)の計算を、hecmw_matrix_misc.F90 の hecmw_mat_integrate 内へ移動した。あわせて、m_fstr.F90 の hecMAT_init での A の確保・ゼロ初期化と、hecmw_mat_con.f90 での NPA 計算を削除し、hecmw_mat_finalize に A / indexA / itemA の解放を追加した。
理由: 従来、統合配列の確保は hecMAT_init(fistr1 側)、NPA の計算は hecmw_mat_con(標準的な行列構造構築経路)に分散して紐付いていた。しかし接触解析(solve_LINEQ_contact_elim)の hecTKT のように、hecmw_mat_init + hecmw_localmat_make_hecmat という別経路で構築される行列はこれらのフェーズを通らないため、NPA 未設定・統合配列未確保のまま反復法に渡り、GPU での行列統合が破綻していた。確保と NPA 計算を、解く直前に必ず呼ばれる hecmw_mat_integrate 内へ集約することで、構築経路に依存せず、その時点の NP/NPL/NPU から正しいサイズで統合配列が確保されるようにした。これにより hecTKT を含む各種行列を GPU 反復法で扱えるようになる。