【发布时间】:2015-10-06 13:37:57
【问题描述】:
好吧,让我们开始吧,我脑子里有点糊涂。
发送:它正在阻塞。发送方将等待接收方发布相应的 RECV。
SSEND:它是阻塞的,发送方不会只等到接收方发布相应的RECV,它会等待RECV的ack。这意味着RECV运行良好。
BSEND:它是非阻塞的。该过程可以继续执行其部分代码。数据存储在之前正确分配的缓冲区中。
ISEND:它是非阻塞的。该过程可以继续执行其部分代码。数据未存储在缓冲区中:在确定 ISEND 运行正常(WAIT/TEST)之前,不得覆盖正在发送的数据。
那么.. ISEND 和 BSEND 只是缓冲区不同吗?
【问题讨论】:
-
我只使用过 send 和 isend,而你的这两个都是正确的。还有一点要添加到 isend:在您确定 irecv 也已通过等待/测试完成之前,您不得访问您收到的数据。
-
有六个发送。常规、同步和缓冲,每个都有阻塞和非阻塞。同步发送对于调试和实现点对点屏障很有用。不应使用缓冲发送。它揭示了一个最好隐藏起来的植入概念。
-
这里解释了不同的 MPI 发送模式:Immidiate vs synchronous communication in openmpi。 MPI 中有四种不同的阻塞发送类型,每种类型都有对应的非阻塞变体,总共 8 次 MPI 调用。请注意,阻塞并不意味着同步。
-
@HristoIliev 谢谢。我忘记了准备发送,这也是对实现细节的毫无意义的暴露。