我有一些支持MPI的python-mcmcc采样代码,它们向独立的内核发出并行似然调用。因为它是(必然的-不要问)拒绝采样,我只需要其中一个np样本就可以成功地开始下一个迭代,并且在过去通过这种方法已经很好地实现了~npx的加速。在
我已经将此应用于一个新问题,其中似然调用了一个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循环?)它会慢很多-但我是否应该使用类似于:
^{pr2}$然后,如何在收到消息后最好地终止该进程?在
最后,我需要在F代码中做些什么来让下一次迭代重新启动/产生新的进程吗?在
谢谢!在
你想做的并不是教科书上的MPI,所以我没有教科书上的答案。听起来你不知道一个“坏”的结果要花多长时间。在
你会问“如果代码总是在监听(while循环?)这将大大降低速度”,但是如果您使用非阻塞的发送和接收,您可以进行100次迭代,然后测试“停止工作”消息。在
我会避免在这里播放MPI_Bcast,因为这不是你想要的。一个进程获胜。然后这个过程应该发送一个“我赢了!”给其他人留言。是的,您正在执行n-1点对点操作,当您有一百万个mpi进程时,这将是一个令人头痛的问题。在
在worker端,任何源的MPI_Irecv将匹配任何进程“我赢了!”留言。定期完成测试。在
相关问题 更多 >
编程相关推荐