0

次の単純な MPI プログラムのバグを修正するのを手伝ってくれませんか。MPI_Sendrecv を使用して "c" 値をランク 1 から 2 に送信しようとしたところ、ランク 2 から出力されました。しかし、次のコードはデッドロックで終了します。間違いは何ですか、MPI_Sendrecv を正しく使用する方法 (この状況で)

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

int main (int argc, char **argv)
{
        int size, rank;
        MPI_Init(&argc,&argv);
        MPI_Comm_size(MPI_COMM_WORLD,&size);
        MPI_Comm_rank(MPI_COMM_WORLD,&rank);
        printf("Hi dear, I am printing from rank %d\n",rank);

        double a, b, c;
        MPI_Status status, status2;

        if (rank == 0)
        {
                a = 10.1;
                MPI_Send(&a,1,MPI_DOUBLE,1,99,MPI_COMM_WORLD);
        }
        if (rank == 1)
        {
                b = 20.1;
                MPI_Recv(&a,1,MPI_DOUBLE,0,99,MPI_COMM_WORLD,&status);
                c = a + b;
                printf("\nThe value of c is %f \n",c);
        }
        MPI_Sendrecv(&c,1,MPI_DOUBLE,2,100,
                     &c,1,MPI_DOUBLE,1,100,MPI_COMM_WORLD,&status2);

        MPI_Barrier(MPI_COMM_WORLD);
        if(rank == 2)
        {
               printf("\n Printing from rank %d, c is %f\n",rank, c);
        }


        MPI_Finalize();
        return 0;
4

1 に答える 1

0

プロセスが MPI_Sendrecv を呼び出すと、常に送信部分と受信部分の両方を実行しようとします。たとえば、プロセス 2 の場合、 (4 番目の引数) を参照せdest、「2」を見て、「ああ、送信を行う必要はありません。受信だけを行います」と考えます。代わりに、プロセス 2 は「2」を見て、「ああ、自分に何か送信しなければならない」と考えます。さらに、このコードを書いていると、すべてのプロセスが を見てMPI_SendRecv、「プロセス 2 (第 4 引数) に何かを送信し、プロセス 1 (第 9 引数) から何かを受信する必要がある」と考えます。問題は、プロセス 1 が何も送信するコマンドを取得していないことです。

MPI_Sendrecvは非常に便利な機能です。私はいつもそれの用途を見つけています。ただし、「チェーン」で送信することを目的としています。たとえば、0 は 1 に送信し、1は2に送信し、 2は 0 に送信します。この場合、通常の MPI_Send と MPI_Recv を使用したほうがよいと思います。

于 2013-06-07T17:09:42.967 に答える