for循环优化的基本概念、对for循环施行流水的优化、for循环的展开以及for循环的循环变量的数据类型是否对结果资源有影响
正常情况下,循环变量i的类型不会影响最后的综合结果,因为Vivado HLS考虑的是i的最大值,然后使用FPGA的最小资源
对于变量作为边界的for循环如何合并?
合并的规则:
总结:
循环之间有依赖关系,可以应用流水线,不可以用合并;
没有应用数据流时循环执行顺序为左,应用了之后为右,可以看出来,使用了数据流之后我们并不需要前面的循环完全执行结束后才执行下一个循环任务,只有前面的有输出我就可以做下一个子任务了。同时各个任务之间有交叠,这帮助我们降低latency进而提高数据吞吐率。
dataflow优化的限制:
总结:
三种类型的嵌套for循环:
对于Imperfect loop,我们希望通过一些手段将其转化成Perfect或者Semi-Perfect loop。
对某层for循环做流水,该层下面的for循环都会被展开;
不加任何约束、对最内部做流水、中间层做流水、最外部做流水的比较:显然对最外部做流水的延迟最小,但对应的增加了硬件成本;同时对整个函数做流水会将所有层都展开,延迟最低,硬件成本最高。
矩阵乘法优化:
总结:
rewind并不是适合所有for循环,它是有条件的。
什么时候使用Pipeline会失效?
当将一个任务做流水时,for循环下面的操作都会被展开,如果for循环边界是变量时,这个操作就会失败;
当循环边界是变量时,HLS无法确定loop的latency,进而无法确定整个函数的latency。
对于这种情形有三种解决方法:
三种方法的比较:可以看出来,使用assert的方式latency最小,硬件成本也最低。
总结: