fortran python如何终止MPI进程

2024-10-02 12:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些支持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代码中做些什么来让下一次迭代重新启动/产生新的进程吗?在

谢谢!在


Tags: theto方法代码worlddata进程status
1条回答
网友
1楼 · 发布于 2024-10-02 12:27:36

你想做的并不是教科书上的MPI,所以我没有教科书上的答案。听起来你不知道一个“坏”的结果要花多长时间。在

你会问“如果代码总是在监听(while循环?)这将大大降低速度”,但是如果您使用非阻塞的发送和接收,您可以进行100次迭代,然后测试“停止工作”消息。在

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

在worker端,任何源的MPI_Irecv将匹配任何进程“我赢了!”留言。定期完成测试。在

相关问题 更多 >

    热门问题