多播支持 - 2023.2 简体中文

AI 引擎内核与计算图编程指南 (UG1079)

Document ID
UG1079
Release Date
2023-12-04
Version
2023.2 简体中文

在计算图中支持多种多播场景,例如,从单个缓冲器到多个缓冲器,从单个串流到多个串流,从 input_plio 到多个缓冲器。本节列出了从单一源到多个目标的受支持的多播类型。如需了解有关 input_plio/output_plioinput_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 不支持
注释:
  • 多播连接中的所有源缓冲器和目标缓冲器大小都必须相同,才能置于单一速率环境内。
  • 如果并非所有源和目标都有相同大小,编译器将自动切换至多速率处理。编译器将判定每次内核迭代需执行的次数。
  • 此工具通过向源缓冲器和目标缓冲器添加 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