ランダムに生成された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);
}