パーティショナの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つが重なるとコンパイルエラーとして顕在化する。

  1. idx_t が int と別型になる構成
  2. 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 分岐に踏み込まない

関連

Edited by Kanato Kono