在尝试使用OpenMPI模拟网络行为时,我遇到了一个问题,可以总结如下:
Rank 2 sends a message (message1) to rank 0;
Rank 2 sends a message (message2) to rank 1;
Rank 2 sends a message (message3) to rank 0;
轮到他,rank 0 receives both messages from rank 2 and forwards them to rank 1 (in the correct order);
Rank 1 receives the messages in the following order: message1, message3 and message2.
此行为仅在运行程序的过程中发生一次。通常(7次中的6次),遵循相同的模式,排名1似乎按预期顺序接收消息(即:message2,message1,message3)
我只使用基本的MPI_Recv和MPI_Send函数。
答案 0 :(得分:1)
MPI不保证收到来自不同进程的邮件的顺序。实际上,如果在标准模式下使用输出缓冲区,则可以在发送完成后开始接收操作:http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node40.html#Node40。您可以使用标准模式发送保证的唯一顺序是message3
将始终在message1
之后到达。这是一个可能导致您的异常情况的(非唯一)序列:
基本上,MPI_Send
是MPI_BSend
或MPI_SSend
的别名,并且由您挑选的是哪一个。您的异常是由MPI_BSend
引起的。您可以保证使用同步模式(MPI_SSend
)或就绪模式(MPI_RSend
)写入相应的接收缓冲区。两者之间的主要区别在于,就绪模式要求接收器已经在等待消息,因为它不会失败,而同步模式将等待它发生。
如果您使用的是Linux平台,则可以使用nice
命令来使用标准模式,以提高rank0
的优先级并减少rank2
的优先级。增加优先级差异越多,异常就会越一致地发生。以下是关于该主题的简要教程:http://www.nixtutor.com/linux/changing-priority-on-linux-processes/