Boost.MPI を使うときに知っておきたいこと

BOOST_MPI_HOMOGENIUS を定義してシリアライズを高速化

クラスター内の CPU が全部同じアーキテクチャであれば、コンパイル時に

-DBOOST_MPI_HOMOGENIUS

オプションを付け加えてコンパイルすると MPI_PACK, MPI_UNPACK しないでバイナリイメージのまま送ってくれるので速くなる。

非プリミティブ型の Isend に注意

Boost.MPI で複雑な型のオブジェクトを送るときには Boost.Serialization でバイナリ列にシリアライズしてから送られるようになっています。

これが何を意味するかというと、Boost::Isend というのは実はシリアライズ後のバイナリ列のサイズしか相手に送らなくて、Boost::Wait* を呼び出して Isend が終わったのを確認した後でシリアライズしたバイナリ列を送り始めます。

これを忘れているとデッドロックしたりします。

全体的な感想

デバッグ中に Boost.MPI のソースを覗いたんだが、かなりがんばっているなぁ。
メタプログラミングを駆使して Send/Recv したりする変数の型を調べ、
プリミティブ型ならそのまま MPI_Send/Recv に流し込む実装なので、
複雑な型の変数を送らなければ生MPIと比べてもオーバーヘッドゼロなのが良い。