"%s parallel private(%s)" 文をループの直前 (行 %d) に挿入して、このループを並列化します。
"!DIR$ PARALLEL PRIVATE" を指定されたループの前に追加します。この宣言子は、指定された行のループの並列化を有効にします。
次の例について考えてみます。
subroutine foo (A, B, C, n, m1, m2)
real (4) A(10000, 10), B(10000, 10), C(10000, 10)
integer n, m1, m2
real W(1000)
integer i, j
do i=1,n
do j=1,m1
W(j) = A(j,i) * B(j,i)
end do
do j=1,m2
C(j,i) = W(j) + 1.0
end do
end
この例では、確実に m1 >= m2 になるかどうかわからないため、コンパイラーはこのループを並列化しません。
m1 >= m2 であることがわかっており、ループ終了後に W の要素が書き込まれる前にフェッチされることがない場合、次の宣言子を使用できます。
この方法が安全であることがわかっている場合は、次のように宣言子を追加します。
subroutine foo (A, B, C, n, m1, m2)
real (4) A(10000, 10), B(10000, 10), C(10000, 10)
integer n, m1, m2
real W(1000)
integer i, j
!DIR$ PARALLEL PRIVATE (W)
do i=1,n
do j=1,m1
W(j) = A(j,i) * B(j,i)
end do
do j=1,m2
C(j,i) = W(j) + 1.0
end do
end
ループで配列の要素をフェッチする場合は、同じ反復でそれ以前にストアされた値でなければなりません。また、ループ終了後に要素をフェッチする場合は、ループ終了後からそのフェッチが行われるまでの間に書き込まれた値でなければなりません。
© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。