1

現在、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 コンパイラでは動作しません。したがって、私の質問は次のいずれかまたはすべてです: なぜこれが機能しないのですか?、どうすれば機能させることができますか?、またはこの問題を解決するためにこの構造を使用しないようにするにはどうすればよいですか? どんな助けでも大歓迎です。

4

2 に答える 2

2

モードは実際には文字列ではなく、この時点で変数の評価は行われないため、これは機能しません。私が考えることができる最善の方法は、CoCo や C-Preprocessor などのプリプロセッサを使用して、まさにこれを実現することです。ただし、ランタイム モードを使用し、環境変数 OMP_SCHEDULE または omp_set_schedule ルーチンのいずれかを使用してモードを設定することもできます。

于 2011-08-21T00:27:26.840 に答える
0

指定するスケジューリング句は、ループがマシン コードにコンパイルされる方法に劇的な影響を与えます。コードがコンパイルされると、スケジューリング モードはロックされ、実行時に変更できなくなります。haraldkl に同意します。プリプロセッサを使用します。

于 2011-08-21T01:25:44.307 に答える