MPI_Sendrecv死锁

时间:2013-06-07 12:29:18

标签: mpi deadlock

任何人都可以帮我修复以下简单的MPI编程中的错误。我试图使用MPI_Sendrecv将等级1的“c”值发送到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;

1 个答案:

答案 0 :(得分:0)

当进程调用MPI_Sendrecv时,总是尝试执行 发送和接收部分。例如,如果它是进程2,它将查看dest(第四个参数),看到“2”并且想,“哦,我不必做任何发送。我只会收到。“顺便说一下,进程2会看到“2”,然后想,“啊,我必须给自己发一些东西。”此外,正如您编写此代码一样,所有进程都会看到MPI_SendRecv并思考,“哦。我必须向进程2(第四个参数)发送内容并从进程1接收内容(第九个参数)。所以我们走了......“问题是进程1没有得到发送任何东西的命令,所以每个人,甚至进程1,都在等待进程1发送内容。

MPI_Sendrecv是一个非常有用的功能。我总是找到它的用途。但它旨在发送“链”。例如,0发送到1 ,而 1发送到2 ,而 2发送到0或其他。我认为在这种情况下你最好使用通常的MPI_Send和MPI_Recv。