MPI:如何让一个进程终止所有其他进程 - python -> fortran

MPI: How to get one process to terminate all others - python -> fortran

我有一些启用 MPI 的 python MCMC 采样代码,可以触发对单独内核的并行似然调用。因为它是(必然 - 不要问)拒绝采样,我只需要一个 np 样本成功开始下一次迭代,并且在过去很高兴地通过这种方法实现了 ~ np x 加速。

我已将其应用于一个新问题,其中可能会调用 f2py 包装的 fortran 子例程。在这种情况下,在每次迭代中,其他 np-1 进程等待最慢(有时非常慢)的结果返回,即使其中一个 np-1 已经可以接受。

所以我怀疑我需要向所有未获胜(在速度方面)进程传递一条消息以终止,以便下一次迭代可以开始,我需要弄清楚一些最佳方法的细节这个,如下。

python 代码是这样的。采样器是 PyMultiNEST。

from mpi4py import MPI
world=MPI.COMM_WORLD

def myloglike(parameters,data,noise):

    modelDataRealisation,status=call_fortran_sub(parameters)

    if status == 0: # Model generated OK
        winner=world.rank # This is the rank of the current winner
        # I want to pass a message to the other still-running processes
        # identifying that a successful sample has come back
        won=world.bcast(winner,root=winner)
   # I tried receiving the message here but the fortran_sub doesn't know
   # anything about this - need to go deeper - see below

   # Calculate chisq value etc.
   loglike = f(data,modelDataRealisation,noise)
   return loglike

广播应该通过主进程吗?

现在,棘手的部分是如何接收 F90 代码中的 kill 信号。大概如果代码总是在监听(while loop?)它会减慢很多 - 但我应该使用类似的东西:

call MPI_RECV(winner,1,MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE,MPI_ANY_TAG&
         &,MPI_COMM_WORLD,0,0)

然后如何在收到消息后最好地终止该进程?

最后,我是否需要在 F 代码中做任何事情才能使下一次迭代重新启动 OK/spawn 个新进程?

谢谢!

你要做的不是教科书上的 MPI,所以我没有教科书上的答案给你。听起来你不知道 "bad" 结果需要多长时间。

你问 "Presumably if the code is always listening out (while loop?) it will slow down a lot" -- 但如果你使用非阻塞发送和接收,你可以进行 100 次迭代,然后测试 "stop work" 消息。

我会在此处避免使用 MPI_Bcast,因为这不是您想要的。一个过程获胜。然后该进程应该向其他所有人发送 "i won!" 消息。是的,你在做 n-1 个点对点的操作,当你有一百万个 mpi 进程时,这会很头疼。

在工作端,MPI_Irecv 和 ANY_SOURCE 将匹配任何进程 "i won!" 消息。定期测试是否完成。