ポインターの位置

AI エンジンによるデジタル ダウンコンバージョン チェーンのインプリメンテーション (XAPP1351)

Document ID
XAPP1351
Release Date
2021-02-15
Revision
1.0 日本語

新しいフィルター デザインが従来の手法と大きく異なる点の 1 つは、MAC 演算用のサンプルがデータ バッファーではなくオーバーラップ バッファーから読み出されることです。新しい手法では、8 つの結果が出力されるごとに入力ウィンドウ内で読み出し操作を 1 回だけ実行し、その他のすべてのデータはオーバーラップ バッファーから読み出します。MAC 演算の実行中に、新たに読み出された 8 つの入力データは、次の反復のためにオーバーラップ メモリに書き込まれます。各オーバーラップ バッファーには、3 つのポインター (読み出しポインター、対称ポインター、書き込みポインター) があります。オーバーラップ バッファーのポインターの開始位置は、入力ウィンドウのサイズによって反復ごとに異なります。

FIR89 の場合、深さ 80 サンプルのオーバーラップが必要です。次の図に、各ポインターの動作を示します。最初は、読み出しポインターはアドレス 0 を指し、対称ポインターはアドレス overlap-depth - 8 を指し、書き込みポインターはアドレス overlap-size を指し、入力ウィンドウ ポインターは入力ウィンドウの開始位置を指します。各反復では、読み出しポインターと対称ポインターは、遅延ライン内のすべてのデータが処理されるまで、8 サンプルのステップ サイズで互いに向かって移動します。次の反復の始めに、すべてのポインターは、前回の反復の初期位置から 8 サンプルだけオフセットされた初期位置にリセットされます。

図 1. 新しい FIR89 ポインター
オーバーラップ ポインターがオーバーラップの下端に到達すると、ロールオーバーが発生します。次の図に示すように、書き込みポインターが下端に到達し、オーバーラップ バッファーの開始位置にロールオーバーします。これはポインター アップデート用の cyclic_add() 関数によってインプリメントされます。
図 2. 書き込みポインターのロールオーバー
次の図は、FIR89 のカーネル実行の観点から見たポインターの移動の例です。各カーネル実行には、内周ループ (for ループ) の複数の反復が含まれます。入力ウィンドウのサイズが 64 サンプルであると想定すると、各内周ループが 8 つのサンプルを消費するため、1 回のカーネル実行に 64/8=8 つの内周ループが必要です。最初は、読み出しポインターは #0 (*v8cint16) を指し、対称ポインターは #10 (*v8cint16) を指し、書き込みポインターは #11 (*v8cint16) を指します。各ポインターの値は 8 サンプルのステップで増加します (8 × 32 ビット = 256 ビットでメモリ アクセス効率が最大になる)。次の図に示すように、2 番目の内周ループ反復の開始時に、読み出しポインターは #1 (*v8cint16) を指し、対称ポインターは #11 (*v8cint16) を指し、書き込みポインターは #12 (*v8cint16) を指します。いずれかのポインターがオーバーラップの下端に到達すると、そのポインターはオーバーラップの開始位置にロールオーバーします。
図 3. オーバーラップ バッファー ポインターの移動

2 番目のカーネル実行の開始時には、ポインターの位置はそれぞれ 8/2/3 に初期化され、3 番目の実行の開始時には、ポインターの位置は再び 0/10/11 になります。データ処理が続けられる間、このパターンが繰り返されます。

Versal AI エンジン ソフトウェア ツールは、cardano.h 内で cyclic_add という名前の関数をサポートします。この関数を使用して、ポインターがバッファーの終わりに到達したときのポインターのサイクリック ロールオーバーをインプリメントできます。たとえば、次のコードは、深さ 16 × v8cint16 のバッファーを構築する、サイクリックな増加のインライン関数を定義します。

struct buffer_internal
{
  buffer_datatype * restrict head;
  buffer_datatype * restrict ptr
}
inline __attribute__((always_inline)) void buffer128_incr_v8(buffer_internal * w, int count) {
  w->ptr=cyclic_add(w->ptr, count, w->head, 16);
 }
説明
  • w は、オーバーラップ構造インスタンスを表します。
  • w->ptr は、オーバーラップへの現在のポインターです。
  • w->head は、オーバーラップの開始アドレスです。
  • count は、増加のステップ数 (v8cint16) です。
  • 定数 16 は、深さが 128 サンプル (16 × v8cint16) に固定されたオーバーラップを意味します。

次の図に、FIR89 のマイクロコードを示します。内周ループは完全であることが観察されており、緑色のボックスに示すように、内周ループの各サイクルに 1 つの MAC 演算が含まれます。青いボックスに示すように、オーバーラップ バッファーのアップデート操作 (マイクロコード内の VST) は、MAC 演算を実行するサイクルによって吸収されます。

図 4. FIR89 カーネルのコンパイル結果