インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

GAP メッセージ (診断 ID 30522)

メッセージ

"%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

確認

ループで配列の要素をフェッチする場合は、同じ反復でそれ以前にストアされた値でなければなりません。また、ループ終了後に要素をフェッチする場合は、ループ終了後からそのフェッチが行われるまでの間に書き込まれた値でなければなりません。