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

Mpi 在主机之间发送消息,无需探测或向每个主机询问新消息,mpi,Mpi,我的问题是发送有关计算状态和程序状态的消息。每个主持人都有一份工作。如果主机完成了工作,它应该将结果发送给接收者。在计算运行时,接收器可能会发生变化。出于调试目的,每个主机上的状态也应传输到秩为0的主机 从那时起,我收到了很多信息。但我不清楚如何在主机之间发送消息 一种可能是像圆圈一样的消息传输,每个邻居都将消息发送给下一个邻居 像MPI_Isend和MPI_Irecv这样的非阻塞通信方法可能是解决方案。但每一位主人都应该是发送者和接受者 最简单的方法是每个主机都广播消息,但这是一个很大的流量

我的问题是发送有关计算状态和程序状态的消息。每个主持人都有一份工作。如果主机完成了工作,它应该将结果发送给接收者。在计算运行时,接收器可能会发生变化。出于调试目的,每个主机上的状态也应传输到秩为0的主机

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

  • 一种可能是像圆圈一样的消息传输,每个邻居都将消息发送给下一个邻居
  • 像MPI_Isend和MPI_Irecv这样的非阻塞通信方法可能是解决方案。但每一位主人都应该是发送者和接受者
  • 最简单的方法是每个主机都广播消息,但这是一个很大的流量
我需要一个像广播这样的功能,每个主机都可以是接收者和发送者。只有到那时,当有信息的时候


考虑到“我需要一个像广播这样的功能,每个主机都可以是接收者和发送者。”MPI_Alltoall符合这一要求。请参考此示例。

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

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

这可能会变得有点复杂,尤其是在处理消息队列时,并确保当消息等待时,这两个任务会启动一个短的发送/接收会话,但它会阻止大量广播/全对全通信,这在时间上是出了名的昂贵

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

基本上针对任务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与主机联系,并看到它有来自任务3的工作挂起。 任务8输入接收。 Task3(在某个轮询间隔)再次联系master检查工作,并发现有一个任务正在等待工作。 任务3启动发送。 任务3为等待工作的任何剩余任务启动发送。 节目继续

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


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

你的方法很简单。但我最喜欢的是只发送一条消息,如果有的话。程序以无休止的循环运行。每一个循环都要发送消息,这是非常重要的。我需要一个队列,消息在那里等待接收。我想这里指的是异步通信。当有消息时,您可能希望发送消息,但接收者不知道何时接收。方法是保守和乐观的沟通。你可以参考,这是正确的。我意识到了MPI_Iprobe的问题。只有当标志为真时,我才收到MPI_Recv。发送方使用正常的MPI_发送进行发送。