我有一些支持MPI的python抽样代码,可以触发对不同内核的并行似然调用。因为它是(不一定要求)拒绝抽样,我只需要一个np样本就能成功地开始下一次迭代,并且在过去很高兴地通过这种方法实现了~ np的加速。
我已经将它应用于一个新的问题,在这个问题中,可能调用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/生成新进程?
谢谢!
发布于 2015-03-11 08:37:09
你想要做的并不完全是教科书MPI,所以我没有教科书的答案给你。听起来你不知道“坏”的结果会持续多久。
你会问“假设代码总是在监听(而循环?)它会慢很多”但如果你使用非阻塞发送和接收,你可以做工作,比如说,100次迭代,然后测试一条“停止工作”消息。
我会在这里避免MPI_Bcast,因为这不是你想要的。一个过程获胜。然后,这个过程应该发送一个“我赢了!”给其他人的信息。是的,你做的是n-1点对点操作,当你有100万个mpi进程时,这将是一个令人头痛的问题。
在工作端,MPI_Irecv和ANY_SOURCE将匹配任何进程“我赢了!”消息。定期测试完成。
https://stackoverflow.com/questions/28976034
复制相似问题