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

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

メッセージ

変数 "%s" に、ループ本体の最初 (行 %d) で値を代入します。これにより、ループが並列化されます。

アドバイス

指定されたループの最初でスカラー変数を無条件で初期化できるかどうか確認します。できる場合は、初期化を行うようにコードを変更するか (標準的なアドバイス)、parallel ディレクティブの private 節に変数をリストします (高度なアドバイス)。これにより、並列化機能が各反復においてこれらの変数をプライベート化し、ループを並列化できるようになります。

次の例について考えてみます。

     subroutine foo (A, B, cond1, cond2)
       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, cond2)
       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

確認

オリジナルのプログラムにおいて、ループの各反復で変数のフェッチを行う場合は、その変数が同じ反復でそれ以前に定義されていなければなりません。

関連情報