为什么即使做了 array_partition 还是出现“limited memory ports”警告和 II 违规?
一、设计
line_buf[2][INWIDTH],应用了
#pragma HLS ARRAY_PARTITION variable=line_buf cyclic factor=9 dim=2
#pragma HLS ARRAY_PARTITION variable=line_buf dim=1 complete
二、现象
做了 array_partition 还是出现“limited memory ports”警告和 II 违规。
三、分析
1.RESIZE_NPPC_LOOP2 中读取 line_buf 时仍然因为内存端口不足而无法调度;
2.RESIZE_NPPC_LOOP 和 RESIZE_NPPC_LOOP1 有 carried dependence 导致 II = 8;
3.“Unable to schedule 'load' operation ... on array 'line_buf[0][7].V' ... due to limited memory ports.” 这意味着对同一个数组元素 line_buf[0][7] 有多个读请求同时发生,而该元素所在的 memory bank 端口数不足以同时服务这些读取。
就是同一个地址需要多次获取,发生了拥挤,从而造成II的值特别大。
对于不同的 k,x0 和 x1 可能相同吗?有可能。例如当缩放导致多个相邻输出像素映射到同一个输入坐标?但注意 dst_x 每次递增 NPPC,内层 for k 展开,current_dst_x 连续,x0 和 x1 可能会相邻,但不太可能所有 k 都映射到同一点。然而,警告特别指出 line_buf[0][7].V 读取操作 line_buf_0_7_V_loa_4。
4.如果 scale_x > 1(缩小),那么 x0 可能跳跃;如果 scale_x < 1(放大),x0 可能重复。所以可能多个 k 的 x0 相同或 x1 相同。即使不同,由于 cyclic factor=9,相邻的 x0 可能落在不同 bank
5.line_buf[0][7] 被多次 load,说明 bank 7 上的 7 号元素被多次读取(也许是不同 k 的 x0 都等于 7,或者 7 与 6、8 在不同 k 中同时需要 bank 7 的元素)。此外,还要注意 line_buf 也可能在 RESIZE_NPPC_LOOP2 之前被写入,但此循环只读,无写冲突,只考虑读端口。
