hecmw_allreduce_R_comm/I_comm の自動配列バッファが大きいベクトルでスタック溢れする
現象
生コミュニケータ版の集団通信ラッパー hecmw_allreduce_R_comm / hecmw_allreduce_I_comm
(hecmw1/src/solver/communication/hecmw_comm_f.F90)は、縮約結果の受けバッファを
自動配列 VALM(n) で確保している。自動配列をスタックに置く処理系(ifx、NVHPC の
-Mstack_arrays)では、ベクトル全長など大きい n の呼び出しで既定のスタック上限
(本環境 16 MB)を超えて SIGSEGV する。実測では 300 万自由度の全長ベクトル
allreduce(24 MB)で再現し、回避には全ランクでの ulimit -s unlimited が必要
だった。gfortran は大きい自動配列をヒープに置くため顕在化しない(潜在)。
原因と経緯
この自動配列は意図的な選択である。導入コミット a4845b31([SA-AMG] implement
smoothed aggregation AMG preconditioner)の時点からコード内コメントに理由が
明記されている: allocatable にすると NVHPC -gpu=mem:managed 下で managed
memory 扱いとなり、CUDA-aware MPI(HPC-X UCC)の src/dst メモリ種別非対称
エラーを踏むため(同種のメモリ種別問題への対処は cb1e7dc8「Resolve TL_UCX
asym memory type error」にもある)。つまり GPU 制約への対処がスタック溢れの
芽になっており、修正はこの GPU 制約を壊さないことが要件になる。