MPI - 跨进程共享队列
Posted
技术标签:
【中文标题】MPI - 跨进程共享队列【英文标题】:MPI - Shared queue across processes 【发布时间】:2020-05-10 06:13:49 【问题描述】:我有一个 MPI 程序,其中主节点等待从节点完成一定数量的任务(比如 1000 个)。从节点处于 while(True) 循环中,并继续从它们的任务中生成输出。这些任务的运行时间可能因任务和节点而异,因此如果有 2 个从节点并且主节点需要等待 1000 个任务,那么从节点 1 可能已经完成了 450 个任务,而从节点 2 则完成了另外 550 个任务.
从节点“告诉”主节点总共完成了 1000 个任务的最佳方式是什么?在我看来,我需要某种跨进程的共享队列,一旦任务完成,从属可以推送数据,而主控只是轮询这个队列的大小,直到它达到 1000。随后,主控可以从这个队列中排出数据重置从属队列大小以填充更多数据。
【问题讨论】:
MPI 代表消息传递接口,因此没有“共享队列”。相反,进程相互发送和接收消息。一个典型的场景是从机向主机请求一些工作,主机向从机发送一些工作,从机将其结果返回。如果进程之间应该存在一些不平衡,请让 master 使用MPI_ANY_SOURCE
。
【参考方案1】:
我推荐两种解决方案。
Gilles 指出的第一个是使用 MPI_ANY_SOURCE 接收 1000 条可以从任何工作人员发送的完成消息。
第二种是使用MPI_ACCUMULATE。在这种情况下,主节点共享一个初始化为 0 的窗口,然后每个工作人员在每个任务完成后使用 MPI_ACCUMULATE 递增窗口中的值。 master 轮询自己的本地窗口,直到达到 1000。
在这种情况下,我会坚持使用 MPI_ANY_SOURCE 而不是创建和销毁窗口。我认为没有令人信服的理由在此处添加这种复杂性。
【讨论】:
我认为 MPI_ANY_SOURCE 方法对我来说看起来更直接。我最初是在寻找更高级别的数据结构,例如队列,但似乎 send/recv 是 MPI 的方式。以上是关于MPI - 跨进程共享队列的主要内容,如果未能解决你的问题,请参考以下文章