我有一个 MPI 程序,其中主节点会等待从属节点完成一定数量的任务(例如 1000 个)。从节点处于 while(True) 循环中,并继续从其任务中生成输出。这些任务的运行时间可能因任务和节点而异,因此,如果有 2 个从节点,并且主节点需要等待 1000 个任务,那么从节点 1 可能已完成 450 个任务,从节点 2 可能完成其他 550 个任务.
从节点“告诉”主节点总共 1000 个任务已完成的最佳方式是什么?在我看来,我需要某种跨进程的共享队列,其中从站可以在任务完成后推送数据,而主站只是轮询该队列的大小,直到达到 1000。随后,主站可以从该队列中排出数据重置从设备的队列大小以填充更多数据。
最佳答案
我推荐两种解决方案。
Gilles 指出的第一个方法是使用 MPI_ANY_SOURCE 接收 1000 条可以从任何工作人员发送的完成消息。
第二种是使用MPI_ACCUMULATE。在这种情况下,主节点共享一个初始化为 0 的窗口,然后每个工作节点在每个任务完成后使用 MPI_ACCUMULATE 来递增窗口中的值。主设备轮询它自己的本地窗口,直到达到 1000。
在这种情况下,我会坚持使用 MPI_ANY_SOURCE 而不是困惑地创建和销毁窗口。我认为没有令人信服的理由在这里增加这种复杂性。
关于MPI - 跨进程共享队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887612/