ポインター エイリアシング - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

ポインター エイリアシングとは、同じメモリ ロケーションに異なるポインター名を使用してアクセスできる状況のことを指します。C/C++ での厳密なエイリアシング規則により、ポインターが根本的に異なるタイプをポイントする場合は、ポインターはエイリアシングしないと想定されます。エイリアシングにより、プログラムの実行順が厳密に制約されます。次の図に、pq のエイリアシングを示します。

図 1. ポインター エイリアシング

次の例は、ポインター pq の両方が同じアドレスをポイントするポインター エイリアシングの例です。中央にコンパイラで生成されるアセンブリ言語コード、右側に演算とクロック サイクルを示しています。

図 2. エイリアシングのコード例

restrict キーワードをこのコード例に追加すると、コンパイラで生成されるアセンブリ言語を最適化し、ハードウェアでの演算を並列化できます。次の例では、restrict キーワードを使用してエイリアシングしないようにすると、同じ演算を完了するのに使用するクロック サイクル数が少なくなることを示します。

図 3. restrict キーワードを使用してエイリアシングを回避

メモリの依存性

コード内のメモリ依存により、コンパイラで実行される最適化の種類が制限されます。たとえば次のコードでは、xyz とポインター p および q は無関係である可能性がありますが、関数コード内では、ポインター p とポインター q が同じグローバル変数 xyz をポイントしています。コンパイラは、これら両方の状況で正しく実行されるように処理する必要があります。このようなメモリ依存があるので、コンパイラは最適化を制限する必要があります。

図 4. 無関係のポインター