メモリ ストールの解析 - 2023.2 日本語

AI エンジン ツールおよびフロー ユーザー ガイド (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語
AI エンジンでは、1 サイクルごとに複数のベクター ロードまたはストアを実行できます。ただし、ロードまたはストア操作を並列実行するには、異なるメモリ バンクをターゲットとする必要があります。メモリ ストールは、同じサイクルで同じメモリ バンクに複数のアクセスがあった場合に発生します。

メモリには、カーネル間のウィンドウ バッファーと DMA FIFO、RTP バッファー、およびシステム メモリが含まれます。システム メモリには、最初の 32 バイト、スタック、およびヒープのカーネル同期情報が含まれています。スタティック変数はヒープ内にあり、関数制御ロジックはスタック内にあります。システム メモリは、連続するメモリ バンクに配置されます。ウィンドウ バッファー、RTP バッファー、DMA FIFO、およびシステム メモリを特定のバンクに自動的または手動で配置できます。これらのメモリ間のメモリ ストールを緩和するには、可能であれば別々のバンクに配置してみてください。ただし、すべてのメモリに個別のバンクが見つからない場合、または同じメモリに対して複数のアクセスが発生している場合は、これらのメモリ間でメモリ ストールが発生する可能性があります。

通常、コンパイラは同じサイクルでできるだけ多くのメモリ アクセスをスケジュールするよう試みますが、例外があります。同じポインターからのメモリ アクセスは、異なるサイクルにスケジュールされます。複数の変数またはポインターに対する演算が同じサイクルにスケジュールされる場合、メモリ バンクの競合が発生することがあります。各メモリ バンクには、すべての要求をアービトレーションするアービタがあり、アービトレーションはラウンドロビン方式です。すべての要求が処理されると、メモリ ストールが解除されます。

[Performance Metrics] ビューでは、メモリ ストールを解析する必要があるかどうかを判断できます。

  1. Trace ビューを選択します。
  2. Memory Stalls の表を選択します。
    図 1. Trace ビューのメモリ ストール

    ストールには、MS_<NUM> という名前が付けられます。<NUM> は時間で増加します。各ストールには、次の情報が含まれます。

    NAME
    メモリ ストールの ID。発生した順番に番号が付けられます。番号は、ストールのすべてのタイプの間で固有です。
    Stalled Tile
    ストールしたカーネルが存在する AI エンジン タイル。
    Stalled Kernel
    ストールしたカーネル。<Kernel_function_name>.<Schedule_ID>.<Graph_instance_name> という名前です。_main と表示されることもあり、その場合はクロスプローブして実際のカーネル関数を見つける必要があります。
    Start (ps)
    ストールの開始時間。
    Duration (ps)
    ストール時間の長さ。
    [PC]
    ストールが発生したときのプログラム カウンター。
    Bank Conflict
    ストールが発生したメモリ バンク。
    Buffer 1Buffer 2Buffer 3
    メモリ ストールを発生させているバッファー。1 つのバッファーまたは複数のバッファーの場合があります。
  3. Stalls ビューでストールの行をクリックすると、Trace ビューでメモリ ストールのメモリ ストールの開始に移動します。Trace ビューを拡大/縮小して、メモリ ストールが発生する頻度、実行中のカーネルのストール位置を確認します。
    注記: 実行中のカーネルで多数のメモリ ストールが繰り返し発生する場合は、ループ内でストールが発生している可能性があります。調べて解決することをお勧めします。メモリ ストールがカーネルの開始時に一度だけ発生する場合や、実行中のカーネルで発生するストールの数が少ない場合は、通常は無視してもかまいません。ストールの原因となるバッファーの名前から、ウィンドウ バッファーかシステム バッファーか、またはその他のものかを特定できます。ウィンドウ バッファーまたは RTP バッファーをグラフ内で制御できる場合、より適切な配置を特定できるのであれば、制約を使用して手動で配置するのが 1 つの方法です。システム メモリ (system<NUM>+<NUM>) の場合は、ストールに関係する変数を特定する必要があります。
  4. 特定のストールの行をクリックし、Events ビューに切り替えます。
    図 2. メモリ ストールの Events ビュー
  5. Events ビューには、デバイスで発生するイベントが表示されます。メモリ ストールが発生したサイクルがハイライトされます。DM_BANK_CONFLICT イベントが発生したタイルと、読み出しまたは書き込み中のデータを確認できます。
  6. 追加の情報を見つけるため、ストール サイクルの前後の数サイクルを調べてみます。

    ツールにより、1 サイクルで同じバンクで変数の読み出しまたは書き込みが実行されるようにスケジューリングされることがあります。この問題を解決する 1 つの方法は、 『AI エンジン カーネルおよびグラフ プログラミング ガイド』 (UG1079) の「仮想リソース アノテーションを使用したロードおよびストア」を参照してください。たとえば、変数へのポイントを再定義し、__aie_dm_resource_a を使用してあのテートします。次にコードの例を示します。

    const v8cint16 __aie_dm_resource_a* __restrict coeff = (v8cint16 __aie_dm_resource_a*) eq_coef0; const v8cint16 coe = *coeff;
    v16cint16 __aie_dm_resource_a* __restrict p_buff = (v16cint16 __aie_dm_resource_a*) &delay_line; v16cint16 buff=*p_buff;

次の表に、メモリ ストールが発生する状況と可能なソリューションを示します。

表 1. メモリ ストールが発生する状況とソリューション
ソース ターゲット ストール タイプ 可能なソリューション 注記
1 つのカーネル 1 つのメモリ バンクのバッファー メモリ ストール
  • メモリ (システム メモリ、RTP、ウィンドウ バッファー、DMA、FIFO を含む) を異なるバンクに配置します。メモリ ストール を参照してください。
  • 仮想メモリ アノテーションを使用してコンパイラのスケジューリングをガイドします。 『AI エンジン カーネルおよびグラフ プログラミング ガイド』 (UG1079) の「仮想リソース アノテーションを使用したロードおよびストア」を参照してください。

1 つのカーネルが同じバンクのメモリにアクセスします。

または 1 つのカーネルに同じバンクの 1 つのメモリへのアクセスが複数あります。

(サイクルには 2 つのロードと 1 つのストアがあり)

隣接する AI エンジン タイルの複数のカーネル。 1 つのバンクの複数バッファー メモリ ストール
  • メモリ (システム メモリ、RTP、ウィンドウ バッファー、DMA、FIFO を含む) を異なるバンクに配置します。
  • BufferOptLevel。マップおよび配線オプション を参照してください。
  • メモリ バンクをすべて使用してしまった場合、プロファイルおよび AI エンジン ストール解析を実行し、カーネルの実行時間を短縮またはストール率を下げるより良いソリューションを見つけます。
複数のカーネルが同じバンクの複数のメモリにアクセスします。