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

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

メッセージ

%s をルーチン "%s" の宣言に追加して、行 %d のループを並列化します。

アドバイス

ループに関数呼び出しが含まれる場合、呼び出される関数についてのより詳しい情報がないと、コンパイラーはこのループを並列化できません。

ただし、ループの中で呼び出される関数が SIMD 対応関数またはATTRIBUTES CONCURRENCY_SAFE を含む関数の場合、その呼び出しはループの並列化の妨げにはなりません。

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

      subroutine foo ()
      integer, parameter :: N2 = 10000
      real (8) :: A(N2), B(N2)
      interface
         function bar (k)
         integer :: bar, k
         end function bar
      end interface
       
      integer :: i
      do i =1, N2
         A(i) = B(i) * bar(N2)
      end do
      end subroutine foo
この例では、行 11 のループを並列化するためにはルーチン bar を要素型として宣言する必要があります。

このループを安全に並列化できることが分かっている場合は、次のようにプログラムコードを変更することもできます。

      subroutine foo ()
      integer, parameter :: N2 = 10000
      real (8) :: A(N2), B(N2)
      interface
         function bar (k)
      !dir$ attributes concurrency_safe : profitable :: bar
         integer :: bar, k
         end function bar
      end interface
       
      integer :: i
      do i =1, N2
         A(i) = B(i) * bar(N2)
      end do
      end subroutine foo

確認

ルーチンがアノテーションのセマンティクスに沿っていることを確認してください。類似のアノテーション ATTRIBUTES CONCURRENCY_SAFE(PROFITABLE) を使用して同様の効果を得ることもできます。

関連情報