変数 "%s" に、ループ本体の最初 (行 %d) で値を代入します。これにより、ループが並列化されます。
指定されたループの最初でスカラー変数を無条件で初期化できるかどうか確認します。できる場合は、初期化を行うようにコードを変更するか (標準的なアドバイス)、parallel 宣言子の private 節に変数をリストします (高度なアドバイス)。これにより、パラレライザーが各反復においてこれらの変数をプライベート化し、ループを並列化できるようになります。
次の例について考えてみます。
subroutine foo (A, B, cond1, c.nd2)
integer, parameter :: N = 100000
integer I
real(8) A(N), B(N), T
logical cond1, cond2
do I = 1, N
if (cond1) T = i + 1
if (cond2) T = i - 1
A(I) = T
end do
end
この例では、より詳しい情報がなければ変数 t をプライベート化できないため、コンパイラーはこのループを並列化しません。cond1 と cond2 のいずれか、または両方が true であることがわかっている場合、t を使用するすべての反復において t を使用する前に同じ反復で書き込みが行われることをパラレライザーに知らせることができます。この 1 つの方法として、各反復の最初で t に値を代入します。
この方法が安全であることがわかっている場合は、次のようにプログラムコードを変更します。
subroutine foo (A, B, cond1, c.nd2)
integer, parameter :: N = 100000
integer I
real(8) A(N), B(N), T
logical cond1, cond2
do I = 1, N
T = 0
if (cond1) T = i + 1
if (cond2) T = i - 1
A(I) = T
end do
end
オリジナルのプログラムにおいて、ループの各反復で変数のフェッチを行う場合は、その変数が同じ反復でそれ以前に定義されていなければなりません。
© 1996-2011 Intel Corporation. 無断での引用、転載を禁じます。