2010-02-25 42 views
4

现在我正在尝试使用MPI_Sendand MPI_Recv在多个进程中传递最佳找到的解决方案。在每个流程中找到的最佳解决方案都应该传递给控制流程,该流程存储所有最佳解决方案,并在需要时发送给其他流程。我的问题是如何实现它?例如,一旦进程1找到新的最好的,它可以调用MPI_Send并将其发送给控制进程。控制过程是否有办法检测到有消息要接收?每个MPI_Send是否需要MPI_Recv?期待听到你们专家的建议。谢谢!MPI实现:MPI_Recv是否可以接收来自多个MPI_Send的消息?

感谢您的建议。我想要做的是让几个工作进程向一个控制进程发送消息。工作流程决定何时发送。控制过程必须检测何时接收。 MPI_Proble可以做到吗?

回答

11

是的,MPI_RECV可以指定MPI_ANY_SOURCE作为消息来源的等级,所以你应该可以做你想做的。

5

MPI_Recv可以使用MPI_ANY_SOURCE作为从任何其他级别接收消息的方式。

根据控制过程的工作负载和性质,您可能希望保留对代码的控制权,并且只能随时进入MPI库。在这种情况下,MPI_ANY_SOURCE和MPI_Test上的MPI_IRecv可能是一个好方法。

如果您需要根据消息内容进行一些处理,MPI_Probe或MPI_IProbe允许在消息实际上是MPI_Recv'd之前检查消息头。例如,MPI_Probe允许确定消息的大小,并创建适当大小的缓冲区。另外,如果在检查最佳解决方案时所有工作队伍偶尔会达到“障碍”点,MPI_Gather/MPI_Bcast集体操作也可能是适当的。

请记住,进入长计算阶段的等级有时会干扰良好的消息传播。如果有一个扩展的计算阶段,确保所有MPI消息在该阶段之前已经交付可能会有所帮助。这变得更加重要,因为在群集中使用了RDMA风格的互连。 MPI_Barrier将确保所有等级在MPI_Barrier调用返回任何MPI等级之前进入MPI_Barrier。