多Rank发送不同长度消息至同一Rank时MPI阻塞接收的疑问
问题解答:MPI_Recv能否正确接收目标数据?
答案是肯定的,第一个MPI_Recv完全可以正确接收来自Rank 1的目标数据,不会被Rank 2提前到达的消息干扰。
核心原因:MPI的消息匹配规则
MPI的阻塞接收(MPI_Recv)是基于三元组匹配来定位目标消息的,这三个关键匹配项是:
- 源进程ID(你代码里第一个
MPI_Recv指定的是1) - 消息标签(这里是
0) - 通信子(
MPI_COMM_WORLD)
只有完全符合这三个条件的消息,才会被当前的MPI_Recv调用接收。
具体场景分析
当Rank 2的10个MPI_INT消息先到达Rank 0时:
- MPI运行时会检查这个消息的源是
2,和第一个MPI_Recv要求的源1不匹配,所以会把这个消息暂时缓存起来(放在接收队列里)。 - 第一个
MPI_Recv会继续阻塞,直到来自Rank 1、标签为0的1个MPI_INT消息到达。 - 当Rank 1的消息到达后,它完全匹配第一个
MPI_Recv的所有条件,会被立即接收并写入buf1。 - 之后第二个
MPI_Recv执行时,会匹配缓存中来自Rank 2的消息,将其写入buf2。
额外注意点
如果你的代码中使用了MPI_ANY_SOURCE(允许接收任意源的消息)或者MPI_ANY_TAG(允许接收任意标签的消息),那才可能出现消息接收顺序不符合预期的情况。但在你给出的代码里,两个MPI_Recv都明确指定了源和标签,所以完全不用担心顺序问题。
内容的提问来源于stack exchange,提问作者JACK M
相关产品推荐
相关产品推荐

