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);
同时向内核
tk0
、tk1
、tk2
和 tk3
提供输入缓冲器。这是因为 mk
内核的输出缓冲器只读取一次。些许的延迟变化是由于 AI 引擎阵列中从生产者布线到使用者所采用的不同 AXI4‑Stream 路径所致。图 1. 1 个内核服务于 4 个内核
在此代码中,同一个内核输出连接到 4 个不同的内核输入。aiecompiler
会在所有内核之间自动添加 DMA,这样即可使用 AXI4‑Stream 互连网络将 buf5(d)
缓冲器的内容复制到所有其他缓冲器。