HLS高级综合能够实现软体代码的硬件加速,主要是因为其对代码中的循环体(for,while)等进行了并行性优化,采用流水,展开,合并,嵌套,数据流等方法,将软体中需要一步步执行的循环体,在硬件电路中实现并行化处理,从而大幅提高计算速度,正好应对当下这种高计算量的需求。
本博客讲解一下循环体优化的一些方法,以及一些特殊循环体的优化(嵌套for循环,变量边界循环体),参考b站赛灵思官方HLS介绍视频。
参数指标
综合报告参考的指标参数,较为重要,如下图:
Loop Trip Count:循环总次数
Loop Iteration Latency:每次循环占用时钟周期
Loop Iteration Interval(Loop II):两次循环之间的间隔
Loop Latency:整个循环的时钟周期
Function Latency:函数的时钟周期
Function Iteration Interval:函数总共占用时钟周期
优化方法
1. Pipeline:
不同次数的循环进行流水线操作提高并行性改善Latency和Interval,流水操作的前提是不同循环次数之间没有数据依赖。
2. Unroll:
展开真个循环体,等于复制循环,同步进行以增加并行性
3. for循环的合并
- 边界都为常数的两个循环合并取最大的边界
- 当for循环合并的两个循环边界一个是常数,另一个无法确定的时候无法合并。
- 上述两个边界都是不确定边界时可以把边界范围大的拆分,使其一部分边界相等
4.嵌套for循环
通过代码优化将后两种嵌套转化成前两种
- 对上级循环pipeline会将下级所有循环unroll(资源利用率成倍(循环展开后的总次数)增加)。
- 建议对内部嵌套循环展开,达到时延和资源的中和。
5. 其他优化
①rewind:缩短循环多次执行的间隔,仅适用单循环
②循环边界是变量的问题:
1.使用tripcount directive:手动设定循环边界的最大值最小值。
2.把循环边界的数据类型声明成ap_int<W>。
3.使用assert macro。
上述三种方法优化效果比较: