Open MPI 由来の報告を抑止する valgrind suppression ファイルを追加

概要

fistr1 をメモリ検査にかけると、報告の大半が Open MPI とその依存ライブラリに由来し、FrontISTR 自身が確保したブロックが埋もれる。これらを抑止する valgrind の suppression ファイルと、メモリ検査の実行手順を doc/valgrind/ に置いた。

tests/analysis/static/exA の A231 を valgrind --leak-check=full --show-leak-kinds=all で実行した結果は次のとおりである。確保時の最上位フレームが fistr1 の中にある記録だけが残り、definitely lost と indirectly lost と possibly lost はいずれも 0 になる。

実行 suppression なし suppression あり
逐次 293件(うち FrontISTR 自身 39件) 39件
MPI 2プロセス(ランク0) 298件(うち FrontISTR 自身 36件) 36件

抑止は、報告ごとに関数名の並びを登録するのではなく、確保元のライブラリを obj: で1フレームだけ指定し、その前後を ... で挟む書き方にした。ライブラリのバージョンが変わっても一致し、エントリ数も少なくて済む。valgrind は確保時のスタックに対して照合するので、確保時のスタックが fistr1 の中にとどまる FrontISTR 自身のブロックは、どのエントリにも一致しない。

ファイルは openmpi.supp(Open MPI 本体とその依存、プラグイン読み込み時の dlopen)と libgomp.supp(GCC の OpenMP ランタイム)に分けた。抑止の対象が入れ替わりうるためである。Open MPI 以外の MPI 実装ではライブラリ名が異なるので openmpi.supp は効かず、libgomp.supp だけを使うことになる。Intel コンパイラでビルドした場合の OpenMP ランタイムは libiomp5 なので、逆に libgomp.supp が効かない。valgrind は --suppressions を必要な数だけ受け取れるため、分けても利用者側の負担は増えない。

検証は CI のビルドイメージ ubuntu2404(Open MPI 4.1.6、valgrind 3.22.0)で行った。他のビルドイメージや MPICH 環境では確認していない。

Close #871 (closed)

変更内容

コミット 要約
b6c39c09 doc: add valgrind suppressions for the libraries FrontISTR does not control 抑止対象ごとの suppression ファイルとメモリ検査の実行手順を doc/valgrind/ に追加

Merge request reports

Loading
Loading