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

时间:2015-03-10 23:34:16

标签: python fortran mpi mcmc mpi4py

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

我已将此应用于一个新问题,其中可能性调用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信号。据推测,如果代码总是在监听(循环?),它会慢下来 - 但无论如何我应该使用类似的东西:

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

然后,一旦收到消息,如何最好地杀死该过程?

最后,我是否需要在F代码中执行任何操作以使下一次迭代重新启动OK /生成新进程?

谢谢!

1 个答案:

答案 0 :(得分:1)

你要做的不完全是教科书MPI,所以我没有给你的教科书答案。听起来你不知道“糟糕”的结果需要多长时间。

你问“大概是否代码总是在监听(循环?)它会慢下来” - 但如果你使用非阻塞发送和接收,你可以为100次迭代工作然后测试“停止工作”消息。

我会在这里避免使用MPI_Bcast,因为这不是你想要的。一个过程胜出。那个过程应该发送“我赢了!”给其他人的信息。是的,你正在进行n-1点对点操作,当你拥有一百万mpi进程时,这将是一件令人头疼的问题。

在工作方面,带有ANY_SOURCE的MPI_Irecv将匹配“我赢了”的任何进程!信息。定期测试完成。