2

を使用して多くのメッセージを送信する予定MPI_Isendですが、受信するまでデータを安全に保つ方法がわかりません。同時に、使用可能なメモリをすべて使い切らないようにします。

現在、私は次のようなことをしています:

vector<int*> outbox;
vector<MPI_Request> stats;

void run()
{
   while (!done()) 
   {
       //some magic
       //...

       sendMsg(rand(), getRecipRank());
  }
}

void sendMsg(int n, int recipRank)
{
    //Need to gen n random integers and send it to proc with rank recipRank
    //Can't block until the numbers are reveived. 
    //So how do I make sure these numbers are safe until then?


    int* data = (int*)malloc(sizeof(int) * n);
    //fill the data array with random numbers here

    MPI_Request req;
    MPI_Isend(data, n, MPI_INT, recipRank, 0, MPI_COMM_WORLD, &req);

    //Keeping the pointer to the array to free it later
    outbox.push_back(data); //Does this help keep the data safe until they're received?
    stats.push_back(req);
}

stats次に、時々ベクトルを通過して送信のステータスを確認する別の関数があります。完了すると、関数はリクエストと対応する配列の両方を解放しoutboxます。

少数のメッセージでこれをテストしましたが、うまくいくように見えますが、常にうまくいくのか、それとも運が良かっただけなのかはわかりません。

4

2 に答える 2

2

いいね!誰も使用してメモリを割り当てるmallocと、それを台無しにすることはありませんが、あなた. いじらないので安心です。

これは、より多くのメモリを使用して計算と通信をインターリーブするのに適したパターンです。メモリ使用量を制限したい場合は、ベクターの最大長を設定し、outboxその長さに達したときに送信のブロックを使用し始めることができます。

明確にするために: データは「安全」ではありません。データを vector にプッシュするためoutbox、それを行わなくても安全です。後で解放できるように、それをベクターにプッシュします。

于 2016-10-20T15:13:28.013 に答える
0

これは問題なく動作しますが、 C- に頼る必要さえありませんmalloc

次のような C++ コンストラクトを安全に使用できます。

  • new[]のポインタstd::vector<int*>
  • std::vector<std::unique_ptr<int[]>>(私はあなたの状況でそれを好むだろう)
  • std::vector::data()ベクトルのベクトル。ただし、そのためには、リクエストが完了するまで、呼び出されるメモリを提供するベクトルで非 const メソッドを呼び出さないようにしてください。

使用するのは安全ではありませんstd::vector<int[10]> outbox。またはstd::vector<std::array<int, 10>> outbox、このメモリが outbox ベクトル内で直接参照されるため、さらに を呼び出すと再割り当て (サイズ変更) される可能性がありますpush_back。しかし、それは compile-time-known にとってのみ重要ですnstd::vector<std::unique_ptr<std::array<int, 10>>>またいいでしょう。

于 2016-10-20T18:08:53.373 に答える