MPI:点对点阻塞(MPI_发送和MPI_接收)

MPI:点对点阻塞(MPI_发送和MPI_接收),mpi,Mpi,我对MPI点对点阻塞模式有点困惑。 现在我有了以下代码。 y = id; j = id - 1; if(j<0) j = p -1; k = id + 1; if(k>p-1) k = 0; MPI_Recv(&x, 1, MPI_INT, k, 0, MPI_COMM_WORLD, &status); MPI_Send(&y, 1, MPI_INT, j, 0, MPI_COMM_WORLD); z = x + y; y=id; j=id-1; 如果

我对MPI点对点阻塞模式有点困惑。
现在我有了以下代码。

y = id;
j = id - 1;
if(j<0) j = p -1;

k = id + 1;
if(k>p-1) k = 0;

MPI_Recv(&x, 1, MPI_INT, k, 0, MPI_COMM_WORLD, &status);
MPI_Send(&y, 1, MPI_INT, j, 0, MPI_COMM_WORLD);

z = x + y;
y=id;
j=id-1;
如果(jp-1)k=0;
MPI_Recv(&x,1,MPI_INT,k,0,MPI_COMM_WORLD,&status);
MPI_发送(&y,1,MPI_INT,j,0,MPI_COMM_WORLD);
z=x+y;
这将被阻止,因为MPI_Recv是一个阻止函数,但当我更改顺序以首先调用MPI_Send时,一切正常,我不知道原因。
提前谢谢,我的英语很抱歉

MPI\u Send()
阻塞,直到可以重用发送缓冲区

从实用的角度来看,如果消息足够短,
MPI\u Send()
会立即返回,否则会阻塞,直到发布匹配的
MPI\u Recv()
。 这是一种普遍的行为,但你不应该依赖它

在这种情况下,最好的选择是使用一个
MPI\u Sendrecv()
调用,而不是两个阻塞的send/recv调用

另一个选择是
MPI_Irecv();MPI_Send();MPI_Wait()

MPI\u Send()
阻塞,直到可以重用发送缓冲区

从实用的角度来看,如果消息足够短,
MPI\u Send()
会立即返回,否则会阻塞,直到发布匹配的
MPI\u Recv()
。 这是一种普遍的行为,但你不应该依赖它

在这种情况下,最好的选择是使用一个
MPI\u Sendrecv()
调用,而不是两个阻塞的send/recv调用

另一个选择是
MPI_Irecv();MPI_Send();MPI_Wait()

好了,现在为什么当我更改顺序并且MPI\u Send可以立即返回时,程序会正常执行而不被阻止如果您
MPI\u Recv()
首先,您的程序将永远挂起。如果您先
MPI\u Send()
,并且消息足够短,则消息将被发送,匹配的
MPI\u Recv()
将完成。有意义吗?好吧,现在为什么当我更改顺序时程序会正常执行而不被阻止,并且MPI_Send可以立即返回如果您首先
MPI_Recv()
,您的程序将永远挂起。如果您先
MPI\u Send()
,并且消息足够短,则消息将被发送,匹配的
MPI\u Recv()
将完成。有道理吗?