在主机之间发送消息,无需探测或向每个主机询问新消息

时间:2013-04-29 20:08:10

标签: mpi

我的问题是发送有关计算状态和程序状态的消息。每个主人都得到一大块工作。如果主机完成工作,它应该将结果发送给接收方。计算运行时接收器可能会发生变化。出于调试目的,每个主机上的状态也应该转移到等级为0的主机。

从那时起,我收到了很多消息。但我不清楚如何在主机之间发送消息。

  • 一种可能性是像圆圈一样的消息传输,其中每个邻居都将消息发送给下一个邻居。
  • 非阻塞通信方法如MPI_Isend和MPI_Irecv可能是解决方案。但是每个主机都应该是发送者和接收者。
  • 简单的方法是每个主持人广播消息,但这是很多流量。

我需要一个像广播这样的功能,每个主机都可以是接收者和发送者。只有这样,当有消息时!

问候

2 个答案:

答案 0 :(得分:1)

基于“我需要像广播一样的功能,每个主机都可以是接收器和发送器。”,MPI_Alltoall符合要求。有关实际示例,请参阅此link

答案 1 :(得分:0)

如果您不知道会有消息,那么处理此问题的一种方法可能是让主进程充当消息队列,基本上是在无限接收循环中,直到所有任务都发送了退出信号。

这样,您不必担心邻居任务之间的混合发送/接收计数,并且每个任务可以偶尔独立轮询主任务,以查看是否有工作和/或消息。

这可能会有点复杂,尤其是消息队列,并确保当消息等待,然后两个任务启动短发送/接收会话,但它会阻止大量广播/全部所有的交通,这是非常昂贵的时间。

如果主任务主要只处理消息状态,那么它应该是非常低摩擦的互连。

基本上是任务0:

while (1){
    MPI_recv(args);
    if (any task has a message to send){ add it to the master's queue; }
    if (any task is waiting to contact the task that is now polling for messages){ tell current task to initiate a Recv wait and signal the master that it is waiting; }
    if (any other task is waiting for the current task to send to it){ initiate a send to that task; }
}

每项任务:

if (work needs to be sent to a neighbor){ contact master; master adds to queue; }
if (a neighbor wants to send work){ enter receive loop ; }   
if (a neighbor is ready to receive work according to the master){ send work to it; }

或者: 任务3适用于任务8。 任务3与硕士联系,并且这样说。 任务3继续其业务。 任务8与Master联系,并看到它在任务3待处理中有效。 任务8进入接收。 任务3(在某个轮询间隔)再次与主人联系以检查工作,并看到有等待工作的任务。 任务3启动发送。 任务3为等待工作的任何剩余任务启动发送。 计划继续。

现在,这有很多自己的警告。它是否有效取决于消息在任务之间传递的频率,以及给定任务等待其邻居发送的时间。

最后,这可能不比简单的Alltoall()更好。这个解决方案完全有可能是非常可怕的。