ストリーム FIFO の深さ仕様 - 2022.1 日本語

Vitis Model Composer ユーザー ガイド (UG1483)

Document ID
UG1483
Release Date
2022-05-26
Version
2022.1 日本語

AI エンジン アーキテクチャでは、2 つの AI エンジン間の通信、AI エンジンとプログラマブル ロジック (PL) 間の通信にストリーミング データが広く使用されます。これにより、データフロー グラフに再収束するストリーム パスがある場合に、リソース デッドロックが発生する可能性があります。1 つのパスのパイプラン段数がほかのパスよりも多い場合、プロデューサー カーネルがストールし、バック プレッシャーのため短いパスにデータをプッシュできない可能性があります。それと同時に、コンシューマー カーネルは、データが不足しているため、長いパスのデータの受信を待ちます。2 つのストリーム パス間でデータの生成と消費の順序が異なる場合、2 つのカーネルが 2 つのストリーム パスで直接接続されていても、デッドロックが発生する可能性があります。

Vitis Model Composer では、2 つの AI エンジン カーネル間または AI エンジンとプログラマブル ロジック (PL) 間に AIE FIFO ブロックを使用して FIFO_DEPTH を追加することがサポートされ、接続に fifo_depth 制約を含むグラフ コードが自動的に生成されます。

図 1. AIE FIFO

AIE FIFO は、特定のパスにおける FIFO の深さを指定します。FIFO の深さ値を指定すると、パスにさらにバッファーが作成され、デッドロックやストール状態を回避できます。このブロックは、論理シミュレーションには影響せず、生成されるグラフコードにのみ影響します。制約マネージャーを使用して、FIFO ブロックのロケーション制約を設定できます。FIFO には、ストリーム FIFO、DMA FIFO、またはそれらの組み合わせたものを使用できます。

図 2. AIE FIFO ブロックの [Block Parameters] ダイアログ ボックス
Parameters
FIFO の深さを指定します。
Constraints
制約マネージャーを使用して、FIFO ブロックのロケーション制約を設定します。

次の図に示す例では、AI エンジン カーネル ブロック間の 2 つのストリーム パスが AIE FIFO ブロックで接続されています。

図 3. 2 つのストリーム パス上の AIE FIFO ブロック

FIFO の深さはデフォルトでは 0 に指定され、対応する情報がブロック シンボルに反映されます。たとえば、2 つの FIFO ブロックのパラメーターとして 2 および 4 が指定されている場合、ブロック シンボルは次の図に示すようにアップデートされます。

図 4. AIE FIFO
図 5. AIE FIFO
図 6. ブロック シンボルのアップデート

AIE Signal Spec ブロックを使用して指定されたストリーム FIFO の値は、次のコードに示すように、生成されたグラフ コード (graph.h) に fifo_depth 制約として含まれます。

graph.h の抜粋

// create nets to specify connections
      adf::connect< adf::stream > net0 (In1, AIE_Kernel.in[0]);
      adf::connect< adf::stream > net1 (AIE_Kernel.out[0], AIE_Kernel1.in[0]);
      adf::fifo_depth(net1) = 2;
      adf::connect< adf::stream > net2 (AIE_Kernel.out[1], AIE_Kernel1.in[1]);
      adf::fifo_depth(net2) = 4;
      adf::connect< adf::stream > net3 (AIE_Kernel1.out[0], Out1);

2 つの fifo_depth 制約がデザインの 2 つのストリーム パスに対応しています。接続にこの制約 fifo_depth を使用すると、バック プレッシャーのあるパスでバッファリングが増加するため、デッドロックが回避されます。

重要: AIE FIFO ブロックは、AI エンジン サブシステムでのみ使用可能です。