我对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时,一切都顺利,我不知道原因。
提前致谢,对不起我的英语。
答案 0 :(得分:2)
MPI_Send()
阻塞,直到可以重用发送缓冲区。
从实用的角度来看,如果消息足够短,MPI_Send()
立即返回,否则,阻塞直到匹配的MPI_Recv()
被发布。
这是一般行为,但你不应该依赖它。
在这种情况下,您最好的选择是使用一个MPI_Sendrecv()
来代替两个阻止发送/接收来电
另一种选择是
MPI_Irecv(); MPI_Send(); MPI_Wait();