MPI-跨进程的共享队列

MPI-跨进程的共享队列,mpi,message-queue,shared-memory,distributed-computing,Mpi,Message Queue,Shared Memory,Distributed Computing,我有一个MPI程序,其中主节点等待从节点完成一定数量的任务(比如1000)。从属节点处于while(True)循环中,并不断从其任务生成输出。这些任务的运行时间可能因任务和节点而异,因此,如果有2个从节点,并且主节点需要等待1000个任务,那么从节点1可以完成450个任务,从节点2可以完成其他550个任务 从节点“告诉”主节点总共已完成1000个任务的最佳方式是什么?在我看来,我需要一种跨进程的共享队列,在这种队列中,从机可以在任务完成后推送数据,而主机只需轮询该队列的大小,直到它达到1000。

我有一个MPI程序,其中主节点等待从节点完成一定数量的任务(比如1000)。从属节点处于while(True)循环中,并不断从其任务生成输出。这些任务的运行时间可能因任务和节点而异,因此,如果有2个从节点,并且主节点需要等待1000个任务,那么从节点1可以完成450个任务,从节点2可以完成其他550个任务


从节点“告诉”主节点总共已完成1000个任务的最佳方式是什么?在我看来,我需要一种跨进程的共享队列,在这种队列中,从机可以在任务完成后推送数据,而主机只需轮询该队列的大小,直到它达到1000。随后,主服务器可以从该队列中排出数据,以重置从服务器的队列大小,以填充更多数据。

我推荐两种解决方案

正如Gilles指出的,第一种方法是使用MPI_ANY_源来接收1000条完成消息,这些消息可以从任何工作人员处发送

第二种方法是使用MPI_累加。在这种情况下,主节点共享一个初始化为0的窗口,然后每个工作节点在每个任务完成后使用MPI_累积来增加窗口中的值。主机轮询自己的本地窗口,直到达到1000


在这种情况下,我会坚持使用MPI_任何源代码,而不是创建和销毁窗口。我不认为有必要在这里增加这种复杂性。

MPI代表消息传递接口,因此不存在“共享队列”。相反,进程相互发送和接收消息。典型的情况是,从机向主机请求一些工作,主机向从机发送一些工作,从机将其结果发送回。如果进程之间存在一些不平衡,让主程序使用MPI\u ANY\u源代码。我认为MPI\u ANY\u源代码方法在我看来更简单。我最初是在寻找一个更高级别的数据结构,比如队列,但似乎send/recv是MPI的发展方向。