グラフでは、バッファーから複数のバッファー、ストリームから複数のストリーム、input_plio
から複数のバッファーに、さまざまなマルチキャスト シナリオがサポートされています。このセクションでは、1 つのソースから複数のデスティネーションへのマルチキャストでサポートされるタイプをリストします。 input_plio
/output_plio
および input_gmio
/output_gmio
の詳細は、グラフのプログラミング モデル を参照してください。
シナリオ番号 | ソース | デスティネーション 1 | デスティネーション 2 | サポート |
---|---|---|---|---|
1 | AI エンジン バッファー | AI エンジン バッファー | AI エンジン バッファー | サポートあり |
2 | AI エンジン バッファー | AI エンジン バッファー | AI エンジン ストリーム | サポートあり |
3 | AI エンジン バッファー | AI エンジン バッファー | output_plio/output_gmio | サポートあり |
4 | AI エンジン バッファー | AI エンジン ストリーム | AI エンジン ストリーム | サポートあり |
5 | AI エンジン バッファー | AI エンジン ストリーム | output_plio/output_gmio | サポートあり |
6 | AI エンジン バッファー | output_plio/output_gmio | output_plio/output_gmio | サポートあり |
7 | AI エンジン ストリーム | AI エンジン バッファー | AI エンジン バッファー | サポートあり |
8 | AI エンジン ストリーム | AI エンジン バッファー | AI エンジン ストリーム | サポートあり |
9 | AI エンジン ストリーム | AI エンジン バッファー | output_plio/output_gmio | サポートあり |
10 | AI エンジン ストリーム | AI エンジン ストリーム | AI エンジン ストリーム | サポートあり |
11 | AI エンジン ストリーム | AI エンジン ストリーム | output_plio/output_gmio | サポートあり |
12 | AI エンジン ストリーム | output_plio/output_gmio | output_plio/output_gmio | サポートあり |
13 | input_plio/input_gmio | AI エンジン バッファー | AI エンジン バッファー | サポートあり |
14 | input_plio/input_gmio | AI エンジン バッファー | AI エンジン ストリーム | サポートなし |
15 | input_plio/input_gmio | AI エンジン バッファー | output_plio/output_gmio | サポートなし |
16 | input_plio/input_gmio | AI エンジン ストリーム | AI エンジン ストリーム | サポートあり |
17 | input_plio/input_gmio | AI エンジン ストリーム | output_plio/output_gmio | サポートなし |
18 | input_plio/input_gmio | output_plio/output_gmio | output_plio/output_gmio | サポートなし |
注記:
- シングル レートの環境を維持するには、マルチキャスト接続のソース バッファーおよびデスティネーション バッファーをすべて同じサイズにする必要があります。
- すべてのソースおよびデスティネーションが同じサイズでない場合、コンパイラによって自動的にマルチレート処理に切り替えられます。コンパイラは、反復ごとに必要なカーネルの実行回数を判断します。
- バッファー マルチキャストは、ソースとデスティネーション バッファーに DMA を追加すると、ツールで認識されます。
- ソースとデスティネーション間の各接続はブロッキングされています。いずれのデスティネーションも、データを受信する準備ができていない場合はマルチキャストをブロックします。
- このセクションでは、RTP およびパケット スイッチングについては説明していません。
- マルチキャスト タイプがサポートされる場合は、ハードウェアに収まるのであれば、デスティネーションの数に制限はありません。
複数のストリームを同じソースに接続する場合、データはすべてのデスティネーション ポートに同時に送信されるので、すべてのデスティネーションがデータを受信する準備ができている場合にのみ送信されます。そのため、ストリーム接続の FIFO の深さが十分でない場合、ストリームがストールしたり、デザインがハングすることがあります。
次に、上記の表からシナリオ 10 の例を示します。ソースと両方のデスティネーションはストリームです。
この
graph.h
コードの抜粋では、top_graph
という最上位グラフ内で _graph0
および _graph1
という 2 つのサブグラフが定義されています 。これにより、データがすべてのデスティネーション ポートに同時に送信されます。class _graph0: public adf::graph {
private:
adf::kernel kr;
public:
adf::port<input> instream;
adf::port<output> outstream;
_graph0() {
kr = adf::kernel::create(compute0);
adf::runtime<ratio>(kr) = 0.9;
adf::source(kr) = "compute0.cc";
adf::connect<adf::stream> n0(instream, kr.in[0]);
adf::connect<adf::stream> n1(kr.out[0], outstream);
}
};
class _graph1: public adf::graph {
private:
adf::kernel kr;
public:
adf::port<input> instream;
adf::port<output> outstream;
_graph1() {
kr = adf::kernel::create(compute1);
adf::runtime<ratio>(kr) = 0.9;
adf::source(kr) = "compute1.cc";
adf::connect<adf::stream> n0(instream, kr.in[0]);
adf::connect<adf::stream> n1(kr.out[0], outstream);
}
};
class top_graph: public adf::graph {
private:
public:
_graph0 g0;
_graph1 g1;
adf::input_plio instream;
adf::output_plio outstream0;
adf::output_plio outstream1;
top_graph()
{
instream = adf::input_plio::create("aie_brodcast_0_S_AXIS",
adf::plio_32_bits,
"data/input.txt");
outstream0 = adf::output_plio::create("aie_graph0_outstream",
adf::plio_32_bits,
"data/output0.txt");
outstream1 = adf::output_plio::create("aie_graph1_outstream",
adf::plio_32_bits,
"data/output1.txt");
adf::connect<adf::stream> n0(instream.out[0], g0.instream);
adf::connect<adf::stream> n1(instream.out[0], g1.instream);
adf::connect<adf::stream> n2(g0.outstream, outstream0.in[0]);
adf::connect<adf::stream> n3(g1.outstream, outstream1.in[0]);
}
};
この
graph.cpp
コードの抜粋では、最上位グラフからグラフ呼び出しが実行され、すべてのサブグラフが同じデータを同時に受信します。using namespace adf;
top_graph top_g;
#if defined (__AIESIM__) || defined(__X86SIM__)
int main () {
top_g.init();
top_g.run(3);
top_g.wait();
top_g.end();
return 0;
}
#endif