我有一些启用了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 /生成新进程?
谢谢!
答案 0 :(得分:1)
你要做的不完全是教科书MPI,所以我没有给你的教科书答案。听起来你不知道“糟糕”的结果需要多长时间。
你问“大概是否代码总是在监听(循环?)它会慢下来” - 但如果你使用非阻塞发送和接收,你可以为100次迭代工作然后测试“停止工作”消息。
我会在这里避免使用MPI_Bcast,因为这不是你想要的。一个过程胜出。那个过程应该发送“我赢了!”给其他人的信息。是的,你正在进行n-1点对点操作,当你拥有一百万mpi进程时,这将是一件令人头疼的问题。
在工作方面,带有ANY_SOURCE的MPI_Irecv将匹配“我赢了”的任何进程!信息。定期测试完成。