パーティショナの64bit索引化が要素ベース分割経路とグラフユーティリティで未完了
現象
-DWITH_METIS=OFF でビルドすると、GCC 14 以降で hecmw_part1 のコンパイルが失敗する。
- エラー8件、すべて
-Wincompatible-pointer-types - 箇所は
hecmw1/tools/partitioner/hecmw_partition.cの3か所
| 箇所 | 関数 | 件数 | 内容 |
|---|---|---|---|
:2703 |
metis_partition_nb_contact_agg |
2 | idx_t * を HECMW_graph_init_with_arrays の int * に渡す |
:3011 |
metis_partition_eb |
3 | int * を pmetis_interface の idx_t * に渡す |
:3018 |
metis_partition_eb |
3 | int * を kmetis_interface の idx_t * に渡す |
原因
#733 (closed) / !509 (merged)(9e6a913d、実体は 1ea26714)で導入した idx_t 化が未完了である。
- 対応済み: ノードベース(NODE-BASED)の接触分割経路
- 未対応: 要素ベース(ELEMENT-BASED)分割経路(
:3011/:3018) - 未対応: グラフユーティリティ
hecmw_graph(:2703)
つまり「METIS 無しでビルドできない」問題ではなく、64bit索引化の未完了である。
発生条件
次の2つが重なるとコンパイルエラーとして顕在化する。
idx_tがintと別型になる構成- GCC 14 以降(当該診断が既定でエラーに格上げされた)
| 構成 | idx_t の実体 |
影響 |
|---|---|---|
| METIS 無し | long long |
あり |
METIS 有り・IDXTYPEWIDTH 32(既定) |
int32_t(= int) |
なし |
METIS 有り・IDXTYPEWIDTH 64 |
int64_t |
あり |
既定構成で通るのは idx_t が int と同一型になり、食い違いが偶然消えているためである。
警告に留まる環境のほうが危険
「GCC 13 以前では通っていた」ことは本件が軽微であることを意味しない。
:2703の呼び出しには METIS のガードが無い- NODE-BASED かつ接触ペアあり・
CONTACT=AGGREGATEなら METIS の有無によらず実行される - 64bit の
node_graph_indexをint *として読むため、graph->m_num_edge = edge_index[num_vertex]を はじめグラフ全体が誤った値になる
すなわち64bit索引構成では、警告を無視して通したビルドは黙って誤った分割結果を出しうる。
再現手順
FrontISTR master(bb0b7bed)を次の構成でビルドする。
cmake -S <src> -B build_nometis \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpic++ -DCMAKE_Fortran_COMPILER=mpifort \
-DWITH_METIS=OFF -DWITH_MPI=ON -DWITH_OPENMP=ON \
-DWITH_LAPACK=ON -DWITH_NETCDF=ON -DWITH_TOOLS=ON
cmake --build build_nometisコンパイラは GCC 16.1.0(Homebrew, macOS arm64)。hecmw_part1 で error 8件・warning 0件となる。
補足
- CI に GCC +
WITH_METIS=OFFの構成を1件加えると再発を検出できる。 現状この構成は NVIDIA コンパイラでしか通しておらず、64bit索引経路が型検査されていない :3011/:3018のpmetis_interface/kmetis_interfaceは #571 (closed)(METIS v4 ラッパー削除)の 対象と同じ関数だが、本件では v4 分岐に踏み込まない
関連
- #733 (closed)「パーティショナーの32bit整数上限超え対応」(closed, milestone 5.9)
- !509 (merged) / 9e6a913d / 1ea26714
- #571 (closed)「METIS v4.0 のラッパー削除されているか確認する」(open)
Edited by Kanato Kono