3

私は次の課題で宿題をしています:

すべてのプロセスは、入力として double を取ります。function MPI_Sendrecv_replace()swap all doubles を使用して、反対のランクのプロセス (最初と最後、2 番目と最後から 1 つ後、...) を使用します。すべてのプロセスで受信した数を出力します。

だからここに私が書いたコードがあります。

#include "mpi.h"
#include <stdio.h>
#include "pt4.h"

int main(int argc, char *argv[])
{
    MPI_Init(&argc,&argv);
    int flag;
    MPI_Initialized(&flag);
    if (flag == 0)
        return;
    int rank, size;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    double n;
    pt >> n; // pt is a stream provided by side library (works perfectly fine)

    int oppositeRank = (size - 1) - rank;

    if (rank != oppositeRank)
    {
        MPI_Status status;
        MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
                             rank, 0, MPI_COMM_WORLD, &status);
    }

    pt << n;
    MPI_Finalize();
    return 0;
}

このコードは問題なくコンパイルされますが、停止することはありません。それで、問題はなぜですか?私は何を間違っていますか?

4

1 に答える 1

8

これを置き換えます:

        MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
                         rank, 0, MPI_COMM_WORLD, &status);

これとともに:

        MPI_Sendrecv_replace(&n, 1, MPI_DOUBLE, oppositeRank, 0, 
                         oppositeRank, 0, MPI_COMM_WORLD, &status);

このドキュメント ページが役立つ場合があります。

この関数は、バッファをプロセッサに送信し ( dest、または第 4 引数)、別のプロセッサから受信します ( source、第 6 引数)。スワップを行うには、別のランクに送信し、同じランクから受信します。あなたの場合、反対のランクに送信し、自分から受信していましたが、これは決して来ないため、デッドロックが発生しました。

于 2013-09-18T07:10:35.873 に答える