aiecompiler
会尝试以尽可能最有效的方式来自动分配 FIFO。但您可能想要在存储器中显式控制这些 FIFO 的布局,如以下示例所示。此约束可用于在 aiecompiler
的多轮运行之间使 FIFO 资源的布局保留不变。
请注意下列 FIFO 约束注意事项。
- 如果使用 FIFO 约束,则 FIFO 的整个深度都必须加以约束。无法仅对 FIFO 的一部分进行约束而将其余部分交由编译器来添加约束。
- 如果将 FIFO 约束添加到分支信号线中,那么 FIFO 约束应添加到每个点对点信号线。如果在分支前要共享串流开关 FIFO 或 DMA FIFO,可在每个点对点信号线上复制 FIFO 类型和位置。
- 此约束(无需位置)可用于指定所期望的 FIFO 类型,无需指定位置或深度。
以下示例演示了如何在计算图文件中使用 FIFO 约束。
two_node_graph() {
loop0 = kernel::create(loopback_stream);
loop1 = kernel::create(loopback_stream);
loop2 = kernel::create(loopback_stream);
source(loop0) = "loopback_stream.cc";
source(loop1) = "loopback_stream.cc";
source(loop2) = "loopback_stream.cc";
connect net0 (in0, loop0.in[0]);
connect net1 (loop0.out[0], loop1.in[0]);
connect net2 (loop1.out[0], loop2.in[0]);
connect net3 (loop2.out[0], out0);
runtime(loop0) = 0.9;
runtime(loop1) = 0.9;
runtime(loop2) = 0.9;
fifo_depth(net1) = 32;
fifo_depth(net2) = 48;
location< fifo >(net1) = {ss_fifo(shim_tile, 16 , 0, 1), ss_fifo(shim_tile,17,0,0)};
location< fifo >(net2) = dma_fifo(aie_tile, 8, 0, 0x0000, 48);
};
第二个示例演示了如何对约束文件添加 FIFO 约束。
{
"PortConstraints": {
"fifo_locations_records": {
"dma_fifos": {
"r1": {
"tile_type": "core",
"row": 0,
"column": 0,
"size": 16,
"offset": 8,
"bankId": 2
},
"r2": {
"tile_type": "core",
"row": 0,
"column": 1,
"size": 16,
"offset": 9
},
"r4": {
"tile_type": "mem",
"row": 2,
"column": 4,
"size": 16,
"offset": 6,
"bankId": 2
}
},
"stream_fifos": {
"r3": {
"tile_type": "shim",
"row": 1,
"column": 3,
"channel": 1
}
}
},
"mygraph.k2.in[0]": {
"fifo_locations": ["r1", "r2", "r3"]
},
"mygraph.k4.in[0]": {
"fifo_locations": ["r1", "r2", "r4"]
}
}
}