循环优化-vivado hls设计
2.flatten指令优化要求的是内层循环的循环次数是常数,并且循环主体只能在内层循环中,才可以进行flatten。对于2个循环存在数据依赖关系时,不管循环合并或是循环函数化,都没有办法实现循环之间的并行;上述代码的循环边界是变量,这个综合的时候,循环的tripcount行程是不知道的。如果是完美循环,对内层循环进行pipeline,将会把嵌套循环打平,并进行pipeline优化。内层循环循环次数
一、循环嵌套的优化
1.完美的循环嵌套
内层循环和外层循环的次数都为常数,并且循环体只出现在内层循环中。
2.半完美的循环嵌套
内层循环循环次数为常数,外层循环的循环次数为变量,循环体只是出现在内层循环中。
3.不完美的嵌套循环模式1
内外层循环的循环次数为常数,但是循环体在内外层循环中都有
4.不完美的嵌套循环模式2
循环体只出现在最内层中,但是内层的循环次数不确定,是个变量
二、对于循环嵌套使用pipeline优化
1.对嵌套循环的内层循环使用pipeline优化
如果是完美循环,对内层循环进行pipeline,将会把嵌套循环打平,并进行pipeline优化
如果是非完美循环,对内层循环进行pipeline,不会把嵌套循环打平
2.对嵌套循环的外层循环使用pipeline优化
对于外层循环进行流水操作,则内部所有的for循环都会展开
3.当流水化循环或函数时,在流水化循环或函数下面的层次结构中的任何循环都必须展开。对大多数应用程序来说,流水最内层的循环提供了具有一般可接受吞吐量的最小硬件
三、for循环封装为函数后使用allocation指令进行优化
四、unroll循环展开优化
1.将一个循环展开形成多个循环,复制多个循环电路,并行执行
通过消耗更多的资源换取加速效果
五、循环展平flatten指令优化
1.相当于将内层循环合并到外层循环上,从而节省从内层循环过渡到外层循环时条件判断的延迟
2.flatten指令优化要求的是内层循环的循环次数是常数,并且循环主体只能在内层循环中,才可以进行flatten
六、使用loop_merge对多个循环进行优化设计
七、循环函数化优化
如果两个循环的边界不同,则不能合并。但是可以将循环封装成子函数,实现并行。
注意需要使用#pragma HLS inline off来防止内联
八、数据流dataflow优化
对于2个循环存在数据依赖关系时,不管循环合并或是循环函数化,都没有办法实现循环之间的并行;但是可以通过数据流实现。
void func (int A[N], int C[N], int num) {
#pragma HLS dataflow
int acc = 0;
int B[N];
LOOP_1: for (int i = 0; i < N; i++) {
#pragma HLS PIPELINE II=1
acc += A[i];
B[i] = acc;
}
LOOP_2: for (int i = 0; i < N; i++)
#pragma HLS PIPELINE II=1
C[i] = B[i] * num;
}
九、对for循环的不定上界进行优化
#define N 32
dout_t code(din_t A[N],int width){
loop_x:for(int x=0;x<width;x++){
out_accum += A[x];
}
return out_accum
}
上述代码的循环边界是变量,这个综合的时候,循环的tripcount行程是不知道的。可以使用assert进行优化。
在这里,我们不采用assert优化,可以使用一种新的优化方式,具体看代码如下。
#define N 32
dout_t code(din_t A[N],int width){
loop_x:for(int x=0;x<N;x++){
if(x<width)
out_accum += A[x];
}
return out_accum
}
可以用上述这种方式对for循环进行优化!!!!!
对于for循环变量边界这种情形有三种解决方法:
1.使用Tripcont这种directive,这种方法不会对综合结果有任何影响,只是用于report的显示以及不同solution之间的比较;
2.将循环边界的数据类型声明为 ap_int,对综合结果有优化;
3.在C代码中使用assert macro
4.改写代码,将for循环的边界变为常量,然后再在for循环中使用条件判断来限制变量的执行range范围,具体看上面的例子就明白了。
十、pipeline对循环进行优化
1.对函数进行pipeline优化,函数内部的for循环将全部展开
2.对外层循环进行pipeline优化,内层for循环被全部展开
3.对内层for循环进行pipeline优化,内层循环被流水化设计
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)