在阅读有关阻止发送和接收MPI时,我感到困惑。如MPI标准2.2第3.4节通信模式中所述:
...上一节中描述的接收操作是阻塞:它 仅在接收缓冲区包含新接收的缓冲区后返回 信息。 接收可以在匹配发送完成之前完成 (当然,只有在匹配的发送开始后才能完成。)
有人可以向我解释阻止接收如何在相应的发送完成之前完成?我的理解是,当数据准备好在接收缓冲区中使用时(即数据已被完全接收),阻塞接收(MPI_recv
)返回。情况不是这样吗?
答案 0 :(得分:5)
您的理解是正确的。
标准中描述的情况(接收在发送完成之前完成)告诉您不要依赖库调用的顺序。没有必要在特定的机器/实现上使用。
如果您考虑同步发送和阻止接收微小消息。同步发送可能仅在匹配接收开始之后完成,可能由“确认消息(ACK)”指示。在ACK到达发送方之前,实际的消息传输可能完全转移(接收可能返回)(发送可能返回)。请记住,这是高度实现/机器特定的。
答案 1 :(得分:1)
有人可以向我解释阻止接收之前是如何完成的 相应的发送已完成?
“发送完成”的定义是用户代码可以安全地改变发送缓冲区的内容。无法保证相应的recv的状态。
在某些情况下,在发送缓冲区可以安全更改之前,recv必须完成(并返回)。例如,必须从recv端向发送端发送ack,以指示更改发送缓冲区是安全的(在RDMA集合协议消息传输中很常见)。
我的理解是a 阻塞接收(MPI_recv)在数据准备好使用时返回 接收缓冲区(即数据已被完全接收)。这是 不是这样吗?
这是正确的。