【问题标题】:MPI: How to get one process to terminate all others - python -> fortranMPI:如何让一个进程终止所有其他进程-python-> fortran
【发布时间】:2015-05-12 14:49:41
【问题描述】:

我有一些启用 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 代码中接收终止信号。据推测,如果代码总是在监听(while 循环?)它会减慢很多 - 但无论如何我应该使用类似的东西:

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

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

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

谢谢!

【问题讨论】:

    标签: python fortran mpi mcmc mpi4py


    【解决方案1】:

    您尝试做的并不完全是教科书 MPI,所以我没有教科书答案。听起来您不知道“坏”结果需要多长时间。

    您问“如果代码总是在侦听(while 循环?)它会减慢很多” - 但如果您使用非阻塞发送和接收,您可以执行 100 次迭代然后测试“停止工作”消息。

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

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

    【讨论】:

    • 非常感谢 - 我是:每隔几次迭代检查一次(时间损失仍然比以前更好);使用 MPI_Irecv(我必须仔细设置标签以避免与其他 MPI 标签发生冲突);循环遍历这些标签以检查传入的消息;传递一个 np 元素数组而不是单个整数。谢谢! :)
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2012-04-04
    • 2012-06-14
    • 2011-06-10
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    相关资源
    最近更新 更多