缓冲器端口多播 - 2023.2 简体中文

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

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

aiecompiler 并不局限于缓冲器端口间的一对一连接。在某些情况下,多个其他内核可能使用同一个输出缓冲器来执行各项任务。您可按需将生产者连接至任意多个使用者。aiecompiler 将自动推断 MM2S DMA 以读取输出缓冲器和 S2MM DMA(数量与使用者相同),以便写入使用者各自的输入缓冲器。

private:
adf::kernel mk;
adf::kernel tk0,tk1,tk2,tk3;
...
connect net0 ( mk.out[0] , tk0.in[0] );
connect net1 ( mk.out[0] , tk1.in[0] );
connect net2 ( mk.out[0] , tk2.in[0] );
connect net3 ( mk.out[0] , tk3.in[0] );
...
dimensions(tk0.in[0]) = {128};
dimensions(tk1.in[0]) = {128};
dimensions(tk2.in[0]) = {128};
dimensions(tk3.in[0]) = {128};

内核函数原型:

tk0(input_buffer<int32, adf::extents<adf::inherited_extent>> & in0, 
      output_buffer<int32, adf::extents<OUTPUT_SAMPLE_SIZE>> & out0);
tk1(input_buffer<int32, adf::extents<adf::inherited_extent>, 
                adf::margin<32>> & in0, 
        output_buffer<int32, adf::extents<OUTPUT_SAMPLE_SIZE>> & out0);
tk2(input_buffer<int32, adf::extents<adf::inherited_extent>, 
                adf::margin<64>> & in0, 
        output_buffer<int32, adf::extents<OUTPUT_SAMPLE_SIZE>> & out0);
tk3(input_buffer<int32, adf::extents<adf::inherited_extent>> & in0, 
        output_buffer<int32, adf::extents<OUTPUT_SAMPLE_SIZE>> & out0);
同时向内核 tk0tk1tk2tk3 提供输入缓冲器。这是因为 mk 内核的输出缓冲器只读取一次。些许的延迟变化是由于 AI 引擎阵列中从生产者布线到使用者所采用的不同 AXI4‑Stream 路径所致。
图 1. 1 个内核服务于 4 个内核

在此代码中,同一个内核输出连接到 4 个不同的内核输入。aiecompiler 会在所有内核之间自动添加 DMA,这样即可使用 AXI4‑Stream 互连网络将 buf5(d) 缓冲器的内容复制到所有其他缓冲器。