MPI_Recv消息排序与MPI_Send消息排序

时间:2013-12-30 15:55:47

标签: openmpi

在尝试使用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函数。

1 个答案:

答案 0 :(得分:1)

MPI不保证收到来自不同进程的邮件的顺序。实际上,如果在标准模式下使用输出缓冲区,则可以在发送完成后开始接收操作:http://www.mpi-forum.org/docs/mpi-1.1/mpi-11-html/node40.html#Node40。您可以使用标准模式发送保证的唯一顺序是message3将始终在message1之后到达。这是一个可能导致您的异常情况的(非唯一)序列:

  1. 等级2发送消息(message1)到等级0;
  2. 等级0从rank2接收message1;
  3. 等级0发送消息(message1)到等级1;
  4. 等级1从rank0接收message1;
  5. 等级2发送消息(message2)到等级1;
  6. 等级2发送消息(message3)到等级0;
  7. 等级0从rank2接收message3;
  8. 等级0发送消息(message3)到等级1;
  9. 等级1从rank0接收message3;
  10. 等级1从rank2接收message2;
  11. 基本上,MPI_SendMPI_BSendMPI_SSend的别名,并且由您挑选的是哪一个。您的异常是由MPI_BSend引起的。您可以保证使用同步模式(MPI_SSend)或就绪模式(MPI_RSend)写入相应的接收缓冲区。两者之间的主要区别在于,就绪模式要求接收器已经在等待消息,因为它不会失败,而同步模式将等待它发生。

    如果您使用的是Linux平台,则可以使用nice命令来使用标准模式,以提高rank0的优先级并减少rank2的优先级。增加优先级差异越多,异常就会越一致地发生。以下是关于该主题的简要教程:http://www.nixtutor.com/linux/changing-priority-on-linux-processes/