FIFO 深さ - 2023.2 日本語

AI エンジン カーネルおよびグラフ プログラミング ガイド (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 日本語

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

図 1. ストリームが再収束するプロデューサー カーネルとコンシューマー カーネル


プロデューサー カーネルがストリーム S1 にデータをプッシュしようとしたときに、コンシューマー カーネルがストリーム S2 からデータを読み出そうとしていてバック プレッシャーが発生すると、デッドロック状態になります。この状況を修正するには、ソース コードで接続に fifo_depth 制約を使用して、バック プレッシャーのあるパスにさらにバッファーを作成するのが一般的な方法です。

p = kernel::create(producer);
c = kernel::create(consumer);
connect s1(p.out[0], c.in[0]);
connect s2(p.out[1], c.in[1]);
fifo_depth(s1) = 20;
fifo_depth(s2) = 10;
注記: fifo_depth() 制約は、ストリームおよびバッファー タイプのカーネル接続でのみ有効です。カスケード ストリーム タイプでは、入力および出力カスケード接続ストリームの両方に 512 ビット幅の 2 段 FIFO があり、AI エンジン間で最大 4 つの値を FIFO に格納できます。