私は、サブルーチンをシリアルに呼び出す (反復を実行する) コードを何度も作成しています。サブルーチン内の反復を並列化したい。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を各反復後に他のプロセスが反復を完了するまで待機させることは可能ですか?