0

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

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

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

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

问候

4

2 回答 2

1

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

于 2013-04-29T21:20:16.630 回答
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(在某个轮询间隔)再次联系 master 以检查工作,并看到有一个任务等待工作。任务 3 启动发送。任务 3 为任何等待工作的剩余任务启动发送。程序继续。

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

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

于 2013-04-30T17:24:23.843 回答