虹科FPGA | 详解HLS技术对C语言中循环体进行并行优化

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

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

图片

图片

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

5.  其他优化  Others

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

图片

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

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

图片

  b. 把循环边界的数据类型声明成ap_int<W>。

图片

  c. 使用assert macro。

图片

欢迎关注我们,了解更多—— 

图片

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值