AXI4-Stream インターコネクトを使用したデータ通信
AI エンジン どうしは、DMA やメモリを使用せず AXI4-Stream インターコネクトを介して直接データをやり取りできます。データは、ストリーミング インターフェイスを介して 1 つの AI エンジンから別の AI エンジンに送信またはブロードキャストできます。ストリーミング接続のデータ帯域幅は、1 サイクルごとに 32 ビットで、ビルトイン ハンドシェイクおよびバック プレッシャー メカニズムを使用できます。
ストリーミング入力および出力インターフェイスでパフォーマンスがストリーム数によって制限される場合は、AI エンジンは 1 つのストリーミング入力または 1 つのストリーミング出力の代わりに、2 つのストリーミング入力または 2 つのストリーミング出力を並列に使用できます。2 つの並列ストリームを使用するには、次の 2 つのマクロをペアで使用することをお勧めします。ここで、idx1 および idx2 は 2 つのストリームです。ストリーム ポートに __restrict キーワードを追加すると、並列処理用に最適化されるようになります。
READINCR(SS_rsrc1, idx1) and READINCR(SS_rsrc2, idx2)
READINCRW(WSS_rsrc1, idx1) and READINCRW(WSS_rsrc2, idx2)
WRITEINCR(MS_rsrc1, idx1, val) and WRITEINCR(MS_rsrc2, idx2, val)
WRITEINCRW(WMS_rsrc1, idx1, val) and WRITEINCRW(WMS_rsrc2, idx2, val)
次に、2 つの並列入力ストリームを使用して間隔 1 でパイプライン処理を達成するサンプル コードを示します。間隔 1 は、1 サイクルごとに 2 つの読み出し、1 つの書き込み、および 1 つの加算が実行されることを意味します。
void simple( input_stream_int32 * __restrict data0,
input_stream_int32 * __restrict data1,
output_stream_int32 * __restrict out) {
for(int i=0; i<1024; i++)
chess_prepare_for_pipelining
{
int32_t d = READINCR(SS_rsrc1, data0) ;
int32_t e = READINCR(SS_rsrc2, data1) ;
WRITEINCR(MS_rsrc1,out,d+e);
}
}
組み込み関数はストリーム操作を直接実行するために使用されますが、AI エンジンで検出されたマップに基づいて 2 つのストリームを入れ替えないようにすることが重要です。
v16float off = *(v16float*)offset;
v8float v8in = undef_v8float();
v8float v8out = undef_v8float();
for(int i=0;i<128/4;i++)
chess_prepare_for_pipelining
{
v8in = concat(getf_wss(0),getf_wss(1)); // reads 8 float values
v8out = fpadd(v8in,off,0,0);
put_wms(0,ext_v(v8out,0));
put_wms(1,ext_v(v8out,1));
}
ストリーム接続は、ユニキャストまたはマルチキャストにできます。マルチキャスト通信の場合、データはすべてのデスティネーション ポートに同時に送信されるので、すべてのデスティネーションがデータを受信する準備ができている場合にのみ送信されることに注意してください。