我的问题是发送有关计算状态和程序状态的消息。每个主人都得到一大块工作。如果主机完成工作,它应该将结果发送给接收方。计算运行时接收器可能会发生变化。出于调试目的,每个主机上的状态也应该转移到等级为0的主机。
从那时起,我收到了很多消息。但我不清楚如何在主机之间发送消息。
我需要一个像广播这样的功能,每个主机都可以是接收者和发送者。只有这样,当有消息时!
问候
答案 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()更好。这个解决方案完全有可能是非常可怕的。