问题描述
如果我先调用 MPI_isend
然后调用 MPI_irecv
或者先调用 irecv 然后调用 isend,最后等待?哪个顺序重要吗?
解决方法
如果我是 MPI_isend 然后是 MPI_irecv 或者先做一个 irecv 然后一个 isend,用一个 等到最后?哪个顺序重要吗?
MPI_Irecv 和 MPI_Isend 是非阻塞通信例程,因此需要使用 MPI_Wait(或使用 MPI_Test 来测试请求是否完成)以确保消息完成,发送/接收缓冲区中的数据可以再次安全操作。
这里的非阻塞是指不等待数据被读取和发送;而是数据立即可供读取和发送。但这并不意味着数据会立即发送。如果是,就不需要调用 MPI_Wait。
如果您愿意,您必须始终等待或测试非阻塞操作 您的程序符合标准,因此可移植。 该 标准允许实施推迟实际数据 传输直到等待/测试调用。 一些 MPI 操作(除了 等待/测试)进展非阻塞操作,但不应依赖 这种行为。
和
MPI_Isend 不一定在后台进行,而只是 当 MPI 实施有机会推进它时。 MPI_Wait 推进操作并保证其完成。一些 MPI 实现可以使用 进展线程。有些不能。它依赖于实现和 永远不应该依赖一种或另一种特定行为。