現在、OpenMP を使用して Fortran で記述されたマルチグリッド コードを並列化しようとしていますが、OpenMP のスケジューリング句がパフォーマンスに大きな影響を与えることがわかりました。OpenMP スケジューリング節は、静的、動的、ランタイム、およびガイド付きであり、ループ内の作業をスレッド間で分割する方法を決定することを思い出してください。たとえば、スケジューリング句を含む OpenMP の並列化された SAXPY ループは次のようになります。
!$OMP Parallel Do Schedule(Static)
Do i=1,n
z(i)=a*x(i)+y(i)
End Do
!$OMP End Parallel Do
ここで、コードの一部に多数の並列化されたループがあり、これらのスケジューリング句のどれがプログラムを最も速く実行するかを先験的に決定する方法がないと想像してください。各スケジューリング節を手作業で変更するのは面倒なので、私がやろうと思ったことは次のとおりです。
Character(Len=10)::sched="Dynamic"
!$OMP Parallel Do Schedule(sched)
Do i=1,n
z(i)=a*x(i)+y(i)
End Do
!$OMP End Parallel Do
次に、その文字変数 'sched' をすべての並列化されたループに配置し、たとえば sched="Static" を配置して一度にすべて変更し、実行時テストを実行して、どれが最も速く実行されたかを確認します。もちろん、少なくとも gfortran や Absoft コンパイラでは動作しません。したがって、私の質問は次のいずれかまたはすべてです: なぜこれが機能しないのですか?、どうすれば機能させることができますか?、またはこの問題を解決するためにこの構造を使用しないようにするにはどうすればよいですか? どんな助けでも大歓迎です。