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