HLS-卷积运算单元设计与SDK测试

上传人:Baige****0346 文档编号:266123132 上传时间:2022-03-14 格式:DOCX 页数:45 大小:2.66MB
返回 下载 相关 举报
HLS-卷积运算单元设计与SDK测试_第1页
第1页 / 共45页
HLS-卷积运算单元设计与SDK测试_第2页
第2页 / 共45页
HLS-卷积运算单元设计与SDK测试_第3页
第3页 / 共45页
HLS-卷积运算单元设计与SDK测试_第4页
第4页 / 共45页
HLS-卷积运算单元设计与SDK测试_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《HLS-卷积运算单元设计与SDK测试》由会员分享,可在线阅读,更多相关《HLS-卷积运算单元设计与SDK测试(45页珍藏版)》请在金锄头文库上搜索。

1、 HLS卷积运算单元设计与SDK测试 目录o 一、引言o 二、概念o 三、程序o 四、优化o 五、测试o 六、补充一、引言涉及内容包括:多位宽并行,动态定点数运算,设置LOOP_TRIPCOUNT来性能分析等。二、概念1、功能定义。为了让卷积运算单元更具灵活性,在输入图层的长宽高、卷积核的大小、Stride的大小等很多功能上可设置。2、feature的内存排布。之前的池化模块的feature,是一个四维数组。而卷积核没有分块前,也是四维的。这边按问答方式对一些概念进行整理。为什么未分块前,卷积核(feature、kernel)为四维的?从下面这张图上看,卷积核可以表示为2x3x3x3,即:个数

2、x长x宽x通道数,不同的地方将这四个参数的位置可能颠倒了下,但都只是这四个概念。下面对这四个参数做个理解,个数:表示不同卷积核的数目,对于一张完整的图(RGB都有),要提取里面的不同特征,需要多个不同的卷积核来进行提取,从之前的学习中,可以知道,卷积核本质就是特征feature,用一个特征怎么可能得到不同特征嘛,所以需要多个卷积核。长x宽:这个为卷积核的size,很好理解,是和局部特征单独运算相关的。通道数:相同卷积核的数目(权值共享),与一张完整图片中准备卷积处理的通道数相同,一般处理R、G、B通道,一个卷积核的通道数,也就为3了,同时可以得到3张feature map。在下面这张图的例子中

3、,输入6x6,kernel为3x3,输出4x4,首先确定不是same模式,为valid模式,padding为0。只看H,有4-1=(6-3+2xpadding)/stride,则stride为1。通过在通道方向上相乘求累加后,9个点再做一次累加,得到输出feature map上的一个点。为什么分块后,卷积核(feature、kernel)为五维的?从下面这张图上看,可以把kernel上任意个数据表示为kernel: CHoutKyKxCHin/KK。CHout表示的是有多少个kernel,Ky和Kx为一个kernel的宽和长,CHin/K为在输入图层方向切了多少个子块,K为每个子块的索引。因此

4、,本设计中,由一个四维的输入图层feature map和五维的feature(卷积核、权重),得到一个输出的feature map输出图层。3、卷积运算的full、same和vaild模式是啥?这个参考了前人的一篇文章,讲的很好,非常感谢,Add在最后边了。橙色为image,蓝色为kernel。1full mode模式:从image和kernel刚相交,就开始做卷积运算。而其余白色的地方全部填0,这样一张橙色的image先补了两行两列的0后,如果stride为1的卷积运算后,图片反而变大了,这模式很少用。2same mode模式:当kernel的中心K与image的边角重叠时,开始做卷积运算。

5、这种模式下,如果stride为1的卷积运算后,输出的feature map尺寸是保持不变的(相当于输入图)。相比full mode,这模式就用的多了。该模式可以在前向传播的过程中,让特征图的大小保持不变,调参师不需要精准计算尺寸的变化,因为根本就没有变化。由于卷积核的size尺寸一般为奇数,故可以总结一个padding公式,用来计算需要补多少行列的0数据,才能满足same mode模式。具体公式为:padding_x=(kx-1)/2,padding_y=(ky-1)/2。举个例子,这里size为33,那么,padding_x=padding_y=1。3valid mode模式:当kernel

6、全在image里时,进行卷积运算,明显地,会丢掉一部分的数据。如何计算卷积运算后的feature map的尺寸大小?也参考了前人的博文,但网上貌似没有发现推导的过程,举几个例子应该也能总结下,这里也直接作为经验来使用了。计算的公式为:output_h =(originalSize_h+padding x 2-kernelSize_h)/stride +1。其中,originalSize_h为原始输入image的H或W,padding为填充的行或列数,kernelSize_h为kernel的size大小,stride为x或y方向上的步长。拿一道面试的题来试试手吧。(卷积向下取整,池化向上取整)i

7、nput image:200200first layer_conv:kernel size 55,padding 1,stride 2second layer_pooling:kernel size 33,padding 0,stride 1third layer_conv:kernel size 33,padding 1,stride 1output feature map?答:1(200-5+21)/2+1 为99.5,取99。2(99-3)/1+1 为97。3(97-3+2*1)/1+1 为97。分块时为什么是沿输入图层的方向,而不是输出图层方向?为了并行地做子块的矩阵乘累加运算,得到结

8、果(和之前FIR滤波器案例类似)。要时刻把握住,是取出输入feature map的一个子块,和权重的一个子块,来进行相乘累加的操作。三、程序1、conv_core.h文件。#ifndef _CONV_CORE_H_#define _CONV_CORE_H_#include #include using namespace std;#define K 8/ 单个数据是16bit位宽,一个子块数据是16*K位宽,用bus表示。/ 输入图层和权重都是ap_inttypedef ap_int dtype_dat;typedef ap_int dtype_bus;/ 两个INT16数据相乘,得到的结果会

9、溢出,用32位来存。根据经验,用40位来作为累加的结果位宽。typedef ap_int dtype_mul;typedef ap_int dtype_mul_bus;typedef ap_int dtype_acc;/ C语言无法传可变索引的数组的,但在硬件内存中,都按照一维分布,故可以把地址传进去。/ 后续得自己计算存放的地址来取数据/ 定点化后的数据由三个小数点的参数来计算得到,INT16,小数点由四位来表示void Conv(ap_uint CHin, / 输入通道数ap_uint Hin, / 输入特征的高度ap_uint Win, / 输入特征的宽度ap_uint CHout, /

10、 输出特征的通道数ap_uint Kx, / 卷积核的宽度ap_uint Ky, / 卷积核的高度ap_uint Sx, / 卷积核扫描时,宽度方向的步进ap_uint Sy, / 卷积核扫描时,高度方向的步进ap_uint mode, / 卷积的模式,valid还是sameap_uint relu_en, / 激活非线性反激活层标志dtype_bus feature_in, / 输入feature map的数据,由于C中无法使用可变数组,故使用指针,传地址来定位具体数据,四维数组按一维分布/ 之前池化使用的是固定大小的,可以按照固定数组来传,但这里数组长度是变的ap_uint feature

11、_in_precision, / 输入feature map数据小数点位置dtype_bus W, / 输入权重的数据,也是指针索引ap_uint W_precision, / 输入权重数据小数点位置dtype_bus feature_out, / 输出feature map的数据,也是指针索引ap_uint feature_out_precision / 输出feature map数据小数点位置);/mode: 0:VALID, 1:SAME#endif2、conv_core.cpp文件。#include conv_core.h/ 输入特征图四维:C/KHWK/ 输入权重值五维:CHoutK

12、yKxCHin/KK/ 输出特征图四维:C/KHWK,均可以计算出来void Conv(ap_uint CHin, / 输入通道数(输入图层方向上的数目)(卷积核与特征图参量)ap_uint Hin, / 输入特征的高度(卷积核与特征图参量)ap_uint Win, / 输入特征的宽度(卷积核与特征图参量)ap_uint CHout, / 输出特征的通道数(卷积核参量)ap_uint Kx, / 卷积核的宽度ap_uint Ky, / 卷积核的高度ap_uint Sx, / 卷积核扫描时,宽度方向的步进ap_uint Sy, / 卷积核扫描时,高度方向的步进ap_uint mode, / 卷积

13、的模式,valid还是sameap_uint relu_en, / 激活非线性反激活层标志dtype_bus feature_in, / 输入feature map的数据,由于C中无法使用可变数组,故使用指针,传地址来定位具体数据,四维数组按一维分布/ 之前池化使用的是固定大小的,可以按照固定数组来传,但这里数组长度是变的ap_uint feature_in_precision, / 输入feature map数据小数点位置dtype_bus W, / 输入权重的数据,也是指针索引ap_uint W_precision, / 输入权重数据小数点位置dtype_bus feature_out,

14、/ 输出feature map的数据,也是指针索引ap_uint feature_out_precision / 输出feature map数据小数点位置)/mode: 0:VALID, 1:SAMEap_uint pad_x,pad_y; / padding数据,表示x和y方向待填补的行列数ap_uint CHin_div_K=(CHin+K-1)/K; / 输入图层方向上,切块后每个的长度ap_uint out_truncate;out_truncate=feature_in_precision+W_precision-feature_out_precision;if(mode=0) / valid下不进行paddingpad_x=

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 架构

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号