Add the implementation dispatch and setup/teardown hooks for architecture tuning (#572 step 1)
アーキテクチャ別チューニングブランチの統合(#572)の第一段階です。
概要
実装本体を切り替えるための枠と、持ち直しデータの生存区間を区切るフックだけを、挙動を一切変えずに master へ入れます。
この MR の時点では実装の選択肢は既定実装ひとつだけで、ユーザから見える変更はありません。
以後の NEC 実装・富岳実装は、この枠に載せる形で追加できるようになります。
背景
#572 の要求のうち「外からは標準の HECMAT で受け取り、内部でデータを持ち直し、計算後は破棄する」を実現するには、SpMV と前処理の実装を差し替えられる構造が要ります。
SXAT2 ブランチと fugaku ブランチは、いずれも hecmw_solver_las_33.F90(SpMV)と hecmw_precond_SSOR_33.F90(SSOR 前処理)に手を入れています。
ただし方式が異なり、SXAT2 は既存実装を残したまま実装を追加、fugaku は既存実装を置換しています。
この違いが両ブランチの主要な競合原因になっており、両者を共存させるには fugaku 側を追加方式に作り替え、実装本体を名前付きサブルーチンへ切り出してディスパッチャから選ぶ形にする必要があります。
この MR は、その共通の受け皿にあたる部分です。
hecmw_matvec_33_inner
├─ JAD 初期化済み → hecmw_JAD_MATVEC (従来どおり)
└─ select case (matvec_impl)
└─ GENERIC → hecmw_matvec_33_generic ← 本MRで切り出した既存のBCSRループ
(以後 FX64 / SXAT がここに並ぶ)あわせて #572 の「計算後に破棄」に対応するため、hecmw_matvec_setup と対になる hecmw_matvec_teardown を用意し、持ち直しデータの生存区間を反復ソルバ1回分に閉じ込める設計にしています。
変更内容
1. 実装を選ぶアクセサの追加(コミット 330287d9)
hecmw_matrix_misc.F90 に IDX_I_MATVEC_IMPL = 36 / IDX_I_PRECOND_IMPL = 37 とアクセサ対を追加しました。既存の hecmw_mat_get_usejad / hecmw_mat_set_usejad と同じく hecMAT%Iarray に値を持たせる方式です。既定値は hecmw_mat_init で call hecmw_mat_set_usejad( hecMAT, 0 ) と同じ流儀で設定しています。
実装を表す定数は HECMW_MATVEC_IMPL_GENERIC / HECMW_PRECOND_IMPL_GENERIC(ともに 0)の2つだけです。HECMW_MAT_DUMP_TYPE_* は値の定数を消費側の hecmw_matrix_dump に置いていますが、ここでは hecmw_matrix_misc 側に置きました。前処理側の定数を共有できる位置が hecmw_precond になり、hecmw_precond_SSOR_33 から use すると循環参照になるためです。
2. NDOF=3 の SpMV のディスパッチ(コミット 7f174323)
hecmw_matvec_33_inner にインラインで書かれていた BCSR ループを hecmw_matvec_33_generic へ切り出し、選択値経由で呼ぶ形にしました。ループ本体・OpenMP 指示行・!OCL 指示行・#ifdef _OPENACC のカーネルはいずれも変更していません。差分が大きく見えるのは else ブロック1段分のインデントが解消されたためで、git diff -w では +128 / -56 行です。
ブロック分割(startPos / endPos)とセクタキャッシュの save 変数は既定実装に固有のものなので module スコープへ移し、初期化を setup_tuning_parameters に切り出しました。hecmw_precond_SSOR_33 が同名のサブルーチンを isFirst ガードの下に持っており、それに倣った形です。
hecmw_matvec_setup / hecmw_matvec_teardown も追加しました。NDOF による振り分けは既存の hecmw_matvec / hecmw_matresid に倣っています。
- setup は選択値を module 変数に控え、teardown は既定実装に戻します。setup と teardown の外側で
hecmw_matvecが呼ばれた場合は既定実装になるため、反復ソルバ以外からの呼び出し(固有値解析、接触解析、熱伝導)は分岐を足さずに従来経路のままです - setup は先頭で JAD の初期化状態を見て早期 return します。JAD は行列ベクトル積そのものを置き換えるため、アーキ別実装と排他だからです
3. NDOF=3 の SSOR 前処理のディスパッチ(コミット 31b63e85)
hecmw_precond_SSOR_33_apply の本体も同様に hecmw_precond_SSOR_33_apply_generic へ切り出しました。
_apply の仮引数は ZP のみで hecMAT を受け取らないため、選択値は _setup で hecMAT から取り出して module 変数に控えています。同ファイルが N / NColor / COLORindex を扱っているのと同じ形で、hecmw_precond_SSOR_apply 以下の NDOF 6種の署名に波及させずに済みます。
4. ライフサイクルの呼び出し(コミット 17f1088b)
7つの反復ソルバ(CG / CR / BiCGSTAB / GMRES / GPBiCG / GMRESR / GMRESREN)に setup / teardown の呼び出しを追加しました。
- setup は
hecmw_JAD_INITの直後、すなわちスケーリングより後 - teardown は
hecmw_JAD_FINALIZEの直前
JAD とアーキ別 SpMV は排他であり、setup が JAD の初期化状態を見る必要があるため、この順序になります。fugaku ブランチは setup を hecmw_solver_Iterative.f90 から呼んでおり hecmw_solver_scaling_fw より前になっていますが、SCALING=YES のとき未スケーリングの行列を持ち直すことになるため踏襲していません。
確認したこと
- 既存テスト: ctest は 78件中78件PASSです
- 数値の一致: 18ケース(7ソルバ ×
USEJAD=YES/NOの14件と、固有値解析・接触2種・熱伝導の4件)を派生元と本ブランチの両バイナリで実行し、ソルバログ(反復回数と残差履歴)と結果ファイルがいずれも完全一致することを確認しました - フォールバック経路: 上記のうち固有値解析・接触・熱伝導は反復ソルバ以外から
hecmw_matvec/hecmw_matresidを呼ぶ経路です。serial テストにも固有値3件・接触11件・熱伝導12件が含まれており、いずれもPASSです - JAD 経路: 一時的な計装ビルドで、
USEJAD=YESのとき setup が早期 return し、以降の行列ベクトル積が JAD 経路へ入ることを確認しました。USEJAD=NOでは setup が既定実装を選び、固有値解析・接触では setup の外側からの呼び出しが既定実装にフォールバックしています
補足
hecmw_precond_SSOR_33_clearは選択値を既定実装に戻していません。SpMV 側が teardown で戻すのと非対称ですが、_setupは_applyより前に必ず呼ばれるため実害はなく、INITIALIZEDによる再利用時に前回の値が残るのはNやCOLORindexと同じ扱いになります。既存の clear の構造に手を入れないことを優先しましたselect caseにcase defaultは置いていません。選択肢が既定実装ひとつでhecmw_mat_initが必ず既定値を入れるため到達しないためです。cnt から値を受け取れるようにする段階で、hecmw_precond.f90のHEC-MW-SOLVER-E-1001に倣ったエラー処理を追加します- 実装の選択値は module 変数で持っているため、反復ソルバがネストすると内側の teardown が外側の選択も戻します。現在
hecmw_solveの呼び出し元はsolve_LINEQ.f90とsolve_LINEQ_contact_elim.f90でネストは発生せず、既定実装しかない本 MR では影響ありません hecmw_matvec_33_setupの仮引数hecMESHは現時点では未使用です。hecmw_matvec系の署名に揃えたもので、持ち直しを行う実装が袖領域の構成に使う想定です- cnt ファイルのパラメータ、
-DARCH=、CMake サマリへのアーキ出力は本 MR の範囲外です。名称と値の体系は #572 で議論のうえ、後続の MR で追加します - NDOF=3 以外(
las_44/las_66/las_nn等)の切り出しは行っていません。hecmw_matvec_setup/_teardownの NDOF 振り分け自体は既存のhecmw_matvecに倣った形にしてあります
Refs #572