多播支持 - 2022.1 简体中文

Versal ACAP AI 引擎编程环境 用户指南 (UG1076)

Document ID
UG1076
Release Date
2022-05-25
Version
2022.1 简体中文

在 graph 中支持多种多播场景,例如,从单个窗口到多个窗口,从单个串流到多个串流,从 input_plio 到多个窗口等。本节列出了从单一源到多个目标的受支持的多播类型。如需了解有关 input_plio/output_plio 和 input_gmio/output_gmio 的更多详细信息,请参阅 graph 编程模型

表 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 不支持

请注意:

  • 多播连接中的所有源窗口和目标窗口大小都必须相同。
  • 本节不涵盖有关 RTP 和包切换的内容。
  • 如果支持多播类型,那么只要目标数量适配硬件,就不存在数量限制。

如有多个串流连接到同一源,那么数据将同时发送到所有目标端口,并且仅当所有目标都准备好接收数据时才会发送数据。如果串流连接的 FIFO 深度不够深,那么这可能导致串流停滞或设计挂起。请参阅 AI 引擎内核编码最佳实践指南 (UG1079) 中的示例以获取有关串流停滞和可能的解决方案的更多信息。

以下多播示例显示了来自上表的场景 10 的多播示例。源和目标均为串流。

在此 graph.h 代码片段中,在名为 top_graph 的顶层 graph 下定义了两个子 graph,分别名为 _graph0_graph1。这样可确保将数据同时发送到所有目标端口。
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 代码片段中,会从顶层 graph 调用 graph call,因此所有子 graph 都会同时接收相同数据。
using namespace adf;

top_graph top_g;

#if defined  (__AIESIM__)
int main () {
        top_g.init();
        top_g.run(3);
        top_g.wait();
        top_g.end();
        return 0;
}
#endif