CN116861143A - 一种小输入图小权重的卷积的实现方法 - Google Patents
一种小输入图小权重的卷积的实现方法 Download PDFInfo
- Publication number
- CN116861143A CN116861143A CN202210312160.4A CN202210312160A CN116861143A CN 116861143 A CN116861143 A CN 116861143A CN 202210312160 A CN202210312160 A CN 202210312160A CN 116861143 A CN116861143 A CN 116861143A
- Authority
- CN
- China
- Prior art keywords
- data
- load
- width
- input
- wram
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 47
- 238000010586 diagram Methods 0.000 title claims abstract description 14
- 238000004364 calculation method Methods 0.000 claims abstract description 33
- 238000013500 data storage Methods 0.000 claims abstract description 4
- 230000009191 jumping Effects 0.000 claims description 9
- 239000011159 matrix material Substances 0.000 description 4
- 230000004048 modification Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000001133 acceleration Effects 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F17/00—Digital computing or data processing equipment or methods, specially adapted for specific functions
- G06F17/10—Complex mathematical operations
- G06F17/15—Correlation function computation including computation of convolution operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3885—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
- G06F9/3887—Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Computational Mathematics (AREA)
- Algebra (AREA)
- Databases & Information Systems (AREA)
- Computing Systems (AREA)
- Image Processing (AREA)
Abstract
本发明提供了一种小输入图小权重的卷积的实现方法,包括:S1,设定数据的存储:设定特征图的存储方式:特征图数据存储顺序:32,W,H,N,其中32为深度的一部分,W为宽,H为高,N为深度上有多少个32的个数,即32*N为特征图的深度;设定权重的存储方式:采用32*32上连续,接着在卷积核的宽度上连续,再在卷积核的高度上连续,接着在卷积核的输入深度/32的个数上连续,最后在输出深度/32的个数上连续;在处理之前需要将通常的输入深度连续,再存储卷积核宽高,最后卷积核输出深度存储成需要的顺序;S2,使用simd指令将所有数据从ddr加载到fram,wram,每次加载32个数据;S3,卷积计算的实现。本方法实现了小输入特征图小权重的计算,实现加速,提高效率。
Description
技术领域
本发明涉及图像处理技术领域,特别涉及一种小输入图小权重的卷积的实现方法。
背景技术
北京君正集成电路股份有限公司的T40型号芯片(简称:北京君正T40芯片)是一种AI的深度学习的低功耗芯片。拥有独立计算的卷积计算单元,独特的simd指令。拥有一个oram存储,一个存放权重的wram和一个存放输入数据的fram。其实现方法,必须将数据存放到wram和fram中,然后才能进行卷积计算。oram、wram、fram大小为芯片给定大小。例如,wram大小为288*1024byte,fram为128*1024byte;oram大小为2048*1024byte。在下面计算使用中会用到这些假设的数据。
所有数据存储在ddr中,需要dma指令搬数到oram,或simd指令加载数据到制定寄存器,再用特殊指令搬到wram或fram中。
由于这是一款新的芯片。普通算法虽然可以实现,但效率很低。并且现有方法无法使用特有的计算单元和指令。不同大小输入特征图和不同的权重,实现方法不一样,使用不合适的算法导致效率急剧下降。
另外,现有技术中的常用术语如下:
1、卷积核:卷积核是用来做图像处理时的矩阵,与原图像做运算的参数。卷积核通常是一个列矩阵数组成(例如3*3的矩阵),该区域上每个方格都有一个权重值。矩阵形状一般是1×1,3×3,5×5,7×7,1×3,3×1,2×2,1×5,5×1,…
2、卷积:将卷积核的中心放置在要计算的像素上,一次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结构就是该位置的新像素值,这个过程称为卷积。
3、特征图:输入数据通过卷积计算后得到的结果称之为特征图,数据通过全连接后生成的结果也称为特征图。特征图大小一般表示为长×宽×深度,或1×深度。
4、FRAM(Feature RAM,即特征图的RAM):是一种存储器,用于存储全部或部分特征图,直接供给硬件计算单元计算的存储器。属于计算单元的存储部分。使用计算单元,必须把特征图数据先放到FRAM。
5、WRAM(Weight RAM,即权重的RAM):是一种存储器,用于存储全部或部分权重,直接供给硬件计算单元计算的存储器。属于计算单元的存储部分。使用计算单元,必须把权重数据先放到FRAM。
发明内容
为了解决上述现有技术中的问题,本申请的目的在于:为了解决上述这种情况,根据特殊情况,设计了如下一种特殊的计算方法,特别是在北京君正T40芯片上实现小输入特征图,小权重的计算。
具体地,本发明提供一种小输入图小权重的卷积的实现方法,所述方法包括以下步骤:
S1,设定数据的存储:
设定特征图的存储方式:特征图数据存储顺序:32,W,H,N,其中32为深度的一部分,W为宽,H为高,N为深度上有多少个32的个数,即32*N为特征图的深度;数据在32上连续,再在宽度上连续,接着在高度上连续,最后在深度/32的个数上连续;
设定权重的存储方式:采用32*32上连续,接着在卷积核的宽度上连续,再在卷积核的高度上连续,接着在卷积核的输入深度/32的个数上连续,最后在输出深度/32的个数上连续;在处理之前需要将通常的输入深度连续,再在卷积核的宽度上连续,最后卷积核输出深度的连续的数据,存储成需要的顺序;
S2,使用simd指令将所有数据从ddr加载到fram,wram,每次加载32个数据:
S2.1,使用simd指令将所有数据从ddr加载到fram,每次加载32个数据:
使用simd加载数据指令加载到VR0,VR1中;
使用fram加载数据指令,加载数据到fram;
由于特征图存储顺序已经是按照要求存储,并且数据大小能够完全放到fram中,所以能够按照默认顺序直接存储,直到所有数据全部存放完毕;
S2.2,使用simd指令将所有数据从ddr加载到wram,每次加载32个数据:
使用simd加载数据指令加载到VR0,VR1中;
使用wram加载数据指令,加载数据到wram;
由于权重存储顺序已经是按照要求存储,并且数据大小能够完全放到wram中,所以可以按照默认顺序直接存储,直到所有数据全部存放完毕;S3,卷积计算的实现:
计算卷积,需要给定fram的初始地址,初始为0,wram的初始地址,初始也为0;
设输入特征图深度为32*in_ic32,in_ic32为输入深度的倍数,
输入宽度为in_width,输入高度in_height;
输出特征图深度为32*out_ic32,out_ic32为输出深度的倍数,
输出宽度为out_width,输入高度out_height;
卷积核宽为kernel_w,高为kernel_h;
卷积核宽度方向步长为stride_w,卷积核高度度方向为stride_h;
输出特征图宽度与输入特征图宽度的关系in_width=out_width*stride_w,输出特征图高度与输入特征图高度的关系in_height=out_height*stride_h;如果不等,需要根据具体的卷积要求对输入特征图补0,补齐到相等的宽高位置;例如当卷积核为3时,步长为1,输出特征图宽高与输入特征图宽高一样,那么需要对输入特征图补0,填充的方法根据使用者要求情况而定,可以左右上下均等填充,也可以只填充一边;
生成结果保存到vrd中。
所述方法适用于输入特征图比较小,即特征图数据个数小于等于fram,权重比较小,即权重个数小于等于wram,fram、wram能够容纳下,比特位数均为8比特,卷积核长或宽不超过3的情况;同时要求输入深度是32的倍数,输出深度也是32的倍数;如果模型中的一些层输入深度不是32倍数,需要进行补齐为32的倍数;相应的权重也是补齐处理。
所述方法包含指令如下:
a)卷积计算指令:
ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,feature_w,feature_h,vrd);
输入变量fram_id为fram使用的起始地址,wram_id为wram使用的起始地址,ic32_num为计算的个数,kernel_w为卷积核的宽度,kernel_h为卷积核的高度,stride_x为卷积计算x方向的步长,stride_y为卷积计算y方向的步长,feature_w为输入特征图的宽,feature_h为输入特征图的高,vrd为生成结果;
使用说明:
每次计算4个像素点结果;计算单元为深度32,生成结果也是32,生成4个pixel结果;如果ic32_num=1,就是计算输入深度为32x1,生成输出深度为32的4个pixel;如果ic32_num=2,就是计算输入深度为32x2,生成输出深度为32的4个pixel;如果ic32_num=3,是计算输入深度为32x3,生成输出深度为32的4个pixel;计算的最小深输入深度为32,最小输出深度为32,最小输出结果pixel个数为4;设置fram的宽度,也就是加载输入特征图中多少个piexl,属于卷积计算指令的参数设置,当前是设置处理的宽度为feature_w;
b)simd加载数据指令:
设为ingenic_load(indata,VR0,m)
输入待载入的数据,当前是数据的指针记为indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,
如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据;数据加载到变量vrd寄存器中;其中m是按照byte,即8bit为一个单位计算;VR0为simd的VR寄存器,最多存储512bit数据;
c)fram加载数据指令:
设为ingenic_vr2fram(VR0,fram_load_id,num)
输入变量,VR0为输入数据,fram_load_id为加载到fram中的开始地址,num为0或1,0时是指令结束后fram_load_id数据不变,1时指令结束后fram_load_id=fram_load_id+32;
d)wram加载数据指令:
设为ingenic_vr2wram(VR0,wram_load_id,num)
输入变量,VR0为输入数据,wram_load_id为加载到wram中的开始地址,num为0或1,0时是指令结束后wram_load_id数据不变,1时指令结束后wram_load_id=fram_load_id+32。
所述步骤S2.1中,使用simd加载数据指令加载到VR0,VR1中:
ingenic_load(indata,VR0,1)
ingenic_load(indata,VR0,1)
ingenic_load(indata,VR1,1)
ingenic_load(indata,VR1,1)
使用fram加载数据指令,加载数据到fram:
ingenic_vr2fram(VR0,fram_load_id,1)
ingenic_vr2fram(VR1,fram_load_id,1);
所述步骤S2.2中,使用simd加载数据指令加载到VR0,VR1中:
ingenic_load(widthdata,VR0,1)
ingenic_load(widthdata,VR0,1)
ingenic_load(widthdata,VR1,1)
ingenic_load(widthdata,VR1,1)
使用wram加载数据指令,加载数据到wram:
ingenic_vr2wram(VR0,wram_load_id,1)
ingenic_vr2wram(VR1,wram_load_id,1)。
所述步骤S2.1中,当fram无法存放下时,无法使用该方法;所述步骤S2.2中,当wram无法存放下时,无法使用该方法。
所述步骤S3中,卷积计算,生成的顺序为:
先生成第一个32*out_width*out_height,
再生成第二个32*out_width*out_height,
……
直到最后一个32*out_width*out_height;
在每个32*out_width*out_height中,先生成第一行的32*out_width,再生成第二行的32*out_width,直到最后一行的32*out_width;
对于32*out_width,先生成第一个32*4,再生成第二个32*4,直到最后一个32*4,也就是完成32*out_width。
所述步骤S3的具体实现如下:
S3.1,初始化wram_id=0;
S3.2,初始化ocnum_i=0,假设ocnum_i<out_ic32成立,则继续执行,且ocnum_1++;不成立,则跳出本步骤;
S3.3,初始化ydir_i=0,假设ydir_i<out_height成立,则继续执行,且ydir_i++;不成立,则跳出本步骤;
执行fram_id=(out_width*stride_w)*(ydir_i*stride_h)*32*in_ic32;
执行vrd=out_width*ydir_i*32*in_ic32;
S3.4,初始化xdir_i=0,假设xdir_i<out_width成立,则继续执行,且xdir_i+=4;不成立,则跳出本步骤;
执行fram_id=fram_id+32*4*stride_w;
执行ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,in_width,in_height vrd);
执行vrd=vrd+32*4。
由此,本申请的优势在于:通过设计本申请的方法,实现小输入特征图,小权重的计算,实现加速,提高效率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,并不构成对本发明的限定。
图1是本发明的方法流程图。
图2是本发明方法涉及的代码示意图。
具体实施方式
为了能够更清楚地理解本发明的技术内容及优点,现结合附图对本发明进行进一步的详细说明。
本发明涉及一种小输入图小权重的卷积的实现方法,所述方法:
1.适用要求。可在例如北京君正T40芯片上使用,特征图大小可以在oram里容纳,权重相对较小,wram能够容纳下,比特位数均为8比特,每次计算生成8个pixel需要的特征图数据可以完全放到fram中。指令如下:
a)卷积计算指令:
ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,feature_w,feature_h,vrd);1、使用要求。这是在北京君正T40芯片上使用,特征图比较小,权重也比较小,fram、wram能够容纳下,比特位数均为8比特。指令如下:
a)卷积计算指令:
ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,feature_w,feature_h,vrd);
输入变量fram_id为fram使用的起始地址,wram_id为wram使用的起始地址,ic32_num为计算的个数,kernel_w为卷积核的宽度,kernel_h为卷积核的高度,stride_x为卷积计算x方向的步长,stride_y为卷积计算y方向的步长,feature_w为输入特征图的宽,feature_h为输入特征图的高。vrd为生成结果。
使用说明:每次计算4个像素点结果。计算单元为深度32,生成结果也是32,生成4个pixel结果。如果ic32_num=1,就是计算输入深度为32x1,生成输出深度为32的4个pixel。如果ic32_num=3,是计算输入深度为32x3,生成输出深度为32的4个pixel。如果ic32_num=2,就是计算输入深度为32x2,生成输出深度为32的4个pixel。如果ic32_num=3,是计算输入深度为32x3,生成输出深度为32的4个pixel。计算的最小深输入深度为32,最小输出深度为32,最小输出结果pixel个数为4。设置fram的宽度,也就是加载输入特征图中多少个piexl,属于卷积计算指令的参数设置,当前是设置处理的宽度为feature_w。
b)simd加载数据指令:
ingenic_load(indata,VR0,m)
输入的待载入的数据,当前是数据的指针indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据。数据加载到变量vrd寄存器中。其中m是按照byte,即8bit为一个单位计算。VR0为simd的VR寄存器,最多存储512bit数据。
c)fram加载数据指令:
ingenic_vr2fram(VR0,fram_load_id,num)
输入变量,VR0为输入数据,fram_load_id为加载到fram中的开始地址,num为0或1,0时是指令结束后fram_load_id数据不变,1时指令结束后fram_load_id=fram_load_id+32。
d)wram加载数据指令:
ingenic_vr2wram(VR0,wram_load_id,num)
输入变量,VR0为输入数据,wram_load_id为加载到wram中的开始地址,num为0或1,0时是指令结束后wram_load_id数据不变,1时指令结束后wram_load_id=fram_load_id+32。
2、卷积计算
该方法适用于输入特征图比较小(特征图数据个数小于等于fram),权重比较小(权重个数小于等于wram),卷积核长或宽不超过3的情况。同时要求输入深度要求是32的倍数,输出深度也是32的倍数。如果模型中的一些层输入深度不是32倍数,需要进行补齐为32的倍数。相应的权重也是补齐处理。
具体地,如图1所示,所述方法包括以下步骤:
S1,数据的存储
特征图的存储方式:特征图数据存储顺序,32,W,H,N。其中32为深度的一部分,W为宽,H为高,N为深度上有多少个32的个数,即32*N为特征图的深度。数据在32上连续,再在宽度上连续,接着在高度上连续,最后在深度/32的个数上连续。
权重的存储方式,采用32*32上连续,接着在卷积核的宽度上连续,再在卷积核的高度上连续,接着在卷积核的输入深度/32的个数上连续,最后在输出深度/32的个数上连续。在处理之前需要将通常的输入深度连续,再卷积核宽高,最后卷积核输出深度存储成需要的顺序。
S2,使用simd将所有数据从ddr加载到fram,wram,每次加载32个数据:
S2.1,使用simd将所有数据从ddr加载到fram,每次加载32个数据:
使用simd加载数据指令加载到VR0,VR1中:
ingenic_load(indata,VR0,1)
ingenic_load(indata,VR0,1)
ingenic_load(indata,VR1,1)
ingenic_load(indata,VR1,1)
使用fram加载数据指令,加载数据到fram。
ingenic_vr2fram(VR0,fram_load_id,1)
ingenic_vr2fram(VR1,fram_load_id,1)
由于特征图存储顺序已经是按照要求存储,并且数据大小能够完全放到fram中,所以可以按照默认顺序直接存储,直到所有数据全部存放完毕。当fram无法存放下时,无法使用该方法。
S2.2,使用simd将所有数据从ddr加载到wram,每次加载32个数据:
使用simd加载数据指令加载到VR0,VR1中
ingenic_load(widthdata,VR0,1)
ingenic_load(widthdata,VR0,1)
ingenic_load(widthdata,VR1,1)
ingenic_load(widthdata,VR1,1)
使用wram加载数据指令,加载数据到wram。
ingenic_vr2wram(VR0,wram_load_id,1)
ingenic_vr2wram(VR1,wram_load_id,1)
由于权重存储顺序已经是按照要求存储,并且数据大小能够完全放到wram中,所以可以按照默认顺序直接存储,直到所有数据全部存放完毕。当wram无法存放下时,无法使用该方法。
S3,卷积计算的实现。
计算卷积,需要给定fram的初始地址,初始为0,wram的初始地址,初始也为0。设输入特征图深度为32*in_ic32,in_ic32为输入深度的倍数,输入宽度为in_width,输入高度in_height;输出特征图深度为32*out_ic32,out_ic32为输出深度的倍数,输出宽度为out_width,输入高度out_height;卷积核宽为kernel_w,高为kernel_h;卷积核宽度方向步长为stride_w,卷积核高度度方向为stride_h。输出特征图宽度与输入特征图宽度的关系in_width=out_width*stride_w,输出特征图高度与输入特征图高度关系in_height=out_height*stride_h。如果不等需要根据具体的卷积要求对输入特征图补0,补齐到相等的宽高位置(例如当卷积核为3时,步长为1,输出特征图宽高与输入特征图宽高一样,那么需要对输入特征图补0,填充的方法根据使用者要求情况而定,可以左右上下均等填充,也可以只填充一边)。生成结果保存到vrd中。
卷积计算,生成的顺序为:先生成第一个32*out_width*out_height,再生成第二个32*out_width*out_height,直到最后一个32*out_width*out_height。在每个32*out_width*out_height中,先生成第一行的32*out_width,再生成第二行的32*out_width,直到最后一行的32*out_width。对于32*out_width,先生成第一个32*4,再生成第二个32*4,直到最后一个32*4,也就是完成32*out_width。
如图2所示,步骤S3具体实现如下:
S3.1,初始化wram_id=0;
S3.2,初始化ocnum_i=0,假设ocnum_i<out_ic32成立,则继续执行,且ocnum_1++;不成立,则跳出本步骤;
S3.3,初始化ydir_i=0,假设ydir_i<out_height成立,则继续执行,且ydir_i++;不成立,则跳出本步骤;
执行fram_id=(out_width*stride_w)*(ydir_i*stride_h)*32*in_ic32;
执行vrd=out_width*ydir_i*32*in_ic32;
S3.4,初始化xdir_i=0,假设xdir_i<out_width成立,则继续执行,且xdir_i+=4;不成立,则跳出本步骤;
执行fram_id=fram_id+32*4*stride_w;
执行ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,in_width,in_height vrd);
执行vrd=vrd+32*4。
综上所述,本申请的关键点在于:
特征图的存储方式,权重的存储方式,数据加载到fram和wram的方法;以及卷积的实现方法。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明实施例可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种小输入图小权重的卷积的实现方法,其特征在于,所述方法包括以下步骤:
S1,设定数据的存储:
设定特征图的存储方式:特征图数据存储顺序:32,W,H,N,其中32为深度的一部分,W为宽,H为高,N为深度上有多少个32的个数,即32*N为特征图的深度;数据在32上连续,再在宽度上连续,接着在高度上连续,最后在深度/32的个数上连续;
设定权重的存储方式:采用32*32上连续,接着在卷积核的宽度上连续,再在卷积核的高度上连续,接着在卷积核的输入深度/32的个数上连续,最后在输出深度/32的个数上连续;在处理之前需要将通常的输入深度连续,再在卷积核的宽度上连续,最后卷积核输出深度的连续的数据,存储成需要的顺序;
S2,使用simd指令将所有数据从ddr加载到fram,wram,每次加载32个数据:
S2.1,使用simd指令将所有数据从ddr加载到fram,每次加载32个数据:
使用simd加载数据指令加载到VR0,VR1中;
使用fram加载数据指令,加载数据到fram;
由于特征图存储顺序已经是按照要求存储,并且数据大小能够完全放到fram中,所以能够按照默认顺序直接存储,直到所有数据全部存放完毕;S2.2,使用simd指令将所有数据从ddr加载到wram,每次加载32个数据:
使用simd加载数据指令加载到VR0,VR1中;
使用wram加载数据指令,加载数据到wram;
由于权重存储顺序已经是按照要求存储,并且数据大小能够完全放到wram中,所以可以按照默认顺序直接存储,直到所有数据全部存放完毕;S3,卷积计算的实现:
计算卷积,需要给定fram的初始地址,初始为0,wram的初始地址,初始也为0;
设输入特征图深度为32*in_ic32,in_ic32为输入深度的倍数,
输入宽度为in_width,输入高度in_height;
输出特征图深度为32*out_ic32,out_ic32为输出深度的倍数,
输出宽度为out_width,输入高度out_height;
卷积核宽为kernel_w,高为kernel_h;
卷积核宽度方向步长为stride_w,卷积核高度度方向为stride_h;
输出特征图宽度与输入特征图宽度的关系in_width=out_width*stride_w,输出特征图高度与输入特征图高度的关系in_height=out_height*stride_h;如果不等,需要根据卷积要求对输入特征图补0,补齐到相等的宽高位置,生成结果保存到vrd中。
2.根据权利要求1所述的一种小输入图小权重的卷积的实现方法,其特征在于,所述方法适用于输入特征图数据个数小于等于fram,权重个数小于等于wram,fram、wram能够容纳下,比特位数均为8比特,卷积核长或宽不超过3的情况;同时要求输入深度是32的倍数,输出深度也是32的倍数;如果模型中的一些层输入深度不是32倍数,需要进行补齐为32的倍数;相应的权重也是补齐处理。
3.根据权利要求1所述的一种小输入图小权重的卷积的实现方法,其特征在于,所述方法包含指令如下:
a)卷积计算指令:
ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,feature_w,feature_h,vrd);
输入变量fram_id为fram使用的起始地址,wram_id为wram使用的起始地址,ic32_num为计算的个数,kernel_w为卷积核的宽度,kernel_h为卷积核的高度,stride_x为卷积计算x方向的步长,stride_y为卷积计算y方向的步长,feature_w为输入特征图的宽,feature_h为输入特征图的高,vrd为生成结果;
使用说明:
每次计算4个像素点结果;计算单元为深度32,生成结果也是32,生成4个pixel结果;如果ic32_num=1,就是计算输入深度为32x1,生成输出深度为32的4个pixel;如果ic32_num=2,就是计算输入深度为32x2,生成输出深度为32的4个pixel;如果ic32_num=3,是计算输入深度为32x3,生成输出深度为32的4个pixel;计算的最小深输入深度为32,最小输出深度为32,最小输出结果pixel个数为4;设置fram的宽度,也就是加载输入特征图中多少个piexl,属于卷积计算指令的参数设置,当前是设置处理的宽度为feature_w;
b)simd加载数据指令:
设为ingenic_load(indata,VR0,m)
输入待载入的数据,当前是数据的指针记为indata,从该数据indata在内存里指向的位置m开始加载128bit的数据,
如果是8bit的数据是加载16个,如果是16bit数据加载8个,如果是32bit,加载4个数据;数据加载到变量vrd寄存器中;其中m是按照byte,即8bit为一个单位计算;VR0为simd的VR寄存器,最多存储512bit数据;
c)fram加载数据指令:
设为ingenic_vr2fram(VR0,fram_load_id,num)
输入变量,VR0为输入数据,fram_load_id为加载到fram中的开始地址,num为0或1,0时是指令结束后fram_load_id数据不变,1时指令结束后fram_load_id=fram_load_id+32;
d)wram加载数据指令:
设为ingenic_vr2wram(VR0,wram_load_id,num)
输入变量,VR0为输入数据,wram_load_id为加载到wram中的开始地址,num为0或1,0时是指令结束后wram_load_id数据不变,1时指令结束后wram_load_id=fram_load_id+32。
4.根据权利要求4所述的一种小输入图小权重的卷积的实现方法,其特征在于,
所述步骤S2.1中,使用simd加载数据指令加载到VR0,VR1中:
ingenic_load(indata,VR0,1)
ingenic_load(indata,VR0,1)
ingenic_load(indata,VR1,1)
ingenic_load(indata,VR1,1)
使用fram加载数据指令,加载数据到fram:
ingenic_vr2fram(VR0,fram_load_id,1)
ingenic_vr2fram(VR1,fram_load_id,1);
所述步骤S2.2中,使用simd加载数据指令加载到VR0,VR1中:
ingenic_load(widthdata,VR0,1)
ingenic_load(widthdata,VR0,1)
ingenic_load(widthdata,VR1,1)
ingenic_load(widthdata,VR1,1)
使用wram加载数据指令,加载数据到wram:
ingenic_vr2wram(VR0,wram_load_id,1)
ingenic_vr2wram(VR1,wram_load_id,1)。
5.根据权利要求1所述的一种小输入图小权重的卷积的实现方法,其特征在于,所述步骤S2.1中,当fram无法存放下时,无法使用该方法;所述步骤S2.2中,当wram无法存放下时,无法使用该方法。
6.根据权利要求3所述的一种小输入图小权重的卷积的实现方法,其特征在于,所述步骤S3中,卷积计算,生成的顺序为:
先生成第一个32*out_width*out_height,
再生成第二个32*out_width*out_height,
……
直到最后一个32*out_width*out_height;
在每个32*out_width*out_height中,先生成第一行的32*out_width,再生成第二行的32*out_width,直到最后一行的32*out_width;
对于32*out_width,先生成第一个32*4,再生成第二个32*4,直到最后一个32*4,也就是完成32*out_width。
7.根据权利要求6所述的一种小输入图小权重的卷积的实现方法,其特征在于,所述步骤S3的具体实现如下:
S3.1,初始化wram_id=0;
S3.2,初始化ocnum_i=0,假设ocnum_i<out_ic32成立,则继续执行,且ocnum_1++;不成立,则跳出本步骤;
S3.3,初始化ydir_i=0,假设ydir_i<out_height成立,则继续执行,且ydir_i++;不成立,则跳出本步骤;
执行fram_id=(out_width*stride_w)*(ydir_i*stride_h)*32*in_ic32;
执行vrd=out_width*ydir_i*32*in_ic32;
S3.4,初始化xdir_i=0,假设xdir_i<out_width成立,则继续执行,且xdir_i+=4;不成立,则跳出本步骤;
执行fram_id=fram_id+32*4*stride_w;
执行ingenic_conv_bit8(fram_id,wram_id,ic32_num,kernel_w,kernel_h,stride_x,stride_y,in_width,in_height vrd);
执行vrd=vrd+32*4。
8.根据权利要求1所述的一种小输入图小权重的卷积的实现方法,其特征在于,所述根据卷积要求对输入特征图补0时,假设当卷积核为3时,步长为1,输出特征图宽高与输入特征图宽高一样,那么需要对输入特征图补0,填充的方法根据使用者要求情况而定,左右上下均等填充,或者,只填充一边。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210312160.4A CN116861143A (zh) | 2022-03-28 | 2022-03-28 | 一种小输入图小权重的卷积的实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210312160.4A CN116861143A (zh) | 2022-03-28 | 2022-03-28 | 一种小输入图小权重的卷积的实现方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116861143A true CN116861143A (zh) | 2023-10-10 |
Family
ID=88225500
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210312160.4A Pending CN116861143A (zh) | 2022-03-28 | 2022-03-28 | 一种小输入图小权重的卷积的实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116861143A (zh) |
-
2022
- 2022-03-28 CN CN202210312160.4A patent/CN116861143A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109919311B (zh) | 生成指令序列的方法、执行神经网络运算的方法和装置 | |
US5973705A (en) | Geometry pipeline implemented on a SIMD machine | |
CN110580324B (zh) | 图像矩阵运算方法、装置、计算机设备和存储介质 | |
CN111542839B (zh) | 一种反卷积神经网络的硬件加速方法、装置和电子设备 | |
CN112292816A (zh) | 处理核心数据压缩和存储*** | |
CN109993293B (zh) | 一种适用于堆叠式沙漏网络的深度学习加速器 | |
US5777599A (en) | Image generation device and method using dithering | |
KR20210014561A (ko) | 다수 컨벌루션 윈도우 중의 이미지 데이터를 추출하는 방법, 장치, 기기 및 컴퓨터 판독 가능한 저장매체 | |
US4951230A (en) | Method and apparatus for tiling an image | |
CN116861143A (zh) | 一种小输入图小权重的卷积的实现方法 | |
KR920003479B1 (ko) | 곡선의 절선근사방법 및 장치 | |
US20220253507A1 (en) | Information processing apparatus | |
JP3333779B2 (ja) | 行列演算装置 | |
CN110930290B (zh) | 一种数据处理方法及装置 | |
CN116861144A (zh) | 一种wram能放下权重的卷积的实现方法 | |
CN112801864A (zh) | 一种在深度学习硬件中的图像填充方法及装置 | |
GB2309873A (en) | Method of mapping a source pixel image to a destination pixel space | |
CA2308249C (en) | Triangle strip length maximization | |
KR930000179B1 (ko) | 도트매트릭스 프린터에서 문자의 원윤곽 인자처리 방법 | |
KR20240030359A (ko) | 신경망에서의 연산방법 및 이를 위한 장치 | |
JP3114289B2 (ja) | 文字パターン発生装置 | |
CN117492842A (zh) | 一种低比特任意大小独立卷积的simd的优化方法 | |
JPH05189558A (ja) | イメージ・データの縮小方式 | |
CN109615059B (zh) | 一种卷积神经网络中边缘填充和滤波器膨胀运算方法及*** | |
JP2781658B2 (ja) | アドレス生成回路とそれを用いたcd―rom装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |