【问题标题】:Tracking global index in MPI在 MPI 中跟踪全球指数
【发布时间】:2014-12-02 10:00:03
【问题描述】:

假设我在 5 个节点上运行一个 MPI 程序,它将运行模拟 50 次。然而,模拟可能需要明显不同的时间。如果我有一组初始条件,比如 ic1,ic2,...ic50,当一个节点/进程完成模拟时,我希望它使用下一组(尚未使用的)初始条件运行新的模拟。我最初的想法是使用 MPI_Bcast 或 MPI_Gather s.t.所有节点都有一个 int 保存下一个要运行的索引,并在开始新的模拟之前更新它。这是一个合理的想法/是否有其他和/或更好的解决方案?

【问题讨论】:

  • 从这个描述中并不清楚你的目标是什么。你能用一些简短的伪代码勾勒出来吗?

标签: c++ mpi


【解决方案1】:

您需要一个共享的工作队列。有很多方法可以做到这一点。最简单的方法是指定一个 mpi 等级为“master”,其他 mpi 等级为“worker”。工人向主人要一个工作单元(你的初始条件之一),去工作,然后在完成后向主人要一个新的。这里有一些额外的细节(它说的是 OpenMPI,但没有什么是特定于 OpenMPI 的):Non-blocking data sharing through OpenMPI

有一个名为 ADLB (http://www.mcs.anl.gov/project/adlb-asynchronous-dynamic-load-balancer) 的项目是一个使用类固醇的工作队列。对于 5 个节点的作业可能(肯定)过度杀伤,但对于 5,000 个节点的作业可能有意义。

您可以使用 RMA 共享内存并使用它来跟踪索引。如果拥有 RMA 窗口的进程本身正忙于在工作单元上进行计算,则响应请求可能会有点慢,但好处是您不需要将一个 MPI 进程作为主进程刻录。

您可以使用 MPI 共享文件指针例程将工作队列保留在磁盘上。我通常对 MPI 共享文件指针例程非常失望,但在这种情况下,相对于 CPU 工作量而言,I/O 很小(读取初始条件),它会没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 2020-09-02
    • 1970-01-01
    • 2021-01-15
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多