fugakuブランチを -DARCH=FX64 の分岐として統合 (#572 step 3)

概要

fugaku ブランチの最適化を、-DARCH=FX64 のビルドでだけ有効になる形で master に移植した。

最適化の中身は、元の実装を最大限そのまま移している。サブルーチン名、変数名、ループ、OCL・OpenMP の指示行は fugaku ブランチのままで、コミットも fugaku ブランチの項目ごとに分けた。元の実装と違うのは、master 側の変更への追随と、下の「議論が必要な点」に挙げたものだけである。

FX64 以外のビルドに増えるのは、中身が空の関数とその呼び出しだけである。制御ファイルの仕様は変えていない。CSR の行列ベクトル積と SSOR 前処理は、!SOLVER の MATRIXFORMAT=CSR(FX64 ビルドの既定)で選ばれる。それ以外の項目は、FX64 ビルドで常に有効になる。

変更内容

コミット メッセージ 要約
b972d051 Preprocess the sources the FX64 tuning branches in #ifdef を置く2ファイルを .F90 に改名(内容は無変更)
acea287c Define HECMW_ARCH_ for the tuned implementations to build under ARCH が GENERIC 以外のときにマクロを定義し、有効になる項目を CMake のサマリに出す
756ff490 Add the 3x3 block transpose of the FX64 kernels 3x3 ブロックの転置
2f56608f Add the CSR matrix-vector product of FX64 for NDOF=3 行列を CSR に持ち直す行列ベクトル積。ソルバの終了時に破棄する
1c662b45 Add the CSR SSOR preconditioner of FX64 for NDOF=3 SSOR 前処理の CSR 化
eef04743 Give hecmw_precond_apply explicit-shape vectors on FX64 前処理の入口の仮引数を明示形状にする
-- Run the CG of the fugaku branch on FX64 作業配列の1次元化とベクトル演算のインライン化をした CG
7e144428 Let CG pass an indefinite preconditioner ten times in a row before it gives up CG が前処理の不定性で打ち切る条件を、通算3回から連続10回に変更(全ビルドに効く)
-- Reorder the local node numbering in node blocks on FX64 ノードブロックリオーダリングと、結果出力時の逆並べ替え
31f05434 Partition with node weights on FX64 パーティショナのノード重み付き METIS 分割

議論が必要な点

  1. #ifdef で分岐していること(#ifdef が増えること)
    • FX64 用のコードは #ifdef HECMW_ARCH_FX64 の内側にあり、他のビルドではコンパイルされない
    • 関数は常に定義して中身だけを囲い、呼び出す側は無条件にした(OpenACC の hecmw_mat_integrate と同じ形)
  2. CG を別ファイルにしたこと
    • 元の実装は CG の反復ループ全体を書き換えているので、同じモジュールを定義する hecmw_solver_CG_fx64.f90 を置いて、ARCH=FX64 のときだけ差し替える
    • CG に #ifdef は出ないが、同じ内容のファイルが2つになり、CG を変更するときは両方に入れる必要がある
  3. リオーダリングの実施条件を増やしたこと
    • 元の実装の条件は、3自由度・反復法・静解析または動解析・接触なし
    • リオーダリングは制御ファイルの読み込み後に局所節点番号を付け替えるが、付け替えるのはメッシュ(座標、要素の節点、節点グループ、通信テーブル)だけで、それより前に局所節点番号で作られたデータと、結果ファイルの節点順で読み込むデータは、誤った節点に付く。このため次の解析を対象から外した
      • MPC、EMBED、節点で定義する局所座標系、初期条件(制御ファイル・メッシュ)(※)
      • 結果ファイルから読む温度(READRESULT)と固有モード(周波数応答)(※)
      • 平滑化要素(SELECTIVE_ESNS)、有限回転シェル
      • ※の2つはfugaku ブランチの分岐前からある機能で、fugaku ブランチでは対象から外れていない。最適化の対象として想定しない解析だろうが、除外条件として追加した
    • fstr_main に条件を増やすのではなく、リオーダリング呼び出しの後で、callee 内で判定して弾くのでもよい
  4. リオーダリングの置き場所
    • #572 には、パーティショナの METIS 分割の後に施す案がある。本 MR は、fugaku ブランチの配置(fistr1 の起動時)をそのまま移した。パーティショナ側へ移すと、メッシュ構造体に持たせた並べ替え表、結果出力時の逆並べ替え、3 の除外条件が要らなくなる
    • →リオーダリングはパーティショナ側におく方針をとる。ただし本 MR には含めず、追って Issue, MR を作成する
  5. 元の実装のまま残したもの
    • リオーダリングの呼び出しの引数(ブロック数など)は結果に影響せず、呼ばれないルーチンも残っている。元の実装と突き合わせやすいように削っていない。
  6. FX64 ビルドでは、MPI のテスト solver/CR の ILU(1) が収束しない。リオーダリング後の節点順によるもので、fugaku ブランチでも同じ
  7. A64FX 実機での性能は、この MR では確かめていない
Edited by Kanato Kono

Merge request reports

Loading
Loading