在MPI_Isend之后是否需要MPI_Wait?

Wai*_*aam 2 c mpi

例如,

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, ...);
}
Run Code Online (Sandbox Code Playgroud)

是否必须遵循MPI_Isend的MPI_Wait?理论上,

完成通信需要单独的发送完成呼叫.

但实际上,它可以在没有明确等待MPI_Isend的情况下工作.

Zul*_*lan 5

需要单独的完整(例如MPI_Wait)呼叫.

因为MPI_Isend,完成确保消息已从发送缓冲区中复制出来.在消息完成之前,您不能修改或取消分配发送缓冲区.

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

消息完成由MPI_Wait成功MPI_Test或多个完成(全部/任何/某些)变体完成.

除了完成通信之外,这些功能还可以处理通信请求对象.从技术上讲,您无需使用完成通信即可完成此操作MPI_Request_free.

根据您的有限代码示例,无法提供有关如何操作的建议.没有更多的代码,就无法告诉你在哪里正确放置MPI_Wait.如果你把它放在那里,代码是正确的,但你也可以使用MPI_Send/ MPI_Recv.

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

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