Add the cnt parameter and cmake option that select the tuned implementation (#572 step 2)

アーキテクチャ別チューニングブランチの統合(#572)の第二段階です。

!596 (merged)(第一段階)に依存します。 !596 (merged) が用意した実装選択の内部機構に、ユーザが選択肢を選ぶための入口を足すものです。
!596 (merged) がマージされた後に本ブランチをリベースします。それまで本 MR の差分表示には !596 (merged) の変更も含まれます。

概要

実装を選ぶ入口を 2 つ追加します。

!SOLVER, METHOD=CG, PRECOND=1, MATRIXFORMAT=CSR    解析ごと(行列格納形式)
cmake -DARCH=FX64 ..                                ビルドごと(対象アーキテクチャ)

MATRIXFORMAT は行列ベクトル積と前処理が内部で用いる格納形式を選びます。既定は BSR(hecMAT 本来のブロック形式)です。

値 内容 実装
BSR hecMAT 本来のブロック形式 既存(全ビルドに入る)
JAD ベクトル機向けオーダリング 既存(USEJAD=YES と同じ)
CSR スカラー CSR に持ち直す MR4(A64FX)
SBLAS NEC NLC SBLAS に委譲 MR3(SX-Aurora TSUBASA)

-DARCH= は対象アーキテクチャを指定し、どのチューニング実装をバイナリに組み込むかと、cnt で指定がないときの格納形式の2つを決めます(GENERIC→BSR、FX64→CSR、SXAT→SBLAS)。

本 MR では BSR / JAD 以外の実装本体は追加しません。MATRIXFORMAT を書かない既存の入力と -DARCH= を付けない既定ビルドの挙動は、!596 (merged) と完全に一致します。

背景

!596 (merged) で hecmwST_matrix は matvec と前処理の実装選択子(Iarray(36) / (37))を持ち、hecmw_solver_las_33 と hecmw_precond_SSOR_33 はその値で実装を選ぶ形になりました。ただし選択子に値を入れる手段がユーザ側にありません。!596 (merged) のバイナリで !SOLVER に何を書いても、選択子は fstr_mat_init が入れる既定値のまま固定されます。この状態のままでは、後続の NEC 実装・富岳実装を master に載せても誰も選べません。

本 MR は #572 の要求のうち次の 3 点に対応します。

  • cnt ファイルのパラメータで切り替えたい
  • プラットフォームにデフォルト値を入れる(-DARCH=FX64 など)。環境変数自動取得は行わず、ユーザが明示的に指定する
  • CMAKE のログファイルに、指定されたアーキテクチャを目立つように書出

変更内容

1. 格納形式で選択子に名前をつける(コミット 55db665e)

hecmw_matrix_misc.F90 の実装定数を HECMW_{MATVEC,PRECOND}_IMPL_{BSR,CSR,SBLAS} としました。選択子が選んでいるのは matvec と前処理が働くレイアウトであり、BSR は同じ制御ファイルの DUMPTYPE が既にその形式に使っている綴りです。アーキテクチャ名はマシンの名前として -DARCH= に残し、そこが既定とする形式を通じてこれらの定数に届きます。

各実装の中身と名前は突き合わせてあります。富岳版は item_i(NZIN+1)=3*j-2 のように自由度番号で L+D+U を1本に併合しており実体はスカラー CSR、NEC 版は COO を組んで sblas_create_matrix_handle_from_coo_rd に渡しています。

あわせて HECMW_{MATVEC,PRECOND}_IMPL_DEFAULT を置き、CMake が指定したコンパイル時既定値を受けます。hecmwST_matrix の初期化は 2 箇所(hecmw_mat_init と、fistr1 の主経路が通る fstr_mat_init)ありますが、プリプロセスを hecmw_matrix_misc.F90 に閉じ込めたので両 init は名前付き定数を参照するだけです。

2. !SOLVER の MATRIXFORMAT=(コミット 53ab6193)

if( fstr_ctrl_get_param_ex( ctrl, 'MATRIXFORMAT ','BSR,JAD,CSR,SBLAS ', 0, 'P', mtxfmt ) /= 0) return

候補列挙('P')の使い方は同じ関数の USEJAD / DUMPTYPE と同じで、一覧にない値は既存の仕組みでそのままエラーになります。

USEJAD を同じ一覧に取り込んでいます。 行列格納形式の指定がこれまで USEJAD の YES/NO だけだったところを一般化した形で、USEJAD=YES は MATRIXFORMAT=JAD の旧表記として引き続き動作します。両方を指定した場合は MATRIXFORMAT が優先されます。JAD は matvec のみを置き換えるため、MATRIXFORMAT=JAD では前処理は BSR の実装を使います。

MATRIXFORMAT は呼び出し前に 0 を置き、値が入ったときだけ選択子へ書く形にしました。書かなければ USEJAD とビルド時の既定値がそのまま残る、という意味をコード上で表すためです。同じ関数の LOGLEVEL が loglevel = -1 で「未指定」を表しているのと同じ形です。

3. CMake の ARCH と、それが何をビルドするか(コミット 7585a2dc)

if(ARCH STREQUAL "FX64")
  set(ARCH_DEFAULT_FORMAT CSR)
elseif(ARCH STREQUAL "SXAT")
  set(ARCH_DEFAULT_FORMAT SBLAS)
else()
  set(ARCH_DEFAULT_FORMAT BSR)
endif()
list(APPEND FrontISTR_DEFINITIONS "HECMW_ARCH_DEFAULT_MATVEC_IMPL=HECMW_MATVEC_IMPL_${ARCH_DEFAULT_FORMAT}")

マクロの値として整数ではなく Fortran 定数の名前を渡しています。整数を渡すと CMake 側が数値の対応表を持つことになり、Fortran 側の定数と二重管理になるためです。

環境変数やコンパイラ自動定義マクロ(__NEC__ 等)からの推定は行いません。一覧にない値は FATAL_ERROR で configure を止めます。

サマリは常に 1 行を出し、GENERIC 以外のときだけ枠で囲んだ注記を足します。

-- Target architecture    : FX64
--
-- ==========================================
--  Architecture-tuned build is ENABLED
--    ARCH = FX64
--    default MATRIXFORMAT = CSR
--  Implementations tuned for other
--  architectures are not built in.
--  !SOLVER, MATRIXFORMAT= picks among
--  the formats this build carries.
-- ==========================================

4. ビルドに無い形式へのフォールバック(コミット 493c1d0a、1c45cc3a)

!596 (merged) の select case には case default がなく、知らない選択値では何も呼ばずに戻る(Y が未定義のまま返る)状態でした。cnt から値が届くようになる本 MR で塞ぎます。

あるアーキ向けに書かれたコードが他のアーキでビルドできるとは限らないため、チューニング実装はそのアーキ向けにビルドしたときだけ組み込みます。したがって「指定された形式がこのビルドに無い」は正常な状態であり、エラーではなく BSR で実行し、実行時に一度だけ知らせます。書式は hecmw_precond_SAAMG.f90 の LAPACK 不在メッセージと同じく #### 接頭辞・rank 0 のみです。

#### MATRIXFORMAT: this build has no matvec for the selected format -- running the BSR implementation

入力の綴り誤りは cnt 側・CMake 側の両方で弾かれるため、case default に到達する経路は「この形式がこのビルドに無い」のみです。

確認したこと

  • 後方互換: ctest -L serial は 83 件中 83 件 PASS
  • cnt パラメータ: MATRIXFORMAT 未指定 / BSR / CSR / SBLAS / USEJAD=YES+MATRIXFORMAT=BSR の各ケースで、結果ファイルがバイト単位で一致します(いずれも BSR 経路、84 反復 6.039250E-09)
  • JAD: MATRIXFORMAT=JAD は USEJAD=YES と結果ファイルがバイト単位で一致し、BSR 経路とは残差履歴が異なります(84 反復 6.032325E-09)。JAD を実際に通っていることの裏付けです
  • 不正値: MATRIXFORMAT=NOSUCH は USEJAD=MAYBE と同一の終了コード・出力になり、既存の候補列挙パラメータと同じ扱いです
  • ビルド既定値: -DARCH=FX64 でビルドしたバイナリは cnt 無指定で CSR を選び(未提供のため通知を出して BSR で実行)、cnt に MATRIXFORMAT=BSR と書くとその通知が出ません
  • CMake: -DARCH 未指定 / GENERIC / FX64 / SXAT の 4 通りで configure が成功し、GENERIC 以外でのみ枠付きの注記が出ます。-DARCH=FOO は FATAL_ERROR で停止します
  • ビルド: 既定オプションでコンパイラの warning / error は 0 件、WITH_MPI=OFF でも既存の 1 種のみです

補足

  • ドキュメントは frontistr_documents の別 MR で対応します
  • ソース自体の出し分け(#ifdef なり CMake のソースリストなり)は、出し分ける対象のコードが入る MR3 / MR4 で行います。本 MR の時点では BSR / JAD 以外の実装本体が無く、除外すべきコードが存在しないためです
  • MATRIXFORMAT が前処理側で実際に効くのは現時点では SSOR のみです。PRECOND=10(BILU)等ではディスパッチャが無いため選択子が参照されず、通知も出ません。BILU への波及は実装が入る MR で行います
  • cnt の値は既存の候補列挙と同じく大文字小文字を区別しません(MATRIXFORMAT=csr も通ります)が、-DARCH= は完全一致です
  • tests/ 配下へのテストデータは追加していません。現時点では「CSR が BSR と同じ結果になる」ことしか検証できず、実装が入った時点で総和順序が変わり参照結果と合わなくなるためです
  • Makefile 経路(setup.sh)には ARCH 相当の指定手段がありません

Refs #572

Edited by Kanato Kono

Merge request reports

Loading
Loading