MPI_Isend之后需要MPI_Wait吗?

4
例如,
if (rank == 0) {
    MPI_Isend(&sendbuf, ..., 1, ..., &request);
    MPI_Wait(&request, ...);  /* Is this wait necessary? */
} else if (rank == 1) {
    MPI_Irecv(&recvbuf, ..., 0, ..., &request);
    MPI_Wait(&request, ...);
}

在理论上,MPI_Isend之后是否需要MPI_Wait呢?

需要单独的发送完成调用来完成通信。

但在实践中,不需要显式等待MPI_Isend也可以正常工作。

1个回答

5
一定要单独使用完整的调用(例如 MPI_Wait)。
对于 MPI_Isend,完成保证了消息已从发送缓冲区复制出来。在消息完成之前,您不得修改或释放发送缓冲区。
同样,在 MPI_Irecv 中,必须完成呼叫以确保消息已在接收缓冲区中接收。在消息完成之前,您不得尝试从接收缓冲区读取消息。显然,这意味着您不能编写或释放接收缓冲区。
消息完成可以通过 MPI_Wait、成功的 MPI_Test 或它们的多个完成(全部/任意/一些)变体来完成。
除了完成通信外,这些函数还释放通信请求对象。从技术上讲,您可以使用 MPI_Request_free 完成此操作而不完成通信。
根据您提供的有限代码示例,无法建议您应该如何正确放置 MPI_Wait。如果您将其放在正确位置,代码是正确的,但您可能会使用 MPI_Send / MPI_Recv
省略消息完成将导致资源泄漏,最有可能是不正确的代码。
MPI很难,非阻塞MPI更难。如果您是初学者,请尝试使用阻塞MPI调用。非阻塞调用似乎被初学者过度使用,并导致非常难以理解的代码。并且永远不要相信一个代码是正确的,只因为它对您有用。

我能否像示例3.12那样用MPI_Request_free替换MPI_Isend后面的MPI_Wait?这如何保证发送的完成? - Waizung Taam
如果您使用 MPI_Request_free,则无法保证发送的完成。除非您确实知道自己在做什么,否则不要使用它。 - Zulan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接