0

ランダムに生成されたn個の要素に対して奇数/偶数の比較分割操作を実行するプログラムのMPIバージョンを作成しようとしています。

プロセス0は要素を生成し、それらのnlocalを他のプロセスに送信する必要があります(最初のnlocalをそれ自体のために保持します)。ここから、プロセス0は、CompareSplitアルゴリズムを実行した後の結果を出力する必要があります。次に、アルゴリズムの他のプロセス実行から結果を受け取ります。最後に、受け取ったばかりの結果を印刷します。

私はこれの大部分をすでに行っていますが、修正できないように見えるデッドロックが発生しています。人々が私に与えることができるどんなヒントでも大いに感謝します。

これが私のコードですhttp://pastie.org/3742474

今のところ、デッドロックはSend / Recvの134行目と151行目から来ていると確信しています。タグパラメータにmyrankではなく「tag」を使用するようにSendを変更しようとしましたが、それを行ったときは何らかの理由で「MPI_ERR_TAG:無効なタグ」を取得し続けます。

もちろん、0より大きいプロセッサ内でもアルゴリズムを実行しますが、何が問題になっているのかがわかるまで、今のところその部分を削除しました。

どんな助けでも大歓迎です。

編集: CompareSplit操作を含まない、より小さなテストケースを作成しましたが、それでもデッドロックが発生しています。http://pastie.org/3744691

83行目のタグを「myrank」から「tag」に変更して、上記のテストケースを修正しました。テストケースは機能しますが、実際のアルゴリズムが私のプログラムのように追加されると、デッドロックが発生します。

したがって、デッドロックをこのコードのチャンクに絞り込んだと思います。それは他の下のSendrecvであるように見えます。

for (i = 1; i <= npes; i++) {
    if (i % 2 == 1) // odd phase
      MPI_Sendrecv(elmnts, nlocal, MPI_INT, oddrank, 1, relmnts,
                           nlocal, MPI_INT, oddrank, 1, MPI_COMM_WORLD, &status);
    else
      MPI_Sendrecv(elmnts, nlocal, MPI_INT, evenrank, 1, relmnts,
                           nlocal, MPI_INT, evenrank, 1, MPI_COMM_WORLD, &status);

    CompareSplit(nlocal, elmnts, relmnts, wspace,
                 myrank < status.MPI_SOURCE);
}
4

2 に答える 2

1

タグ エラーは、タグが 1 から実装依存の最大値 (少なくとも 32k であることが保証されている) の範囲の正の整数でなければならないためです。

デッドロックは非常に理解しやすいものです。ランクゼロ以外のプロセスが何をしているかを見てください。

  else {
    // The rest of the processes
    // Receive nlocal randomly generated elements from process 0
    MPI_Recv(elmnts, nlocal, MPI_INT, 0, tag, comm, &status);

    qsort(elmnts, nlocal, sizeof(int), IncOrder); // does it matter where we sort at?

    // Send results back to process 0
    MPI_Send(elmnts, nlocal, MPI_INT, 0, myrank, comm);
  }

したがって、彼らは 1 回の受信と 1 回の送信を行っています。しかし、プロセッサ 0 はこれ以上のことを行っています。全員にデータを送信し、プロセス 1 (偶数ランク) と MPI_NULL_PROC (奇数ランク) に対して一連の送受信を実行します。しかし、evenrank への送受信は失敗であり、プロセス 1 への送受信は、プロセス 1 が同じことを行っていないため、決して応答されません。

if (rank == 0)アルゴリズムのその部分をテストの外に移動する必要があると思います。

于 2012-04-07T15:26:09.477 に答える
0

[113行目] に電話をかけているようですが、それに答えるランクMPI_Sendrecvのプロセスがありません。oddrankoddrank eq -1

于 2012-04-07T05:23:37.493 に答える