【问题标题】:Is a MPI_Wait necessary after a MPI_Isend?在 MPI_Isend 之后是否需要 MPI_Wait?
【发布时间】:2020-06-25 12:15:55
【问题描述】:

例如,

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 即可工作。

【问题讨论】:

    标签: c mpi


    【解决方案1】:

    需要一个单独的完整(例如MPI_Wait)调用。

    对于MPI_Isend,完成确保消息被复制出发送缓冲区。在消息完成之前,您不得修改或取消分配发送缓冲区。

    同样,对于MPI_Irecv,您必须完成调用以确保消息已在接收缓冲区中收到。在消息完成之前,您不得尝试从接收缓冲区中读取消息。显然,这意味着您不能写入或释放接收缓冲区。

    消息完成由MPI_Wait、成功的MPI_Test 或它们的多个完成(所有/任何/某些)变体完成。

    这些函数除了完成通信之外,还释放了通信请求对象。从技术上讲,您可以在不使用MPI_Request_free 完成通信的情况下执行此操作。

    没有办法根据您有限的代码示例给出建议。如果没有更多代码,就不可能告诉您正确放置MPI_Wait 的位置。如果你把它放在那里,代码是正确的,但你最好使用MPI_Send/MPI_Recv

    省略消息完成将导致资源泄漏和最有可能的错误代码。

    MPI 很难,非阻塞 MPI 更难。如果您是初学者,请尝试使用阻塞 MPI 调用。非阻塞调用似乎被初学者过度使用,导致代码很难推理。也永远不要仅仅因为代码对你有用就相信它是正确的。

    【讨论】:

    • 我可以用 MPI_Request_free 替换 MPI_Isend 之后的 MPI_Wait,例如 Example 3.12?这如何保证发送完成?
    • 如果你使用MPI_Request_free,你不能保证发送的完成。除非你真的知道自己在做什么,否则不要使用它。
    猜你喜欢
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 2018-07-03
    • 2011-04-09
    • 2011-10-28
    • 1970-01-01
    相关资源
    最近更新 更多