首页 > 解决方案 > MPI,如果使用非阻塞 i_send 或 i_recv,如果最后有等待,哪个先走有关系吗?

问题描述

如果我打电话或者先做一个 irecv 然后是一个 isend,最后等待MPI_isendMPI_irecv哪个顺序有关系吗?

标签: parallel-processingmpinonblocking

解决方案


如果我是 MPI_isend 然后是 MPI_irecv 或者先做一个 irecv 然后是一个 isend,最后等待?哪个顺序有关系吗?

MPI_IrecvMPI_Isend是非阻塞通信程序,因此需要使用MPI_Wait(或使用MPI_Test测试请求是否完成)来确保消息完成,并且发送/接收缓冲区中的数据可以再次安全被操纵。

这里的非阻塞是指不等待数据被读取和发送;而是立即使数据可供读取和发送。但是,这并不意味着数据会立即发送。如果是,就不需要调用 MPI_Wait。

源代码上引用@hristo-away-iliev

如果您希望程序符合标准并因此可移植,则必须始终等待或测试非阻塞操作。该标准允许实现将实际数据传输推迟到等待/测试调用。一些 MPI 操作(除了等待/测试)会进行非阻塞操作,但不应依赖这种行为。

MPI_Isend 不一定在后台进行,只有当 MPI 实现有机会进行时。MPI_Wait 推进操作并保证其完成。一些 MPI 实现可以使用进程线程在后台进行操作。有些不能。它依赖于实现,永远不应依赖于一种或另一种特定行为。


推荐阅读