個別のコアへの並列尤度呼び出しを開始する MPI 対応の python MCMC サンプリング コードがいくつかあります。これは (必然的に - 質問しないでください) 拒否サンプリングであるため、次の反復を開始するために成功する np サンプルの 1 つだけが必要です。
これを、可能性が f2py でラップされた fortran サブルーチンを呼び出す新しい問題に適用しました。この場合、反復ごとに、他の np-1 プロセスは、それらの np-1 の 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 コードで次の反復を正常に再起動したり、新しいプロセスを生成したりするために何かをする必要がありますか?
ありがとう!