AI エンジン アーキテクチャでは、2 つの AI エンジン間の通信、AI エンジンとプログラマブル ロジック (PL) 間の通信にストリーミング データが広く使用されます。これにより、データフロー グラフに再収束するストリーム パスがある場合に、リソース デッドロックが発生する可能性があります。1 つのパスのパイプラン段数がほかのパスよりも多い場合、プロデューサー カーネルがストールし、バック プレッシャーのため短いパスにデータをプッシュできない可能性があります。それと同時に、コンシューマー カーネルは、データが不足しているため、長いパスのデータの受信を待ちます。2 つのストリーム パス間でデータの生成と消費の順序が異なる場合、2 つのカーネルが 2 つのストリーム パスで直接接続されていても、デッドロックが発生する可能性があります。
Vitis Model Composer では、2 つの AI エンジン カーネル間または AI エンジンとプログラマブル ロジック (PL) 間に AIE FIFO ブロックを使用して FIFO_DEPTH を追加することがサポートされ、接続に fifo_depth
制約を含むグラフ コードが自動的に生成されます。
AIE FIFO は、特定のパスにおける FIFO の深さを指定します。FIFO の深さ値を指定すると、パスにさらにバッファーが作成され、デッドロックやストール状態を回避できます。このブロックは、論理シミュレーションには影響せず、生成されるグラフコードにのみ影響します。制約マネージャーを使用して、FIFO ブロックのロケーション制約を設定できます。FIFO には、ストリーム FIFO、DMA FIFO、またはそれらの組み合わせたものを使用できます。
- Parameters
- FIFO の深さを指定します。
- Constraints
- 制約マネージャーを使用して、FIFO ブロックのロケーション制約を設定します。
次の図に示す例では、AI エンジン カーネル ブロック間の 2 つのストリーム パスが AIE FIFO ブロックで接続されています。
FIFO の深さはデフォルトでは 0
に指定され、対応する情報がブロック シンボルに反映されます。たとえば、2 つの FIFO ブロックのパラメーターとして 2
および 4
が指定されている場合、ブロック シンボルは次の図に示すようにアップデートされます。
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
を使用すると、バック プレッシャーのあるパスでバッファリングが増加するため、デッドロックが回避されます。