HLS对卷积层优化指令的理解

在祥瑞Coding的博客中提到了下面的一个例子:

// Array Order : 0 1 2 3 4 5 6 7 8 9 10 etc. 16 etc...
// Sample Order: A0 B0 C0 D0 E0 F0 G0 H0 A1 B1 C2 etc. A2 etc...
// Output Order: A0 B0 C0 D0 E0 F0 G0 H0 A0+A1 B0+B1 C0+C2 etc. A0+A1+A2 etc...
#define CHANNELS 8
#define SAMPLES 400
#define N CHANNELS * SAMPLES
void foo (dout_t d_o[N], din_t d_i[N]) {
	int i, rem;
	// Store accumulated data
	static dacc_t acc[CHANNELS];
	// Accumulate each channel
	For_Loop: for (i=0;i<N;i++) {
		rem=i%CHANNELS;
		acc[rem] = acc[rem] + d_i[i];
		d_o[i] = acc[rem];
	}
}

优化前

void foo (dout_t d_o[N], din_t d_i[N]) {
#pragma HLS ARRAY_PARTITION variable=d_i cyclic factor=8 dim=1 partition
#pragma HLS ARRAY_PARTITION variable=d_o cyclic factor=8 dim=1 partition
	int i, rem;
	// Store accumulated data
	static dacc_t acc[CHANNELS];
	// Accumulate each channel
	For_Loop: for (i=0;i<N;i++) {
	#pragma HLS PIPELINE rewind
	#pragma HLS UNROLL factor=8
		rem=i%CHANNELS;
		acc[rem] = acc[rem] + d_i[i];
		d_o[i] = acc[rem];
	}
}

优化后

看了半天终于对pipeline、unroll和partition都有了一个全面的理解。

先简单说一下概念,在这个例子中pipeline就是将循环流水化;unroll就是将循环展开;partiton就是对数组进行划分,使数组中的数据存在不同的BRAM中。

图中的循环主要是实现了读取d_i[i]中的数据,累加一个数,存取到相应的d_o[i]位置中,累加的这个数据呢,是根据i对CHANNELS取模的数组位置,加上d_i[i]不断增加的数。CHANNELS为8,也就是d_i[i]累加的数一直都在acc中0~7的索引中。

优化前的循环是这样进行的:
在这里插入图片描述
使用了unroll且factor为8时,即将循环展开8次8次的进行计算,循环流程变为:
在这里插入图片描述
但是由于d_i和d_o数组都存放在一个BRAM中,最多只有两个读写口,一次性只能读或写两个数据,因此要将d_i[0]—d_o[7]存放在不同的BRAM中,就可以一次性都读取出来,就需要使用partition,有三种划分模式:
在这里插入图片描述
cyclic是满足我们的要求的,故使用cyclic对d_i和d_o数组进行划分,上图是factor设为2的效果,我们需要将factor设为8,将d_i[0]—d_i[7]存放在不同的BRAM中。

最后再对循环进行pipeline,将循环流水线,循环流程则变为:
在这里插入图片描述
d_i[0]—d_i[7]同时进行计算,而d_i[8]和d_i[0]存放在同一个BRAM中,使用流水线进行计算。不需要等到d_i[0]计算完了存放在d_o[0]之后再来读取d_i[8]。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过引用可以得知,对于HLS加速YOLO卷积层,可以使用一种高效普适性的加速器IP核。这个IP核可以用于硬件加速,并根据YOLO v2算法的不同网络层的运算功能进行硬件设计优化。在这个加速器IP核中,卷积层、池化层和重排序层的运算都会使用到同一IP核。该加速器IP核会从DRAM中持续读取数据并存储在不同的缓存单元中,在输出特征图数据复用的方式下完成不同的运算,并将最终的结果写回DRAM。对于数据复用策略,可以通过加载每个输出特征映射的权重,在计算开始之前进行数据复用,以减少访存降低时延。此外,还可以对输入特征图进行数据复用,即重复使用同一块输入特征图进行计算,并在所有卷积核计算完成后再更新输入数据。层融合是将YOLO v2的主要网络层融合到一起,将占据大部分运算量的卷积层和池化层都看作卷积运算,将路由层和重排序层视为存储重新整理,并在PL侧实现这些网络层。最后,通过高层次综合(High-level Synthesis,HLS)工具,可以将电路设计规范的算法级或行为级描述转化为电路结构描述的方法和过程,实现软件算法设计的硬件加速和硬件电路设计的抽象级设计和验证。使用Xilinx公司的Vivado HLS工具,可以将C、C++或SystemC语言编写的算法综合成VHDL或Verilog HDL语言的RTL代码,从而更高效地完成设计和仿真。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [目标检测YOLO实战应用案例100讲-基于FPGA的目标检测硬件加速技术及其应用研究](https://blog.csdn.net/qq_36130719/article/details/130768007)[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_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值