インテル® Fortran コンパイラー 14.0 ユーザー・リファレンス・ガイド
次の例では、いくつかの OpenMP* 機能の使用方法を示します。
この例は、各繰り返しごとにワーク量が異なる単純な並列ループを示したものです。負荷のバランスを向上させるため、動的スケジュールを使用しています。
並列領域の最後に暗黙的な barrier があるため、END DO に NOWAIT が含まれています。
例では、fork/join のオーバーヘッドを減らすために融合される 2 つの並列ループを使用します。2 番目のループで使用するすべてのデータは最初のループで使用されるすべてのデータと異なるため、最初の END DO 宣言子には、NOWAIT 節が含まれています。
例 |
---|
subroutine do_2(a,b,c,d,m,n) real a(n,n), b(n,n), c(m,m), d(m,m) !$OMP PARALLEL SHARED(A,B,C,D,M,N) PRIVATE(I,J) !$OMP DO SCHEDULE(DYNAMIC,1) do i = 2, n do j = 1, i b(j,i) = ( a(j,i) + a(j,i-1) ) / 2.0 end do end do !$OMP END DO NOWAIT !$OMP DO SCHEDULE(DYNAMIC,1) do i = 2, m do j = 1, i d(j,i) = ( c(j,i) + c(j,i-1) ) / 2.0 end do end do !$OMP END DO NOWAIT !$OMP END PARALLEL end |
例では、SECTIONS 宣言子の使用方法を示します。 ロジックは、前述の DO の例と同じですが、DO の代わりに SECTIONS を使用します。 ここでは、2 つの作業単位しかないため、スピードアップは、2 が限度です。前述の例では、作業単位は n-1 + m-1 です。
例 |
---|
subroutine sections_1(a,b,c,d,m,n) real a(n,n), b(n,n), c(m,m), d(m,m) !$OMP PARALLEL SHARED(A,B,C,D,M,N) PRIVATE(I,J) !$OMP SECTIONS !$OMP SECTION do i = 2, n do j = 1, i b(j,i)=( a(j,i) + a(j,i-1) ) / 2.0 end do end do !$OMP SECTION do i = 2, m do j = 1, i d(j,i)=( c(j,i) + c(j,i-1) ) / 2.0 end do end do !$OMP END SECTIONS NOWAIT !$OMP END PARALLEL end |