2014-10-07 68 views
0

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

+0

从这个描述中不太清楚你的目标是什么。你能用一些简短的伪代码勾画出来吗? – 2014-10-08 04:19:58

回答

2

您需要共享工作队列。有很多方法可以做到这一点。最简单的方法是指定一个mpi等级为“主”,其他等级为“工人”。工作人员要求主人为一个工作单位(您的初始条件之一),去工作,然后完成后请求主人为新的工作单位。这里有一些额外的细节(它说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很小(读取一个初始条件),那就没问题。