任何人都可以帮我修复以下简单的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;
答案 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。