在计算图中支持多种多播场景,例如,从单个缓冲器到多个缓冲器,从单个串流到多个串流,从 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 | 不支持 |
注释:
- 多播连接中的所有源缓冲器和目标缓冲器大小都必须相同,才能置于单一速率环境内。
- 如果并非所有源和目标都有相同大小,编译器将自动切换至多速率处理。编译器将判定每次内核迭代需执行的次数。
- 此工具通过向源缓冲器和目标缓冲器添加 DMA 来实现缓冲器多播。
- 源和目标之间的每个连接均保持阻塞状态。任意目标只要未准备好接受数据,就会阻塞多播。
- 本节不涵盖有关 RTP 和包切换的内容。
- 如果支持多播类型,那么只要目标数量适配硬件,就不存在数量限制。
如有多个串流连接到同一源,那么数据将同时发送到所有目标端口,并且仅当所有目标都准备好接收数据时才会发送数据。如果串流连接的 FIFO 深度不够深,那么这可能导致串流停滞或设计挂起。
以下多播示例显示了来自上表的场景 10 的多播示例。源和目标均为串流。
在此
graph.h
代码片段中,在名为 top_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
代码片段中,会从顶层计算图调用计算图调用,因此所有子计算图都会同时接收相同数据。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