Boost.MPI は実際 MPI_Allgatherv や MPI_Scatterv をサポートできてない

Tutorial - 1.53.0

Boost.MPI ドキュメントの "Table 19.5. Collectives" を見てもらえると分かりますが, Boost.MPI では MPI_Allgatherv といった collectives はそれぞれ非 v な collectives でサポートされているかのように書かれています.

ちなみに MPI_Allgatherv といった collectives に v が付いたものは, 各ランクに送受信するデータをランクごとに可変にすることを許可した API です.

boost::mpi::allgather を使って頂ければ分かると思いますが, 実際には意図した通りには動かず, SEGV で落ちると思います. そもそも, Boost.MPI では allgather に MPI_Allgather を使用しているため, MPI_Allgatherv のようにランクごとに可変長のデータは渡せないはずなのです.

それもあって, Boost.MPI には gatherv, scatterv を用意するチケットが Boost 1.45.0 から投げられています.

boost::mpi::scatterv and boost::mpi::gatherv added : https://svn.boost.org/trac/boost/ticket/5292

チケットを発行した Júlio Hoffimann 曰く, 「どうも実装が Douglas Gregor には気に入られてないないようだ」とのこと.

なのでランクごとに計算するサイズが違う場合 (僕が体験した中ではほとんどがそうですが), isend, irecv を使って上手いこと実装するか, 実装してパッチを投げるかをしないと駄目ですね.