假设我在5个节点上运行一个MPI程序,它将运行50次模拟。然而,模拟可能需要明显不同的时间。如果我有一组初始条件,比如ic1、ic2、...ic50,当一个节点/进程完成一个模拟时,我希望它使用下一个(尚未使用)初始条件集来运行一个新的模拟。我最初的想法是使用MPI_Bcast或MPI_Gather s.t。所有节点都有一个int来保存要运行的下一个索引,并在开始新的模拟之前更新它。这是否是一个合理的想法/是否有其他和/或更好的解决办法?
发布于 2014-10-08 12:02:38
您需要一个共享的工作队列。有很多方法可以做到这一点。最简单的方法是指定一个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共享文件指针例程,但在这种情况下,I/O相对于CPU工作量很小(读取初始条件),就可以了。
https://stackoverflow.com/questions/26245097
复制相似问题