0

谁能帮我修复以下简单 MPI 程序中的错误。我试图使用 MPI_Sendrecv 将“c”值从 rank 1 发送到 2,然后他们从 rank 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,它不会查看dest(第四个参数),看到“2”并认为,“哦,我不必进行任何发送。我只需进行接收。” 相反,进程 2 将看到“2”并认为,“啊,我必须给自己发送一些东西。” 此外,当您编写此代码时,所有进程都看到MPI_SendRecv并认为,“哦。我必须向进程 2(第四个参数)发送一些东西,并从进程 1(第九个参数)接收一些东西。所以我们开始...... .” 问题是进程 1 没有收到发送任何东西的命令,所以每个人,甚至进程 1,

MPI_Sendrecv是一个非常有用的功能。我一直在寻找它的用途。但它旨在以“链”形式发送。例如,0 发送给 1 ,而1 发送给 2 ,而2 发送给 0 等等。我认为在这种情况下,您最好使用通常的 MPI_Send 和 MPI_Recv。

于 2013-06-07T17:09:42.967 回答