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

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

メッセージ

必要に応じて、%s オプションを追加してコンパイラーによる型ベースの一義化解析を向上できます (オプションはコンパイル全体に適用されます)。これにより、行 %d のループがベクトル化され最適化が向上します。

アドバイス

指定されたファイルに -fnoargument-alias (Linux* および macOS*) または /Qno-alias-args (Windows*) を使用します。このオプションは、コンパイラーが指定された行のループを最適化するのを助けます。このオプションを現在のファイルに適用する前に、このファイルのルーチンに引数のエイリアシングがないことを確認する必要があります。このオプションは特に C++ プログラムで役立ち、引数として渡されるポインター間の型ベースの一義化を有効にし、その結果、ベクトル化や並列化などの最適化が有効になります。

-fargument-alias (Linux* および macOS*) と /Qalias-args (Windows*) は、関数の引数がエイリアスされる C/C++ 規則を有効/無効にします。安全であることが確実な場合に、この規則を無効にします。

-fnoargument-alias または /Qno-alias-args の違反を示す次の例について考えてみます。

void f(double *p, double *q, double *r) {
  int i;
  for (i = 0; i < n; i++)
    p[i] = q[i] + r[i]; 
}
 
int n, m; 
double A[100], B[100]; 
... 
f(&A[n], &A[m], &B[0]);

ポインター pq はともに同じ配列 A を参照するため、nm の値によってはオーバーラップが発生します。

また、この例では関数 f で引数 pq に restrict キーワードを使用できません。

-fnoargument-alias または /Qno-alias-args、restrict 修飾子を適用する前に、現在のファイルにある関数 f の呼び出し元をすべて分析し、そのようなオーバーラップが存在しないことを確認します。呼び出し元は、他のファイルにも存在する可能性があります。

確認

コンパイル全体でこのオプションのセマンティクスに沿っていることを確認してください。

別の方法として、ルーチン "%s" のすべてのポインター型の仮引数に "restrict" キーワードを追加することで同様の効果が得られます。これにより、行 %d のループがベクトル化され最適化が向上します。"restrict" ポインター修飾子のセマンティクスに沿っていることを確認してください。ルーチンにおいて、そのポインターによりアクセスされるすべてのデータは、ほかのポインターからはアクセスできません。

関連情報