aiecompiler
は、FIFO をできるだけ効率的な方法で自動的に割り当てようとします。ただし、次の例に示すように、メモリでのその配置を明示的に制御する必要があることもあります。この制約は、aiecompiler
の実行間で FIFO リソースの配置を保持するのに便利です。
FIFO 制約に関しては、次の点に注意してください。
- FIFO 制約を使用する場合、FIFO の深さ全体を制約する必要があります。FIFO の一部を制約し、残りはコンパイラで追加されるようにすることはできません。
- FIFO 制約を分岐ネットに追加する場合は、FIFO 制約を各ポイント ツー ポイント ネットに追加する必要があります。分岐の前のストリーム スイッチ FIFO または DMA FIFO を共有する場合は、各ポイント ツー ポイント ネットで FIFO のタイプとロケーションを複製すると達成できます。
- 制約をロケーションなしで使用して、FIFO のロケーションまたは深さを指定せずに FIFO のタイプを指定できます。
次の例に、グラフ ファイルでの FIFO 制約の使用方法を示します。
location< fifo >(net2) = dma_fifo(aie_tile, 8, 0, 0x0000, 48);
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)};
};
次の例に、制約ファイルに FIFO 制約を追加する方法を示します。
"dma_fifos": {
"r1": {
"tile_type": "core",
"row": 0,
"column": 0,
"size": 16,
"offset": 8,
"bankId": 2
},
{
"PortConstraints": {
"fifo_locations_records": {
"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"]
}
}
}