#include <iostream>
#include <boost/mpi.hpp>
#include <boost/serialization/string.hpp>
using namespace std;
int main( int argc, char* argv[] )
{
boost::mpi::environment env(argc, argv); // MPI_Init 的なもの
boost::mpi::communicator world; // MPI_COMM_WORLD 的なもの
if( (world.rank()&1) == 0 )
{
// MPI_Send 的なもの
// 偶数番プロセスから奇数番プロセスにメッセージ送信
// stringのようなオブジェクトでも、Boost.Serialization でシリアライズされて通信されます
world.send( world.rank()^1, 0, string("Hello") );
}
else
{
// MPI_Recv 的なもの
// 奇数番プロセスではメッセージ受信
string msg;
world.recv( world.rank()^1, 0, msg );
cout << msg << " @ " << world.rank() << endl;
}
}
> mpirun -localonly 8 sample.exe Hello @ 7 Hello @ 5 Hello @ 1 Hello @ 3
並列計算用のメッセージ通信インターフェイス MPI を C++ でラップしたライブラリです。 使用するためには、具体的な MPI の実装 (MPICH や OpenMPI など)が別途必要です。 MPICH2 では手元の環境ではうまく動かず…。
サンプルを見ていただければわかるように、非常に素直なラッパーになっているので、 MPI を使ったことのある方ならすぐ慣れることができると思います。
Boost.MPI は Boost のデフォルトのビルド方法ではビルドされません。 手順の概略を Boost.MPI Getting Started から抜粋します。
0. なにか MPI の実装をインストール
1. tools/build/v2/user-config.jam を編集して
using mpi ;
と1行追加。ただし、mpicc コマンドがないMPI実装の場合これだけではビルドできないので、 代わりに明示的に
using mpi : : <find-shared-library>mpich <find-shared-library>mpe ;
などのようにリンクするライブラリ名を指定する必要があるそうです。
3. 以下のように --with-mpi をつけて Boost をビルド
bjam --toolset=msvc link=shared,static release debug stage --with-mpi
これでビルド完了です。