0

個別のコアへの並列尤度呼び出しを開始する 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 コードで次の反復を正常に再起動したり、新しいプロセスを生成したりするために何かをする必要がありますか?

ありがとう!

4

1 に答える 1

1

あなたがやろうとしていることは、まさに教科書のMPIではないので、教科書的な答えはありません。「悪い」結果が出るまでにどれくらいの時間がかかるかわからないようです。

「おそらく、コードが常にリッスンしている場合 (while ループ?)、速度が大幅に低下します」と尋ねますが、非ブロッキング送受信を使用している場合は、たとえば 100 回の反復を実行してからテストできます。 「仕事をやめなさい」というメッセージ。

ここでは MPI_Bcast を避けます。それはまさにあなたが望むものではないからです。1 つのプロセスが勝ちます。そのプロセスは、「勝った!」を送信する必要があります。他の皆さんへのメッセージ。はい、n-1 ポイントツーポイント操作を行っています。これは、100 万 mpi のプロセスがあると頭痛の種になります。

ワーカー側では、MPI_Irecv に ANY_SOURCE を指定すると、"i win!" プロセスに一致します。メッセージ。完了するために定期的にテストします。

于 2015-03-11T16:37:09.923 に答える