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 制約を壊さないことが要件になる。