C++ 在MPI中跟踪全局索引

C++ 在MPI中跟踪全局索引,c++,mpi,C++,Mpi,假设我在5个节点上运行一个MPI程序,它将运行50次模拟。然而,模拟可能需要明显不同的时间。如果我有一组初始条件,比如ic1、ic2、…ic50,当一个节点/进程完成模拟时,我希望它使用下一组(尚未使用)初始条件运行新的模拟。我最初的想法是使用MPI_Bcast或MPI_Gather s.t。所有节点都有一个int来保存下一个要运行的索引,并在开始新的模拟之前更新它。这是否合理/是否有其他和/或更好的解决方案 您需要一个共享的工作队列。有很多方法可以做到这一点。最简单的方法是将一个mpi级别指定

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

您需要一个共享的工作队列。有很多方法可以做到这一点。最简单的方法是将一个mpi级别指定为“大师”,将其他mpi级别指定为“工人”。工人们向主人要一个工作单元(你们的初始条件之一),开始工作,完成后向主人要一个新的。这里有一些额外的细节(上面说的是OpenMPI,但没有专门针对OpenMPI的内容):

有一个名为ADLB()的项目,它是一个关于类固醇的工作队列。对于一个5节点的作业来说,可能(肯定)是杀伤力过大,但是对于一个5000节点的作业来说可能是有意义的

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


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

从这个描述中还不清楚您的目标是什么。你能用一些简短的伪代码把它画出来吗?