HLS(High-Level Synthesis)详解——循环体并行优化

HLS高级综合能够实现软体代码的硬件加速,主要是因为其对代码中的循环体(for,while)等进行了并行性优化,采用流水,展开,合并,嵌套,数据流等方法,将软体中需要一步步执行的循环体,在硬件电路中实现并行化处理,从而大幅提高计算速度,正好应对当下这种高计算量的需求。

本博客讲解一下循环体优化的一些方法,以及一些特殊循环体的优化(嵌套for循环,变量边界循环体),参考b站赛灵思官方HLS介绍视频。

参数指标

综合报告参考的指标参数,较为重要,如下图:

HLS(High-Level Synthesis)详解——循环体并行优化_第1张图片

Loop Trip Count:循环总次数

Loop Iteration Latency:每次循环占用时钟周期

Loop Iteration Interval(Loop II):两次循环之间的间隔

Loop Latency:整个循环的时钟周期

Function Latency:函数的时钟周期

Function Iteration Interval:函数总共占用时钟周期

 

优化方法

1. Pipeline:

不同次数的循环进行流水线操作提高并行性改善Latency和Interval,流水操作的前提是不同循环次数之间没有数据依赖。

HLS(High-Level Synthesis)详解——循环体并行优化_第2张图片

 

2. Unroll:

展开真个循环体,等于复制循环,同步进行以增加并行性

HLS(High-Level Synthesis)详解——循环体并行优化_第3张图片

HLS(High-Level Synthesis)详解——循环体并行优化_第4张图片

3. for循环的合并

  • 边界都为常数的两个循环合并取最大的边界
  • 当for循环合并的两个循环边界一个是常数,另一个无法确定的时候无法合并。
  • 上述两个边界都是不确定边界时可以把边界范围大的拆分,使其一部分边界相等

HLS(High-Level Synthesis)详解——循环体并行优化_第5张图片

HLS(High-Level Synthesis)详解——循环体并行优化_第6张图片

HLS(High-Level Synthesis)详解——循环体并行优化_第7张图片

4.嵌套for循环

通过代码优化将后两种嵌套转化成前两种

HLS(High-Level Synthesis)详解——循环体并行优化_第8张图片

  1. 对上级循环pipeline会将下级所有循环unroll(资源利用率成倍(循环展开后的总次数)增加)。
  2. 建议对内部嵌套循环展开,达到时延和资源的中和。

5.  其他优化

①rewind:缩短循环多次执行的间隔,仅适用单循环

HLS(High-Level Synthesis)详解——循环体并行优化_第9张图片

②循环边界是变量的问题:

    1.使用tripcount directive:手动设定循环边界的最大值最小值。

HLS(High-Level Synthesis)详解——循环体并行优化_第10张图片

    2.把循环边界的数据类型声明成ap_int

HLS(High-Level Synthesis)详解——循环体并行优化_第11张图片

    3.使用assert macro。

HLS(High-Level Synthesis)详解——循环体并行优化_第12张图片

上述三种方法优化效果比较:

HLS(High-Level Synthesis)详解——循环体并行优化_第13张图片

 

 

你可能感兴趣的:(虹科FPGA-HLS,fpga,hls,并行计算)