Insert a "%s ivdep" statement right before the loop at line %d to parallelize the loop. ("%s ivdep" 文をループの直前 (行 %d) に挿入して、このループをベクトル化します。)
"!DIR$ IVDEP" を指定されたループの前に追加します。このディレクティブは、一部の想定されるループの繰り返し間のデータ依存を無視して、指定された行のループのベクトル化を有効にします。
次の例について考えてみます。
subroutine foo(a, m, n)
integer m, n
real a(n)
do i=1,n
a(i) = a(i+m) + 1
enddo
end
この例では、m が -1 の場合、各反復は前の反復に依存するため、コンパイラーはこのループをベクトル化できません。m が正であることが分かっていれば、このループをベクトル化できます。
安全であることが分かっている場合は、次のようにディレクティブを追加できます。
subroutine foo(a, m, n)
integer m, n
real a(n)
!dir$ ivdep
do i=1,n
a(i) = a(i+m) + 1
enddo
end
ループ内の配列に安全ではない繰り返し間の依存関係がないことを確認してください。繰り返し間の依存関係は、ループの 1 つの反復でメモリー位置の変更を行い、別の反復でそのフェッチ/ストア操作を行った場合に発生します。そのような依存関係がないこと、または繰り返し間の依存関係を無視しても安全であることを確認してください。