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