vector<int> master(100);
vector<reference_wrapper<int>> sub = master(&master[10], &master[20]);
boost::mpi::irecv(source, tag, sub);
上記はベクトルのサブセットを受信および更新するのに有効で機能的ですか?
そうでない場合、recv と copy 以外に同等の代替手段はありますか?
コンパイラが喜んで教えてくれるので、あなたのコードは無効です。のようなコンストラクタはありませんstd::vector<std::reference_wrapper<int>>
。またreference_wrapper
、この方法では魔法のようには機能しません。
この場合、これを使用することをお勧めしますboost::iterator_range
が、シリアル化はサポートされていません。そのため、シリアライゼーションをサポートする独自の範囲アダプターを構築する以外に、手動で行う必要があります。これは、配列のオーバーロードを使用することで幸いなことに非常に簡単です。
comm.irecv(source, tag, &master[10], 10);
これは、連続したストレージを使用するstd::vector
ことが保証されているため機能します。また、データを配列形式で送信する必要があることに注意してください。より小さい 10 要素のベクトルを送信しないでください。