微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 MPI4PY

如何解决如何使用 MPI4PY

场景我有一个可以用多个进程调用的程序,即多个内核/MPI 等级。

在当前状态下,每个等级的程序都对一个常量值(标量)进行循环,我可以在开始之前将其写入源代码中。

示例: 如果我选择以 "4" 作为 scalar 运行它,程序的主要部分在每个等级上运行 4 次。有 4 个等级,它会运行 16 次,而每个等级都有 4 个任务。

最后,我将每个进程/等级的输出收集到一个等级为 0 的串联数组中。 所以我会得到一个列表,例如16 个输出元素。

问题: 一个等级可能会在另一个等级完成之前完成其任务。因此一个等级可能是空闲的,而其他等级仍然有一个完整的队列要做,并且可以在空闲等级上分配计划任务。 我需要一个解决方案,如何在一个等级空闲时使用 MPI 分配任务。 如上: 当一个rank完成了4个任务,而另一个还剩下3个任务时,就应该将open的任务分配给idle rank。

我需要什么: 我需要一个主机进程来分配任务,我需要知道如何检查空闲等级,我需要知道如何在等级之间进行通信。此外,我还不知道如何将我的标量作为输入更改为可以通过分布动态更改的内容。例如。当一个等级因为一个等级空闲而少了一项任务(所以总共是 3 个)时,那么它不应该有一个完整的剩余 4 个 for 循环。

代码

    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 循环内容在实际程序的运行时可能会有所不同。

有什么想法吗?谢谢

解决方法

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

但如果你真的必须:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。