マルチキャスト サポート - 2023.2 日本語

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

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

グラフでは、バッファーから複数のバッファー、ストリームから複数のストリーム、input_plio から複数のバッファーに、さまざまなマルチキャスト シナリオがサポートされています。このセクションでは、1 つのソースから複数のデスティネーションへのマルチキャストでサポートされるタイプをリストします。 input_plio/output_plio および input_gmio/output_gmio の詳細は、グラフのプログラミング モデル を参照してください。

表 1. マルチキャスト サポート
シナリオ番号 ソース デスティネーション 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