0

私は、サブルーチンをシリアルに呼び出す (反復を実行する) コードを何度も作成しています。サブルーチン内の反復を並列化したい。mpi の問題は、一度しか初期化できないことです。したがって、複数回呼び出されるサブルーチンで初期化できません。誰かがこれから抜け出す方法を提案できますか?

私の問題は、大まかに以下に概説されているとおりです。

program p

...

do i=1,10000
    call subroutine s(i)
end do

end program p

subroutine s(j)  

...

do i=1,10000
    ...
end do

end subroutine s

このプロセスを並列化したいと考えています。

どうもありがとう。それは役に立ちました!しかし、私の質問を再構成してみましょう。サブルーチン s とともに、メイン プログラムの反復内で、別のサブルーチン s2 を呼び出す必要があります (これは並列化する必要はありません)。私は、それはこのように行うことができると思いました:

  !initialize mpi

  do i=1:1000

  if rank!=0

  call s

  else call s2

  end if

  end do

  !finalize mpi

しかし、ここでの主な問題は、残りのプロセスがゆっくりと進行する一方で、プロセス 0 が急速に進行することです。(望ましくない何か)では、プロセス0を各反復後に他のプロセスが反復を完了するまで待機させることは可能ですか?

4

1 に答える 1