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

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

メッセージ

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

アドバイス

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

ただし、ループの中で呼び出される関数が定数関数またはコンカレント・セーフな関数の場合、その呼び出しはループの並列化の妨げにはなりません。

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

#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);
  } 
}

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

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

#define N 10000 
double A[N], B[N]; 
__declspec(const) int bar(int); 
void foo(){
  int i;
  for (i=0;i<N;i++){
    A[i] = B[i] * bar(i);
  } 
}

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

#define N 10000 
double A[N], B[N]; 
__declspec(concurrency_safe(profitable)) int bar(int); 
void foo(){
  int i;
  for (i=0;i<N;i++){
    A[i] = B[i] * bar(i);
  } 
}

確認

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

関連情報