A64FX(富士通コンパイラ、-Nquickdbg)で 31 件のテストが実行時エラーになる

現象

A64FX(富士通コンパイラ)で -Nquickdbg を付けてビルドし、全 432 件のテストを実行すると、31 件(7%)が失敗する。 master dd7e2a08 で同じ 31 件の失敗を確認している。

失敗の仕方は 2 種類である。

  • SIGSEGV による異常終了(30 件)
  • 参照解との不一致(1 件、lib/physics/Elastoplastic)

いずれも未定義の値を使っていることによる。-Nquickdbg は未定義の領域を不正なパターンで埋め、その参照を検出する。 x86 + gfortran では未定義の領域がたまたま無害な値になるため表面化せず、CI では落ちない。

環境

  • A64FX(Wisteria/BDEC-01)、富士通コンパイラ tcsds-1.2.43、Open MPI 4.0.1
  • ビルドオプション: -p --with-tools --with-metis --with-mumps --with-lapack --with-ml --with-netcdf、これに -Nquickdbg を追加
  • 実行: ctest(serial / mpi / openmp / hybrid の全 432 件)

失敗するテスト

テスト 並列方式 件数 失敗の仕方
lib/physics/Elastoplastic serial・mpi・openmp 3 参照解との不一致(mohr_simple_shear の応力)
lib/physics/Elastoplastic hybrid 1 SIGSEGV
analysis/heat/exN・exO・exP・exQ・exR・exS・exU openmp・hybrid 14 SIGSEGV
analysis/interaction/contact_alag_tied_iter openmp・hybrid 2 SIGSEGV
analysis/interaction/contact_slag_tied_iter openmp・hybrid 2 SIGSEGV
analysis/interaction/contact_s2s_mortar_fric hybrid 1 SIGSEGV
analysis/interaction/contact_slag_mpc_elim_iter hybrid 1 SIGSEGV
analysis/static/mpc_elim_iter hybrid 1 SIGSEGV
analysis/dynamic/mpc hybrid 1 SIGSEGV
with_mumps/contact_slag_mpc_elim_mumps hybrid 1 SIGSEGV
with_mumps/mpc_elim_mumps hybrid 1 SIGSEGV
lib/static_LIB_1d openmp・hybrid 2 SIGSEGV
lib/static_LIB_Fbar openmp 1 SIGSEGV

serial と mpi で失敗するのは lib/physics/Elastoplastic だけで、残りはすべて OpenMP を使う構成である。

原因

富士通ランタイムのトレースバックから特定できた箇所は次のとおりである。

箇所 内容 該当テスト 状態
fistr1/src/lib/static_LIB_Fbar.f90 113・447 微小変形の分岐では Jratio を設定しないまま Jratio(1:8) = c*Jratio(1:8) を実行する。微小変形では Jratio を使わないため、読んだ値はどこにも影響しない tied 接触、lib/static_LIB_Fbar 原因特定済み。1 行の修正で済み、数値は変わらない
fistr1/src/lib/heat_LIB_CONDUCTIVITY.f90 198-200 呼び出し元が 3 節点シェル(731)に nn = 4 を渡すため、heat_conductivity_shell_731 が埋めていない 4 列目の ecoord を読む。直後に COD(:,nn) = COD(:,nn-1) で上書きされるため、読んだ値は使われない analysis/heat/ex* 原因特定済み。1 行の修正で済み、数値は変わらない
fistr1/src/lib/physics/calMatMatrix.f90 354・360 GetConnectorProperty が STF_DASHPOT_D から呼ばれた直後に落ちる。gauss%pMaterial%variables_i(...) の参照が疑わしい lib/static_LIB_1d 未確定
fistr1/src/analysis/interaction/fstr_contact_search.f90 42 is_known_master_in_segment の contact%master(known_masters(k)) の添字が不正。get_unique_map が states(i)%surface をそのまま使っており、この成分が未定義になる場合がありそうである contact_s2s_mortar_fric 未確定
hecmw1/src/solver/las/hecmw_solver_las_33.F90 506 hecmw_ttvec_33 で、MPC の mpc_item・mpc_dof から作る添字 jj が Y の範囲外になる mpc_elim_mumps、hybrid の lib/physics/Elastoplastic 未確定
fistr1/src/lib/heat_LIB_DFLUX.f90 1317 heat_dflux_352 が XX(NOD(I)) を I = 1, 8 で読む。面の節点数より大きいループ長で NOD の未設定要素を添字に使っていると思われる analysis/heat/exU 未確定
fistr1/src/lib/utilities/utilities.f90 deriv_general_iso_tensor_func_3d 主値が互いに異なる分岐で dydx を初期化せずに足し込む。呼び出し元の calElastoPlasticMatrix_MC が直前に弾性行列を入れているため、-Nquickdbg では接線剛性が壊れ、mohr_simple_shear の応力が 1e-3 程度ずれる lib/physics/Elastoplastic 原因特定済み。直すと Mohr-Coulomb の数値が変わるため、扱いの判断が要る

このほかに、トレースバックが出ない SIGSEGV がある(analysis/heat/ex* の大半、mpc_elim 系、analysis/dynamic/mpc、hybrid の lib/static_LIB_1d)。 富士通ランタイムが異常終了の処理中にさらに失敗しており(jwe0020i)、発生箇所が分からない。 1 プロセス・1 スレッドでの再実行が必要である。

#567 (closed) の修正(MR !664 (merged))との関係

master では、上の 31 件のうち 6 件が、MR !664 (merged) が直した次の 3 か所で落ちている(1 つのテストが複数のケースを実行するため、発生回数は計 13 回である)。

master での SIGSEGV の箇所 回数
hecmw1/src/solver/matrix/hecmw_local_matrix.f90 1508(convert_rowID_to_remote_localID) 7
fistr1/src/analysis/static/make_result.f90 1879(省略された expflag の参照) 5
fistr1/src/lib/static_LIB_1d.f90 549(STF_SPRING_A の stiff を入口で読む) 1

MR !664 (merged) を当てると、この 3 か所では落ちなくなり、同じテストがより先まで進んだうえで、上の表の箇所で落ちる。 31 件の失敗自体は MR !664 (merged) の前後で変わらない。

#896 (closed) との関係

#896 (closed) は仮引数の intent の誤りを対象としており、全ソースの走査で検出できる。 本 issue の問題は、局所変数・派生型の成分・配列の添字が未定義のまま使われるもので、同じ系統だが走査の対象外である。

確認に使った実行

対象 実行 結果
master 2d99c9f2 に #567 (closed) の修正(MR !664 (merged) のリベース前)を当てたもの 全 432 件 31 件が失敗
master dd7e2a08 上の 31 件を含む 37 件 同じ 31 件が失敗

どちらも同じビルド設定(-Nquickdbg あり)である。