【发布时间】:2021-09-05 10:56:41
【问题描述】:
场景: 我有一个可以用多个进程调用的程序,即多个核心/MPI 等级。
在其当前状态下,每个等级的程序都有一个常数值(标量)循环,我可以在开始之前将其写入源代码。
示例: 如果我选择以“4”作为标量运行它,则程序的主要部分在每个等级上运行 4 次。有 4 个等级,它会运行 16 次,而每个等级都有 4 个任务。
最后,我将每个进程/等级的输出收集到等级 0 上的一个串联数组中。 所以我会得到一个列表,例如16 个输出元素。
问题: 有可能一个等级在另一个等级完成之前完成了它的任务。因此,一个 rank 可能是空闲的,而其他 rank 仍然有一个完整的队列要做,并且可以在空闲 rank 上分配计划任务。 我需要一个解决方案,如何在一个等级空闲时使用 MPI 分配任务。 如上: 当一个 rank 完成了所有 4 个工作,而另一个还有 3 个工作要做时,则应将打开的任务分配给 idle rank。
我需要什么: 我需要一个主机进程来分配任务,我需要知道如何检查空闲队列,我需要知道如何在队列之间进行通信。另外我还不知道如何将标量更改为可以通过分布动态更改的输入。例如。当一个 rank 因为一个 rank 空闲而少了一项任务(所以总共是 3 个)时,那么它不应该有一个完整的 for-loop 剩余 4。
伪代码:
tasks = 4
comm = MPI.COMM_WORLD
rank = comm.Get_rank() # current used core/process
for i in range(tasks):
//complete task
output = do something
output_gathered = comm.gather(output, root = 0)
for 循环内容在实际程序中的运行时可能会有所不同。
有什么想法吗?谢谢
【问题讨论】: