1

2つの一致する非ブロッキング送信および受信操作から1つの要求オブジェクトのみをチェックするだけで十分ですか。

これは私のプログラムでリクエストオブジェクトを処理する労力を減らすので素晴らしいでしょう。

ブーストmpiの小さな例を次に示します。

#include <boost/mpi.hpp>

int main(int argc, char* argv[]) {
    // initialize mpi

    mpi::environment env(argc, argv);
    boost::mpi::communicator world;
    boost::mpi::request req0, req1;
    double blub;
    if(world.rank()==1)
       req1 = world.irecv(0, 23, blub);
    if(world.rank()==0)
       req0 = world.isend(0, 23, blub);

    //now I want to synchronize the processors is this enough?
    req0.wait();
    //or do I also need this line
    req1.wait();

}
4

1 に答える 1

5

ランク1には有効ながありreq0ません。ランク0には有効なreq1;がありません。これらは、非ブロッキング操作を実際に実行した(そしてリクエストへのハンドルを返した)タスクでのみ有効なリクエストです。

したがって、どちらのランクも、両方の要求に対して待機を呼び出す必要はありません(または呼び出すこともできません)。それぞれが持っている要求に対して待機を呼び出します。

if(world.rank()==0)
    req0.wait();
if(world.rank()==1)
    req1.wait();

または、より良い(ランク0のisendは0ではなくランク1に行くべきだと思います):

boost::mpi::request req;
...
if(world.rank()==1)
   req = world.irecv(0, 23, blub);
if(world.rank()==0)
   req = world.isend(1, 23, blub);

if (world.rank() == 0 || world.rank() == 1)
   req.wait();

複数のリクエストに対応する複数の操作を待つ必要がある場合は、リクエストのリストを作成して、 wait_allを呼び出すことができます。

于 2012-05-30T13:28:37.843 に答える