新しいフィルター デザインが従来の手法と大きく異なる点の 1 つは、MAC 演算用のサンプルがデータ バッファーではなくオーバーラップ バッファーから読み出されることです。新しい手法では、8 つの結果が出力されるごとに入力ウィンドウ内で読み出し操作を 1 回だけ実行し、その他のすべてのデータはオーバーラップ バッファーから読み出します。MAC 演算の実行中に、新たに読み出された 8 つの入力データは、次の反復のためにオーバーラップ メモリに書き込まれます。各オーバーラップ バッファーには、3 つのポインター (読み出しポインター、対称ポインター、書き込みポインター) があります。オーバーラップ バッファーのポインターの開始位置は、入力ウィンドウのサイズによって反復ごとに異なります。
FIR89 の場合、深さ 80 サンプルのオーバーラップが必要です。次の図に、各ポインターの動作を示します。最初は、読み出しポインターはアドレス 0 を指し、対称ポインターはアドレス overlap-depth
- 8 を指し、書き込みポインターはアドレス overlap-size
を指し、入力ウィンドウ ポインターは入力ウィンドウの開始位置を指します。各反復では、読み出しポインターと対称ポインターは、遅延ライン内のすべてのデータが処理されるまで、8 サンプルのステップ サイズで互いに向かって移動します。次の反復の始めに、すべてのポインターは、前回の反復の初期位置から 8 サンプルだけオフセットされた初期位置にリセットされます。
cyclic_add()
関数によってインプリメントされます。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 演算を実行するサイクルによって吸収されます。