跟踪MPI中的全局索引

时间:2014-10-07 20:53:26

标签: c++ mpi

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

1 个答案:

答案 0 :(得分:2)

您需要一个共享的工作队列。有很多方法可以做到这一点。最简单的方法是指定一个mpi等级" master"和其他工人"。工人要求主人找一个工作单位(你的初始条件之一),去上班,然后在完成工作时请求师傅换新工作单位。这里有一些额外的细节(它说的是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很小(读取初始条件),就可以了。