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

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

メッセージ

%s をルーチン "%s" の宣言に追加して、行 %d のループを並列化します。"%s" を追加することで同様の効果を得ることもできます。

アドバイス

アドバイスに従ってアノテーションを追加する前に、指定されているルーチンが定数関数またはコンカレント・セーフな関数であることを確認してください。

これ以外のルーチンの場合は、#pragma forceinline recursive を使用してインライン展開してみてください。これにより効果が得られることがあります。

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

#define N 10000 
double A[N], B[N]; 
int bar(int); 
void foo(){
  int i;
  for (i=0;i<N;i++){
    A[i] = B[i] * bar(i);
  } 
}
      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

この例では、呼び出されるルーチン bar についてのより詳しい情報がなければコンパイラーはループを並列化しません。

安全であることが分かっている場合は、次のようにプラグマを追加できます。

#define N 10000 
double A[N], B[N]; 
void foo(){
  int i; 
#pragma forceinline recursive
  for (i=0;i<N;i++){
    A[i] = B[i] * bar(i);
  } 
}      subroutine foo ()
      integer, parameter :: N2 = 10000
      real (8) :: A(N2), B(N2)
      interface
         function bar (k)
      !dir$ attributes concurrency_safe : profitable
         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

確認

ルーチンがアノテーションのセマンティクスに沿っていることを確認してください。別の方法として、forceinline recursive プラグマを使用してルーチンをインライン展開することでループを並列化することもできます (この方法で必ず並列化されるとは限りません)。

関連情報