Xilinx HLS 学习笔记3(for循环优化)

for循环优化

1、基本概念

与for循环相关的基本概念
Pipelining的for循环
for循环的展开
for循环的循环变量的数据类型,是否对综合后结果的资源有所影响
Xilinx HLS 学习笔记3(for循环优化)
Performance Metrics(衡量指标)

Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)
优化方式:采用pipeline
Xilinx HLS 学习笔记3(for循环优化)
采用Pipeline前后对比我们可以发现,在不采用流水线的时候是过程化运行(有时间的先后顺序进行);当采用流水线后,当在读数据的时候,下一个Fou循环就开始读地址,会有并行(椭圆标记的位置)的效果
Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)
for 循环展开(空间换时间)
默认情况下,C函数中的For循环是被折叠的,即每次循环均采用同一套电路,它是分时复用的;所谓的展开是复制了多个相同的电路,从而允许所有迭代并行发生。
Xilinx HLS 学习笔记3(for循环优化)
我们也可以把For循环部分展开,如下例所示,将For循环拆解成了3部分,被复制后(0,3),(1,4)和(2,5)分别共用一套逻辑资源。
Xilinx HLS 学习笔记3(for循环优化)
设置方式
Xilinx HLS 学习笔记3(for循环优化)
循环变量:通常情况下i的数据类型是不会对资源的分配产生影响。

Xilinx HLS 学习笔记3(for循环优化)

总结:
清楚地了解Il和loop/function latency
Pipelining是减少循环延迟的一种非常流行的方法
展开允许循环主体并行运行
部分展开可以在并行性和资源之间进行折中
迭代类型不影响面积结果
循环变量的数据类型,对最终的资源消耗量没有影响。
Xilinx HLS 学习笔记3(for循环优化)

2、循环合并(loop merge)

我们期望其可以并行计算
Xilinx HLS 学习笔记3(for循环优化)
但实际上是按照顺序执行
Xilinx HLS 学习笔记3(for循环优化)
我们可以采用循环合并的方法——loop merge
我们首先需要声明一个需要修改的区域——loop region

Xilinx HLS 学习笔记3(for循环优化)
合并之后
Xilinx HLS 学习笔记3(for循环优化)
对比
Xilinx HLS 学习笔记3(for循环优化)
循环边界为不同的常数
以最大的为循环边界
Xilinx HLS 学习笔记3(for循环优化)

如果循环边界是变量

在没有合并时候,我们会发现Trip Count为0~15,这是因为k的变量类型为ap_uint<4>,其数据上限位15。当我们实施循环合并时会报错(无法合并)。这说明变量边界和常数边界无法合并。
Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)
解决方案:
如果for均是变量时,通过修改代码去解决(此处类似+余数的方法,单独处理余下的循环)。
Xilinx HLS 学习笔记3(for循环优化)
总结
Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)
我们可以单独构成一个region
合并for循环在一定程度上帮助我们降低时钟周期,并让一些for循环可以并行计算
但不是所有类型循环都可以合并,要注意上图的规则。
Xilinx HLS 学习笔记3(for循环优化)

3、数据流优化(Dataflow)

ABC三个Task有顺序关系,我们可以采用pipeline,但是merge不行,此处我们采用dataflow来进行优化;
Xilinx HLS 学习笔记3(for循环优化)
此时循环之间是一个并行的关系,三者之间是有交叠的,这可以减少延迟提高数据的吞吐量。
Xilinx HLS 学习笔记3(for循环优化)
默认情况下,通道是通过ping-pong RAM实现的。通过conifg_dataflow,可以将实现方法更改为FIFO。
Xilinx HLS 学习笔记3(for循环优化)
Dataflow 限制情况
Xilinx HLS 学习笔记3(for循环优化)
限制情况举例,以下情况可以使用pipeline和loop merge进行优化,但是没办法使用dataflow
Xilinx HLS 学习笔记3(for循环优化)
我们修改代码,增加copy步骤(此处应该是每次读取数值消耗导致的)

Xilinx HLS 学习笔记3(for循环优化)

另一个例子
如果不优化,只能使用pipeline

Xilinx HLS 学习笔记3(for循环优化)
这里依然采用copy的方法

Xilinx HLS 学习笔记3(for循环优化)

如果Vivado HLS确定按顺序访问数据,则Vivado HLS将存储通道实现为深度为1的FIFO通道.
如果Vivado HLS无法确定数据是按顺序访问的,或者无法确定数据是以任意方式访问的,则Vivado HLS将内存通道实现为ping-pong buffers。

Xilinx HLS 学习笔记3(for循环优化)
使用config_dataflow配置
此配置为设计中的所有通道设置默认通道。
要减少通道中使用的内存大小,可以使用FIFO。
要显式设置FIFO中元素的深度或数量,请使用fifo_depth选项。

Xilinx HLS 学习笔记3(for循环优化)
总结

Xilinx HLS 学习笔记3(for循环优化)

4、嵌套For循环的优化(留坑)

我们希望将imperfect loop nests转换为前两种
Xilinx HLS 学习笔记3(for循环优化)
例子
内部for循环做Pipeline和对外部for循环做Pipeline的情况对比;
可以看到,只对内部进行pipeline,其资源开销更小。对外部进行pipeline,资源开销大,但是速度更快(latency)
Xilinx HLS 学习笔记3(for循环优化)
对内部做流水,展开并打平,但要求循环体一定要是perfect loop和semi perfect loop
Xilinx HLS 学习笔记3(for循环优化)
Pipeline最里面for循环可为大多数应用使用更少的硬件资源(与外部for循环相比),并具有通常可接受的吞吐量。
对层次结构的高层进行Pipeline,会展开所有子循环,并可以创建更多要调度的操作(这可能会影响运行时间和内存容量),但通常在吞吐量和延迟方面提供最高性能的设计。

Xilinx HLS 学习笔记3(for循环优化)

5、其他优化方法

Xilinx HLS 学习笔记3(for循环优化)1、Allocation:
默认循环下是顺序执行的,如果循环参量是变量或者相等,我们没办法使用merge方法
Xilinx HLS 学习笔记3(for循环优化)
此时我们可以将其合并成一个函数,去调用两次,HLS在编译中,会采用分时复用的方式,调用这个函数多次,以节省计算时间,但整体效率与之未组成函数时无差异。
Xilinx HLS 学习笔记3(for循环优化)

使用Allocation 命令来使得Accumlator函数复制两份,并作pipeline,以实现并行执行。

Xilinx HLS 学习笔记3(for循环优化)

Xilinx HLS 学习笔记3(for循环优化)
2、Rewind

Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)
当函数中有多个循环时候,我们做Rewind,会爆出警告,没有办法执行,所以我们可以看出Rewind不是所用的for循环都是适用的。
Xilinx HLS 学习笔记3(for循环优化)
3、Automatic loop pipelining
config_compile配置使循环可以根据迭代计数自动进行Pipeline处理。
+pipeline_loops选项设置迭代限制
+迭代次数低于此限制的所有循环将自动Pipeline
+默认为0:不执行自动Pipeline的循环
Xilinx HLS 学习笔记3(for循环优化)
如果设计中有不想使用自动自动Pipeline的循环,则将带有off选项的PIPELINE指令应用于该循环。off选项可防止自动循环流水线。

Xilinx HLS 学习笔记3(for循环优化)
当一个任务是pipeline时,所有的循环都会被展开,但如果循环边界(参数)是变量,则无法使用自动流水。因为HLS无法知道循环何时完成。
Xilinx HLS 学习笔记3(for循环优化)
4、Variable Loop Bounds
当循环边界是变量时,该如何解决

Xilinx HLS 学习笔记3(for循环优化)
针对这个问题,我们有三种解决方法
+使用Tripcount指令
+将循环边界的数据类型声明为ap_int
+在C代码中使用assert macro
Xilinx HLS 学习笔记3(for循环优化)
采用Tripcount指令,设置一个区间

Xilinx HLS 学习笔记3(for循环优化)
ap_int
这里设为int 5,综合报告生成出来为0-15(16)这是由位数决定的。
Xilinx HLS 学习笔记3(for循环优化)

Xilinx HLS 学习笔记3(for循环优化)
在C代码中使用assert macro(最优方法)

Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)

Xilinx HLS 学习笔记3(for循环优化)
Xilinx HLS 学习笔记3(for循环优化)

上一篇:Jenkinsfile入门:Pipeline使用Maven构建java项目


下一篇:Go标准库:Go template用法详解