HLS开发学习-12- for 循环优化(二)

简介: HLS开发学习-12- for 循环优化(二)

写在前面


本文是本系列专题的第十二篇,参考高亚军老师的视频教程以及课程的ppt,主要介绍了vivado HLS对for 循环优化。

循环嵌套的优化


循环的类型


完美循环嵌套:循环次数为常数,循环体只会在最内部的循环中出现。

image.png

**半完美循环嵌套:**内部循环体次数为常数,外部循环体次数为变量,循环部分只在最内层循环出现。

image.png

不完美循环嵌套:内外层的循环此时为常量,但是循环体存在内外循环中。

image.png

或者是这种,循环体只出现在最内层中,但是内层的循环次数不确定,是个变量。

image.png

对于不完美循环嵌套,内部循环有变量边界,或者循环体不完全在内部循环中,设计师应该尝试重组代码,或展开循环体中的循环,以创建一个完美的循环嵌套。

完美循环嵌套优化


image.png

对大多数应用程序来说,流水操作最内层的循环提供了具有一般可接受吞吐量的最小硬件将层次结构。而对于外层循环进行流水操作,则内部所有的for循环都会展开,并可以创建更多要调度的操作(这可能会影响运行时和内存容量),但通常会在吞吐量和延迟方面提供最高的性能设计。

image.png

LOOP FLATTEN允许嵌套循环被折叠成一个具有改进延迟的单一循环。它只能应用于完美和半完美循环。它消除了重新编码以获得最佳硬件性能的需要。

不完美循环嵌套优化


如果只对最内层做循环流水情况:

image.png

如果对中间层做循环流水情况:

image.png

如果只对最外层做循环流水情况:

image.png

经过比较可以看出,在最外层做流水,资源使用情况是最多的,但是延迟也是最低的。在最内层做流水,资源使用是最少的,同时延时也是最大的。

image.png

下图为矩阵乘法的运算机制。

image.png

下图代码在执行最开始时,对ab行列的值进行了缓存。以便于提升性能。

image.png

for循环嵌套小结


当流水化循环或函数时,在流水化循环或函数下面的层次结构中的任何循环都必须展开。对大多数应用程序来说,流水最内层的循环提供了具有一般可接受吞吐量的最小硬件。

for循环其他优化方法


封装后使用ALLOCATION


从下面的这个示例中可以看出,这两个for循环的变量相互独立,在翻译成硬件电路时候可以进行并行执行。而默认状态下,HLS会进行串行的分析。

image.png

分装成函数也是串行执行的。

image.png

这里使用的是进行封装后使用ALLOCATION,实现了延时的降低。

image.png

pipeline操作中使用rewind


在未使用rewind操作时,每执行一次for循环中间会有一个时钟周期的延时,在使用了rewind操作后,执行完上一个循环后,下一个for循环直接进流水,而不需要等待一个时钟周期的延迟。

image.png

在下面这个例子中,勾选rewind的pipeline操作,从综合报告中可得知,使用rewind操作的电路延迟是最小的,使用的电路资源也是最少的

image.png

从仿真结果中也可以看出上述差异。

image.png

自动循环流水


config_compile配置使循环能够自动进行循环流水操作优化。pipeline_loops选项设置迭代限制。所有迭代计数低于此限制的循环将自动流水线化。默认值是0,即为不执行自动循环流水操作。

image.png

如果在设计中存在不希望使用自动流水的循环,则对该循环应用带有off选项的PIPELINE指令。off选项防止自动循环流水操作。

流水操作失效


当一个任务被流水线化时,层次结构中的所有循环都会自动展开。这是流水操作运行的必要条件。如果一个循环有变量边界,它将不能被展开,这将阻止任务被流水线化。因为Vivado HLS无法知道何时循环将完成。

循环边界问题及解决办法


循环边界问题阻止了Vivado HLS决定循环的延迟,因为该设计的性能未知。 Vivado HLS以问号(?)的形式报告延迟,而不是使用确切的值。如下图:

image.png

解决办法:

  1. 使用Tripcount指令。
  2. 定义循环边界的数据类型为ap_int< W >
  3. 在代码中设置一个assert宏定义

使用Tripcount指令


使用Tripcount指令,不会影响最后的综合结果,只会作用于报告显示,方便对比。

image.png

定义循环边界的数据类型为ap_int< W >


在前面也提到了,ap_int类型会根据设定的w的大小进行自动综合为对应个数的寄存器,例子中的W为5,所以计数的个数为0-15,这里定义为了int的有符号类型,所以最大值为15。

image.png

资源对比结果:

image.png

设置一个assert宏定义


设置assert宏定义后,(这里设置小于5,所以最后的trip count 是0-4)。

image.png

资源对比:

image.png

这里的资源对比可能存在问题,因为在上面的循环的最大次数不一致。

image.png

目录
相关文章
|
2月前
|
缓存 监控 数据处理
【编程底层原理】从播放音乐的网页中提取mp3音频文件的两种方式及背后的技术思考【短连接和长连接】
本文介绍了两种从网页提取音乐文件的方法:一是通过IE临时缓存获取,二是利用开发者模式捕捉网络流量并下载音频URL。同时探讨了网页播放音乐的技术实现,包括短连接和长连接的区别及其适用场景,以及数据传输中的阻塞概念。
147 0
|
7月前
|
编解码 网络协议 Unix
相较于ffmpeg我更倾向于使用socket实现推流工作
相较于ffmpeg我更倾向于使用socket实现推流工作
166 0
|
存储 算法 异构计算
HLS开发学习-11- for 循环优化(一)
HLS开发学习-11- for 循环优化(一)
391 0
HLS开发学习-11- for 循环优化(一)
|
异构计算
HLS开发学习-13- 数组优化
HLS开发学习-13- 数组优化
512 0
HLS开发学习-13- 数组优化
|
存储 人工智能 监控
HLS实践 - 06 - 优化设计(一)
HLS实践 - 06 - 优化设计
292 0
HLS实践 - 06 - 优化设计(一)
|
缓存 数据处理 索引
HLS实践 - 06 - 优化设计(二)
HLS实践 - 06 - 优化设计
221 0
HLS实践 - 06 - 优化设计(二)
HLS开发学习-14- Vivado HLS 函数层面的优化
HLS开发学习-14- Vivado HLS 函数层面的优化
352 0
HLS开发学习-14- Vivado HLS 函数层面的优化
HLS开发学习-15- HLS优化指令汇总
HLS开发学习-15- HLS优化指令汇总
357 0
HLS开发学习-15- HLS优化指令汇总
HLS实践 - 03 - 接口优化设计(二)
HLS实践 - 03 - 接口优化设计
393 0
HLS实践 - 03 - 接口优化设计(二)
HLS实践 - 03 - 接口优化设计(一)
HLS实践 - 03 - 接口优化设计
352 0
HLS实践 - 03 - 接口优化设计(一)