MPI非阻塞收发顺序验证:2核系统是否保证接收消息与缓冲区匹配
结论
不能保证rank1的buffer1一定收到A、buffer2一定收到B。
原因解释
MPI消息的匹配规则是按 <发送者rank, 接收者rank, 标签(tag)> 三元组匹配,和非阻塞调用的发起顺序、MPI_Wait的调用顺序完全无关。这段代码的问题如下:
- 两次
MPI_Isend和两次MPI_Irecv没有指定区分的tag,默认如果tag相同或者接收端用了通配tagMPI_ANY_TAG,先到达rank1的消息会优先匹配先发起的未完成接收请求。 - MPI标准不保证同一个发送者发往同一个接收者的消息的到达顺序和发送顺序一致,后发的B完全可能比A先到达rank1。这种情况下先到的B会匹配第一个发起的buffer1接收请求,后到的A匹配buffer2的接收请求,和预期完全相反。
MPI_Wait只是阻塞等待对应传输请求完成,不会改变消息和接收请求的匹配结果。
正确实现方案
如果要严格保证A进buffer1、B进buffer2,只需要给两个消息分配不同的tag即可:
if(rank == 0) { MPI_Isend(A, ..., 0/*tag*/, 1/*目标rank*/, ...); // Do something else. MPI_Isend(B, ..., 1/*tag*/, 1/*目标rank*/, ...); // Do something else. MPI_Wait(B is sent) MPI_Wait(A is sent) } else { MPI_Irecv(buffer1, ..., 0/*源rank*/, 0/*匹配tag*/, ...); // Do something else. MPI_Irecv(buffer2, ..., 0/*源rank*/, 1/*匹配tag*/, ...); // Do something else. MPI_Wait(buffer2 is finished receiving) MPI_Wait(buffer1 is finished receiving) }
内容的提问来源于stack exchange,提问作者user2961927
相关产品推荐
相关产品推荐

