gpt4 book ai didi

c - MPI_Isend 之后是否需要 MPI_Wait?

转载 作者:行者123 更新时间:2023-12-02 14:40:12 26 4
gpt4 key购买 nike

例如,

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 是否必要?理论上,

A separate send complete call is needed to complete the communication.

但实际上,它无需显式等待 MPI_Isend 即可工作。

最佳答案

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

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

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

消息完成是通过MPI_Wait、成功的MPI_Test或其多个完成(全部/任何/部分)变体完成的。

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

无法根据您有限的代码示例给出如何操作的建议。如果没有更多代码,就不可能告诉您正确放置 MPI_Wait 的位置。如果您将其放在那里,则代码是正确的,但您也可以只使用 MPI_Send/MPI_Recv

忽略消息完成将导致资源泄漏,并且很可能导致错误的代码。

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

关于c - MPI_Isend 之后是否需要 MPI_Wait?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com