HLS高级综合能够实现软体代码的硬件加速,主要是因为其对代码中的循环体(for,while)等进行了并行性优化,采用流水,展开,合并,嵌套,数据流等方法,将软体中需要一步步执行的循环体,在硬件电路中实现并行化处理,从而大幅提高计算速度,正好应对当下这种高计算量的需求。
这里讲解一下循环体优化的一些方法,以及一些特殊循环体的优化(嵌套for循环,变量边界循环体)。
参数指标
- 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. 循环合并 Loop merging
- 边界都为常数的两个循环合并取最大的边界。
- 当for循环合并的两个循环边界一个是常数,另一个无法确定的时候无法合并。
- 上述两个边界都是不确定边界时可以把边界范围大的拆分,使其一部分边界相等。
4. 嵌套循环 Nesting Loop
通过代码优化将后两种嵌套转化成前两种
- 对上级循环pipeline会将下级所有循环unroll(资源利用率成倍(循环展开后的总次数)增加)。
- 建议对内部嵌套循环展开,达到时延和资源的中和。
5. 其他优化 Others
①rewind:缩短循环多次执行的间隔,仅适用单循环
②循环边界是变量的问题:
a. 使用tripcount directive:手动设定循环边界的最大值最小值。
b. 把循环边界的数据类型声明成ap_int<W>。
c. 使用assert macro。
欢迎关注我们,了解更多——