MPI:点对点阻止(MPI_Send& MPI_Recv)

时间:2017-05-31 23:17:10

标签: 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;

这将被阻止,因为MPI_Recv是阻止功能,但是当我改变命令以调用MPI_Send时,一切都顺利,我不知道原因。 提前致谢,对不起我的英语。

1 个答案:

答案 0 :(得分:2)

MPI_Send()阻塞,直到可以重用发送缓冲区。

从实用的角度来看,如果消息足够短,MPI_Send()立即返回,否则,阻塞直到匹配的MPI_Recv()被发布。 这是一般行为,但你不应该依赖它。

在这种情况下,您最好的选择是使用一个MPI_Sendrecv()来代替两个阻止发送/接收来电

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