【问题标题】:How to distribute/allocate tasks from a hostprocess in Python with MPI4PY如何使用 MPI4PY 从 Python 中的主机进程分发/分配任务
【发布时间】: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 循环内容在实际程序中的运行时可能会有所不同。

有什么想法吗?谢谢

【问题讨论】:

    标签: python mpi mpi4py


    【解决方案1】:
    1. 经理/工人模型通常不适合 MPI。
    2. 数字“4”只是一个例子吗? MPI 的开销听起来太低了,不值得。

    但如果你真的必须:

    • 让经理向工作人员发送数据(或某种类型的工作描述符),然后为该工作人员发布MPI_Irecv
    • 然后执行MPI_Waitany 以查看哪个工人完成了,
    • 接收该结果,并向工作人员发送一个新的工作描述符。

    【讨论】:

    • 4 只是一个例子,但真正的数字不大于 100。例如16 核 x 100 = 1600 个输出。然而,每个任务的运行时间可能从 0 到 3-4 小时变化很大。你说的是开销,当我集成主机通信时,对吧?
    • 好的,运行时间这么长,不用担心开销。按照我的建议去做。
    • 作为一个初学者,我真的不明白如何用 mpi4py 实际实现它。我只想分发显示的“for循环”。然后它只需要类似于主机进程中的 for 循环。我知道这可能是用 10 行代码完成的,但我不知道该怎么做,尤其是如果它甚至必须改变的话,我的收集函数需要改变什么。
    • "我只想分发所示的"for循环"。"永远不要使用“只是”这个词。你不能“只是”这样做。 for 循环的任何简单分布都会遇到严重的负载不平衡。你需要让它动态化。了解MPI_Irecv 等。
    • 我现在以不同的方式解决了它,因为即使在阅读之后,我也无法做到。我将结果附加到一个文件中。 1 行是 1 个结果。每个等级都打开这个文件并读取当前的行数,并根据它终止或继续。与其他东西的运行时间相比,这种情况下的 I/O 开销可以忽略不计。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多