HLS for 循环优化其他方法

非 Y 不嫁゛ 提交于 2020-03-04 15:36:13

for 循环并行操作

当不满足合并的时候,采用allocation,内部加上pipeline
在这里插入图片描述
2个单独的for
这时可以将循环包装成函数,然后用不同的数据做参数进行调用,在上述函数化的代码的基础上,对 loop_sequential 函数用 ALLOCATION指令优化, 里面的参数 instances 就是指定操作哪个函数,limit=2 意思就是把 instances指定的函数复制两份,**这样就实现了函数的并行执行。

在这里插入图片描述

pipeline rewind

对于一个循环,多次调用时:在没有选择 rewind 时,在执行完一次 for 循环后有一个时钟周期的空挡然后才执行下一次循环。

使用 rewind 之后,两次 for 循环之间是没有空挡的,这样就降低了整个函数的 latency。

N=4
在这里插入图片描述
在这里插入图片描述
对于上述结果可以看出,在默认情况下,共循环 4 次,每次两个周期,共 8 个周期,再加一个进入循环消耗周期,共 9 个周期。

pipeline 之后,四次循环重叠了 3 个周期,所以减少到 6 个周期。

选中 rewind 选项后,减少了进入循环的时间,并且和前面的一次循环重叠了一个周期,所以又减少了两个时钟周期,一共 4 个周期。

多个循环,不能rewind

对于文首2个单独的for 循环示例代码 的两个循环来说,对其中的循环 pipeline 选中 rewind 的话会出现警告,因为函数包含了多个循环,所以不能执行 rewind。

自动添加pipeline

可以在 solution settings 中添加 config_compile 来达到自动添加 pipeline 的目的,其中的 pipeline_loops 选项的数字是一个阈值,当某个循环的循环次数小于这个数字的时候就会被自动添加 pipeline。
Q:是添加在哪一层?

for循环的循环边界是变量时处理方法

当循环边界是变量时会引发一些问题。首先 Vivado HLS 无法确定 loop latency 是多少,进而就无法确定函数的 latency,此时相应的 latency 会用问号作为标记。
对于这种情况有 3 种处理方式:

  • 用Tripcount指令
  • 将循环边界的数据类型声明为ap_int(也可以使用ap_uint,但是当循环变量是i—的时候会出问题,当减到负数后仍然会被识别为正数)
  • 在C代码中可以使用assert宏

Tripcount

Tripcount 指令会指定循环边界的最值,这样就把循环边界确定在一个范围内了,在综合报告中各项参数就会以相应的范围来表示而不会出现问号了。Tripcount 指令只会影响到综合报告的显示而不会影响到综合的 RTL 代码的结果。

循环边界声明为 ap_int

在这里插入图片描述
(3)使用 assert 宏
在这里插入图片描述

== 从三种方法的结果比较中可以发现,采用 assert 方式时 latency 是最小的,同时相应的资源消耗也是最少的。 ==

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!