HLS开发学习-11- for 循环优化(一)

写在前面

for循环优化

这里是一个很简单的for循环的函数,描述了一个运算功能。软件的分析思想和硬件电路的分析思想是不太一样的,这里的硬件运算流程是,先进行数据b、c的读取做运算,然后读取数组元素的数据做运算,然后执行写入到目标数组中,一次for循环的延迟是3个时钟周期,这里for循环的次数为3,所以循环执行的延迟为9,对于硬件电路来说,执行判断是否继续执行for循环不是立马执行的,所以要需要耗费一个时钟周期进行执行,所以函数的延迟为11。

流水线优化

对于for循环的优化,我们比较常用的就是使用pipeline 的指令进行for循环的展开,提高for循环中的并行度,把整体算法循环的延迟给降下来。下图可以看出在使用指令进行并行展开的前后,算法的循环的延迟对比。

for循环展开

对于for循环可以进行展开,在默认状态下for循环是折叠的,在电路中对应的就应该为,对于for循环的每次循环都是使用的同一套电路,采用分时复用的方式,而对于展开的foe循环来说,有点像复制的功能,或者类似FPGA的模块重复调用。

for循环优化小结

  1. 要比较清楚的知道函数的循环延迟。
  2. 可以使用流水操作的指令进行for循环的优化。
  3. 可以使用展开指令提高函数的并行度。
  4. 部分展开可以在资源和并行度中求得一个权衡。
  5. 迭代变量的类型是不影响最后的综合结果的。

for循环合并

迭代量一致

在这个例子的函数中,两个for循环分别实现了加法电路和减法电路,在实际硬件设计中,我们希望两份电路进行一个选择判断,从而实现输入数据同时送给加减法电路中,节约资源,可以并行执行。

迭代量不一致

两个都是变量的合并解决办法

可以通过修改代码的方式进行合并相同次数的循环,然后把额外的循环进行单独编写。

解决一个循环任务被其他两个循环任务调用不能直接使用dataflow方法

为了使用dataflow,可以使用一个for循环进行变量的复制,确保for循环的变量只在一个for循环中被使用。

bypass task

在这个示例中,temp1经过了loop2生成了temp3,而temp2是直接进入loop3进行使用的,这种情况也不能直接使用dataflow的操作,也不能使用pipeline和merge。

配置dataflow 存储通道

Vivado HLS将任务之间的通道实现为乒乓缓冲区或FIFO缓冲区,这取决于数据交互的访问模式。

  • 对于标量、指针和引用参数以及函数返回,Vivado HLS将通道实现为FIFO。
  • 如果Vivado HLS确定数据是按顺序访问的,Vivado HLS将内存通道实现为深度1的FIFO通道。
  • 如果Vivado HLS无法确定数据是按顺序访问的还是以任意方式访问的,Vivado HLS将内存通道实现为乒乓缓冲区。就像两个BRAM,每个块ram由消费者数组或生产者数组的最大大小定义。

使用config_dataflow配置

  • 该配置为设计中的所有通道设置默认通道。
  • 减少信道中使用的内存大小,可以使用FIFO。
  • 使用fifo_depth选项显式设置FIFO中元素的深度或数量。
    当设置FIFO的深度时,建议您使用带有默认深度的FIFO,确认设计通过C/RTL协同仿真,然后减小FIFO的大小,确认C/RTL协同仿真仍然完成,没有问题。如果RTL联合模拟失败,FIFO的大小可能太小,以防止失速。

for循环优化-dataflow小结

  • DATAFLOW允许“for循环”并行运行,因此它可以帮助减少延迟并提高吞吐量。
  • 当DATAFLOW应用于’for循环’时存在一些限制。
  • 通道是可配置的,它可以是乒乓RAM或FIFO。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月1日
下一篇 2021年7月1日

相关推荐