HLS基础学习

一、循环优化

  1. Pipeline:流水线操作
    在这里插入图片描述
    iteration latency:每次循环迭代所需要的时钟周期数
    Initiation Interval(II):两次迭代之间的时钟间隔;

2.Unroll:循环展开
每一个循环都时分复用同一个电路,循环展开相当于把该电路进行逻辑复制。
指令:#pragma HLS unroll factor = 2
如果没有指明优化factor=N,则表示该循环完全展开。
在这里插入图片描述
在这里插入图片描述
factor表示把该循环体的逻辑资源复制了几份;
2. 循环变量
讲循环变量i设置为int(32位)或者是ap_int<4>(4位),整个的资源不受任何影响,在综合编译时,HLS考虑的是i的最大值,根据最大值进行相应的资源规划。
在这里插入图片描述

二、数组分割 ARRAY_PARTITION

Block:整体的分
cyclic:交叉的分
complete:数组分为单独的元素进行操作
在这里插入图片描述
当分开多元数组的时候,dimension选项用于具体数组分成的维度。
在这里插入图片描述

三、工程中经常用到的优化策略
3.1 ARRAY_PARTITION
在这里插入图片描述
int a[n];
#pragma HLS ARRAY_PARTITION variable=a complete dim=1
将数组完全分块,即在硬件中实现为多个register,而不实现为block ram;
即使是多维数组,在完全分块时,dim = 1;

3.2 UNROLL
在这里插入图片描述
指令:#pragma HLS unroll factor = 2
如果没有指明优化factor=N,则表示该循环完全展开。

	for(t1 = 0;t1 < Tn;t1++)
	{
#pragma HLS UNROLL
a[i] = b[i] + c;
}

在硬件中,相当于逻辑电路复制;

3.3 PIPELINE
在这里插入图片描述
指令:#pragma HLS PIPELINE
两次的循环可以公用时钟周期,不需要等到这次循环完成了,再进行下一次的循环迭代。
Initiation Interval(II):两次迭代之间的时钟间隔;
iteration latency:每次循环迭代所需要的时钟周期数

#pragma HLS PIPELINE II=1

默认II= 1

3.4 DEPENDENCE
在这里插入图片描述

#pragma HLS DEPENDENCE variable=output_buffer inter false

Inter:(迭代间相关)指定dependency是存在于同一个循环的不同的迭代之中
如果进行这个指令指明false,则HLS会将循环进行并行化处理。

Intra:(迭代内相关)指定dependence是在一个循环迭代之中。例如一个数组会在iteration的开始和结束被access
当intradependencies被指明为false时,HLS就会将loop中间的operation进行自由的移动。
当在同一个循环中,同一个变量(不同偏移的数组变量)存在读写情况时,当读和写操作在前一个读和写操作之后被执行,则认为是具有dependencies,例如:

for(tm = 0;tm < Tm;tm++){
     tmp_add_result = output_buffer[tm][tr][tc];//line 8
     ......
     output_buffer[tm][tr][tc] = tmp_add_result + tmp_add12;//line 9
}

此时,编译器认为line 8和line 9的output_buffer[tm][tr][tc]具有依赖关系。如果loop之间有dependencies,则pipeline就不能进行。HLS DEPENDENCE可以为output_buffer提供额为的信息,指明依赖关系不成立。可以进行如下优化:

#pragma HLS PIPELINE
for(tm = 0;tm < Tm;tm++){
#pragma HLS DEPENDENCE variable=output_buffer inter false
     tmp_add_result = output_buffer[tm][tr][tc];//line 8
     ......
     output_buffer[tm][tr][tc] = tmp_add_result + tmp_add12;//line 9
}
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HLS pipeline是一种在高级综合(High-Level Synthesis, HLS)中使用的技术,用于优化循环体中的数据依赖关系,以提高设计的性能。通过将循环体中的计算任务分解成多个阶段,并通过流水线并行化来减少计算任务之间的依赖关系,从而实现更高的吞吐量和更低的延迟。 在引用中提到了使用pipeline可以提高性能的结论。具体来说,引用指出,使用pipeline可以使性能比不使用pipeline的情况快约2*10的三次方倍,并且在整个循环体外加pipeline的效果比在循环体内加效果更好。 在引用中提到了一种使用HLS DEPENDENCE进行优化的方法。通过在代码中使用#pragma HLS DEPENDENCE指令,可以告诉编译器不同部分之间的数据依赖关系,从而帮助编译器进行更好的优化。具体地,引用的例子展示了如何使用#pragma HLS DEPENDENCE指令来解决output_buffer中的数据依赖关系,以便进行流水线并行化。 引用中提到了通过对比实验,在不同位置添加pipeline对性能的影响非常大。具体来说,引用通过对比在for循环中不同位置添加pipeline后进行C综合的结果,发现在第一种方式下的性能更好。 综上所述,HLS pipeline是一种用于优化循环体中数据依赖关系的技术,可以提高设计的性能。通过使用HLS DEPENDENCE指令来指定依赖关系,以及在适当的位置添加pipeline,可以进一步优化设计的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vivado HLS在不同位置添加pipeline对延时的影响](https://blog.csdn.net/Deep_win/article/details/115905306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [HLS基础学习](https://blog.csdn.net/alangaixiaoxiao/article/details/103310707)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值