CN113962361B - 一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法 - Google Patents

一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法 Download PDF

Info

Publication number
CN113962361B
CN113962361B CN202111178327.4A CN202111178327A CN113962361B CN 113962361 B CN113962361 B CN 113962361B CN 202111178327 A CN202111178327 A CN 202111178327A CN 113962361 B CN113962361 B CN 113962361B
Authority
CN
China
Prior art keywords
data
write
max
sub
addr
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.)
Active
Application number
CN202111178327.4A
Other languages
English (en)
Other versions
CN113962361A (zh
Inventor
杨晨
席嘉蔚
王佳兴
杨尧尧
梅魁志
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xian Jiaotong University
Original Assignee
Xian Jiaotong University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Xian Jiaotong University filed Critical Xian Jiaotong University
Priority to CN202111178327.4A priority Critical patent/CN113962361B/zh
Publication of CN113962361A publication Critical patent/CN113962361A/zh
Application granted granted Critical
Publication of CN113962361B publication Critical patent/CN113962361B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/045Combinations of networks
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/06Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
    • G06N3/063Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Health & Medical Sciences (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Biomedical Technology (AREA)
  • Biophysics (AREA)
  • General Health & Medical Sciences (AREA)
  • General Physics & Mathematics (AREA)
  • Evolutionary Computation (AREA)
  • Computational Linguistics (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Mathematical Physics (AREA)
  • Software Systems (AREA)
  • Artificial Intelligence (AREA)
  • Neurology (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Error Detection And Correction (AREA)

Abstract

本发明公开了一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法,通过多BANK的存储器设计方案为基于Winograd算法的卷积神经网络加速器提供了一种高并行度、高效率的数据存储和调度方案,并且给出了针对于所有BANK的数据读写地址、使能信号的表达式,便于直接映射到硬件设计方案当中,有效的解决了加速器的访存冲突问题和数据调度问题。

Description

一种面向基于Winograd的CNN加速器系统的数据无冲突调度 方法
技术领域
本发明属于神经网络加速器设计领域,具体涉及一种面向基于Winograd的卷积神经网络加速器运算数据无冲突存储组织和调度的方法。
背景技术
基于Winograd算法的卷积神经网络加速器已经被证明相较于传统卷积算法能够有效的减少卷积运算过程中乘法运算的数量,相较于加法运算,乘法运算往往更加复杂,更加消耗资源和时间,因此基于Winograd算法的卷积神经网络加速器能够有效的提高卷积神经网络中卷积运算的性能和效率。
然而Winograd算法的尺寸对卷积加速的效果会产生很大的影响,F(2,3)尺寸的Winograd算法的加速效果相对而言是最高的,针对于F(2,3)尺寸的基于Winograd算法的加速器,由于其算法输入图像数据尺寸大小固定为4*4,卷积核尺寸大小固定为3*3,单次Winograd算法之后输出结果数据尺寸为2*2,在多层卷积神经网络的运算过程中,某一层的输出结果需要作为下一层网络的输入数据,因此数据必然需要存放在Inout buffer当中,而像之前提到的,由于加速器的输入数据尺寸与输出数据尺寸大小不同,必然导致数据读写模式不同,从而影响加速器数据带宽,间接影响加速器的性能和效率,而现阶段没有相应的关于其数据存储和调度的详细策略,因而本文将给出一种有效的、统一的数据存储和调度策略。
发明内容
本发明的目的在于提供一种面向基于Winograd的卷积神经网络加速器运算数据无冲突存储组织和调度的方法。
本发明采用如下技术方案来实现的:
一种基于Winograd的卷积神经网络加速器系统,包括:
A网络参数信息配置文件,用于存储神经网络每一层的配置信息;
B数据读写控制器,用于提取A网络参数信息配置文件中神经网络配置信息并生成数据读写过程中的地址以及加速器数据通路计算迭代次数信息;
C多BANK数据存储器,用于存储加速器运算过程中的中间数据;
D加速器数据通路,用于按照B数据读写控制器给出的数据读取地址从C多BANK数据存储器中读取数据完成加速器的计算流程,计算的结果又按照B数据读写控制器给出的数据写入地址存储到C多BANK数据存储器当中。
一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法,作为神经网络加速器的B数据读写控制器的数据读写地址生成方法,包括以下步骤:
1)将每次运算时数据读取尺寸大小定义为存储空间基本单位,根据整体数据量定义数据存储空间大小;
2)通过按列读取的方式根据数据读取地址信息从上一步骤定义的数据存储空间中读取相应数据进行计算;
3)上一步骤中读取的数据计算完成后通过按列写入的方式将计算结果再根据数据写入地址、写使能信息写回到数据存储空间当中。
本发明至少具有如下有益的技术效果:
本发明提供的一种基于Winograd的卷积神经网络加速器系统,神经网络加速器的整体结构包含以下四部分模块:1)网络参数信息配置文件;2)数据读写控制器;3)多BANK数据存储器以及4)加速器数据通路。1)网络参数信息配置文件主要存储神经网络模型的每一层参数信息,之后将这些网络参数信息传输到2)数据读写控制器当中进行计算和处理,生成对于3)多BANK数据存储器的控制信息,包括读数写数据地址、使能信号等等信息,从而根据数据读取地址从存储器当中读取数据作为4)加速器数据通路的输入数据进行计算,计算完成后的数据又根据数据写入公式写入到数据存储器的相应位置上作为下一层神经网络的输入数据。
本发明提供的一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法,通过多BANK的片上存储结构大大提高了数据访问的带宽,通过按列读写数据的方式一方面提高了数据读写的并行度,另一方面也方便了卷积计算过程中由于滑动窗口所带来的数据复用问题,能够有效的解决基于Winogad算法的卷积神经网络加速器的访存冲突问题和数据存储调度问题,同时,本发明给出的读写数据地址调度公式可以直接映射到具体的硬件设计的地址生成过程当中。
附图说明
图1展示了基于Winograd算法的卷积神经网络加速器数据存储和调度方案基本结构图;
图2展示了网络参数配置信息文件;
图3展示了数据读写控制器功能模块图;
图4展示了多BANK数据存储器结构图;
图5展示了基于Winograd算法的卷积神经网络加速器数据通路;
图6展示了Yolov3_tiny网络模型;
图7展示了卷积层输入数据为偶数时的padding方案;
图8展示了卷积层输入数据为奇数时的padding方案;
图9展示了Sub_BANK的结构图;
图10展示了Sub_BANK数据读取的工作模式;
图11展示了16*16尺寸输入数据按列读取示例;
图12展示了数据读取Sub_BANK的象限分组;
图13展示了2*2数据写入方式示意图(红色框为padding的零值元素,斜纹框为需要写入的2*2数据);
图14展示了16*16数据尺寸的输出数据中Sub_bank1数据写入情况(斜纹块代表所有需要写入到Sub_bank1中的数据);
图15展示了1*1数据写入方式示意图(红色框为padding的零值元素,斜纹框为需要写入的1*1数据);
图16展示了多BANK数据存储结构图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
基于Winograd算法的卷积神经网络加速器(以下简称加速器),整体结构可分为以下几个部分:1)网络参数信息配置文件;2)数据读写控制器;3)多BANK数据存储器以及4)加速器数据通路。整体结构如图1。一种面向基于Winograd的卷积神经网络加速器运算数据无冲突存储组织和调度的方法则体现在2)数据读写控制器中关于数据读写地址的生成过程上。
接下来按照顺序对其中的模块进行详细介绍:
1)网络参数信息配置文件模块主要存储神经网络每一层的配置信息,共21位,如图2,主要包括:
该层的网络类型;2>该层的卷积核尺寸;3>该层的步长;4>该层是否进行Relu激活;5>该层是否进行Maxpooling池化;7>该层输入数据的padding方式;8>该层输入和输出数据尺寸;9>该层输入和输出通道数;这些信息存放在外部文件当中,每一行的21位数据包含了网络某一层的信息。
2)数据读写控制器主要负责生成数据读写过程中的地址以及加速器数据通路计算迭代次数等信息,如图2,包括以下内容:
1>输入通道计算迭代次数;2>输出通道计算迭代次数;3>滑动窗口次数;4>输出数据写RAM地址;5>输入数据读RM地址;
关于数据读写控制器相关信息具体的计算推导过程如下:
为了便于分析和说明,以Yolov3_tiny神经网络模型为例来介绍本发明内容,Yolov3_tiny网络模型见图6。如图6,Yolov3_tiny网络模型主要由卷积层(Conv)、池化层(Maxpooling)、路由层(Route)和上采样层(Upsample)等网络层构成,其中,路由层仅仅是一个数据读取的过程,而上采样层后边跟着Concat层,因此只有卷积层和池化层对于基于加速器计算之后的输出数据写入过程有直接关系。另外发现Yolov3_tiny网络中的池化层都是跟在卷积层之后的,因此可以将池化计算作为可选择项跟在卷积层之后,这样就统一了加速器的输入数据尺寸为4*4大小,而输出数据尺寸则分为2*2(卷积层输出)和1*1(池化层输出)两种规模,因此对于数据读写控制器而言,只有一组数据读取的地址和使能,而数据写入地址、数据写使能以及数据写入内容则有两组公式,这将在之后进行讨论和推导。
为了便于存储方案的设计和调度,本发明提出一种多BANK的存储结构来存储网络计算过程中的中间数据,数据存储器RAM按照输入通道数量分为4个BANK,对于每一个BANK又按照输入数据尺寸分为16个子BANK(Sub_BANK),如图4。
对于4个大BANK而言,每一个BANK里边分为很多个规模尺寸相同的数据块,负责存储计算得到的输出结果,每个数据块的大小都与该层网络的输出尺寸大小相同(W*H),按照图4所示的方式对数据块进行编号,那么数据块的总数与该层网络模型的输出通道数相同。对于第一次WRA数据通路计算得到的若干个2*2数据结果而言,分别按照输出通道进行排布,第一个2*2数据块放在块1的起始2*2位置上,第二个2*2数据块放在块2的起始2*2位置上,以此类推直到所有块第一个2*2数据块全部放完,之后滑动输入数据窗口进行下一次的计算。
需要注意的一点是,如图6,本发明所采取的Yolov3_tiny网络模型的所有卷积层的输出数据尺寸与输入数据尺寸都是相同的,为了达到这种效果,就必须要给卷积层的输入数据加一层0值padding,来确保输出数据尺寸不变。同时,由于该网络模型中卷积层的输入尺寸又可分为奇数和偶数两种情况,因此padding的方式也是有区别的,下面分别进行介绍:
首先需要明确一点,Winograd卷积算法的卷积计算步长为2,即对于本发明每次取4*4尺寸数据的情况而言,滑动前后有两行/列的数据是复用的。
当卷积层输入数据尺寸为偶数时:只需要在输入数据上下左右外圈通过padding的方式补上一圈0值元素即可,以6*6尺寸的原始数据为例,padding一圈0之后变成8*8尺寸,之后再按照WRA计算过程进行计算即可,padding方式如图7。
当卷积层输入数据尺寸为奇数时:需要给卷积层输入数据相邻两侧的外侧padding一圈0值元素,另外两侧padding两圈0值元素,在WRA计算完成之后还需要裁去对应于padding了两圈0的两侧边缘的一行/列数据。如图8以5*5输入数据尺寸为例,对原始数据的左侧和上侧两边各padding一圈0,右侧和下侧各padding两圈0,根据Winograd算法,在计算完得到6*6的输出数据后,还需要裁去右侧一列和下侧一行的数据,得到5*5的输出数据,与输入尺寸相同。
对于Sub_BANK而言,由于加速器数据通路的输入数据尺寸为4*4大小,为了便于读数据的调度,因此又将上面提到的4个大的BANK每一个分为16个Sub_BANK,每个Sub_BANK中存储着对应于4*4读数据块每个位置上的所有数据,如图9所示。
对于某层卷积层的4*4输入数据而言,其16个数据分别存储在16个Sub_BANK的同一位置当中。
通过以上的介绍,已经基本明确了对于加速器的数据调度大体过程,4*4尺寸的数据输入,输出数据尺寸为2*2或者1*1,接下来,分别给出数据读出时的读数据地址以及数据写入时的写数据地址、写数据使能和写数据内容的表达式。
1、数据读取(4*4数据读取方式)
首先定义如下的变量:
i:4*4数据块横向计数变量;
j:4*4数据块纵向计数变量;
i_max:横向4*4数据块最大值;
j_max:纵向4*4数据块最大值;
in_ch:当前输入通道的计数变量;
sub_i_rdaddr:第i个sub_bank的读地址;
以Sub_BANK1为例来研究16个Sub_BANK分别的读数据地址公式,假设输入数据尺寸为16*16:
如图10,数据读入时每次会读入16个Sub_BANK中的一组数据,构成4*4的数据阵列,滑动读取步长为2,因此两次读取之间会有两列数据进行复用(8个Sub_BANK的数据),再结合图11中16*16尺寸输入数据读取过程,规定按列的方式进行读取,设Sub_BANK1的起始地址为0地址,表1给出了Sub_BANK1的读数据地址与i,j的关系。
表1Sub_BANK1读数据地址关系表
i j sub1_rdaddr
1 1 0
1 2 1
1 3 1
1 4 2
1 5 2
1 6 3
1 7 3
2 1 4
2 2 5
2 3 5
2 4 6
2 5 6
2 6 7
由于在读数据的过程中存在数据复用的规律,因此,对于每一个4*4的数据块而言,可以将其中的数据分为如图12的4个象限(四个红色框),每个象限包含4个sub_bank中的一个值,四个象限中的数据的地址生成方式相同:
象限1:sub_bank1、2、5、6 象限2:sub_bank9、10、13、14
象限3:sub_bank3、4、7、8 象限4:sub_bank11、12、15、16
横向滑动时:(固定i,j变化)由于数据复用,原图像中位于最左侧的4*4数据块中的1,3象限的数据在横向滑动的过程中只使用一次,位于最右侧的4*4数据块中的2,4象限的数据在横向滑动的过程中只使用一次,其他数据则会复用2次;
纵向滑动时:(固定j,i变化)由于数据复用,原图像中位于最上侧的4*4数据块中的1,2象限的数据在纵向滑动的过程中只使用一次,位于最下侧的4*4数据块中的3,4象限的数据在纵向滑动的过程中只使用一次,其他数据则会复用2次;
依照表1的数据读取规律,结合数据复用的原则,再结合在之前研究的BANK数据块数据读取结构,对于4*4数据块,分别给出四个象限中的Sub_BANK读取数据地址公式(每个象限中的Sub_BANK读数据地址生成方式一致):
象限1:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*(i>>1)+(j>>1)
象限2:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*(i>>1)+[(j-1)>>1]
象限3:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*[(i-1)>>1]+(j>>1)
象限4:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*[(i-1)>>1]+[(j-1)>>1]
其中,公式的前半部分是相同的,代表了需要读取的数据在存放数据的BANK当中的第几个数据块。
对于以上数据读取的推导公式当中的i和j取值范围:
1≤i≤i_max(i_max=W/2-1)
1≤j≤j_max(j_max=H/2-1)
至此,关于加速器基于多BANK存储结构的按列数据读取策略已经研究完毕,当加速器工作时,只需要从每个Sub_BANK当中按照数据读取地址取出相应的数据组成4*4大小的数据块进行计算即可,由于每个数据都是从不同Sub_BANK当中读取的,因此可以有效的避免数据读取冲突的问题。
2、数据写入:
接下来推导数据写入时的写数据地址、写数据使能以及写数据内容的公式,分为2*2和1*1两种数据写入方式。
定义如下的变量:
i:数据块横向计数变量;
j:数据块纵向计数变量;
i_max:横向数据块最大值;
j_max:纵向数据块最大值;
out_ch:当前输入通道的计数变量;
subi_wtaddr:第i个sub_bank的写地址;
subi_wtdata:第i个sub_bank的写数据;
subi_wten:第i个sub_bank的写使能;
(注:以2*2方式和1*1方式写入数据时,对应的i_max和j_max的值不同)
2.1首先讨论以2*2的方式进行写入的情况(卷积层输出):
数据写入同样以按列写入的方式进行,当该层为卷积层(Conv)时,基于F(2,3)尺寸的Winograd卷积算法,卷积层输入数据尺寸为4*4,输出数据尺寸为2*2,仍假设该层的输出数据尺寸为16*16(padding之后),如图13,在数据写入时,不但需要写入该层计算得到的结果数据,另外还需要将通过padding方式给输出数据补的零值元素一同写入,因此,对于16*16的数据尺寸而言,在以2*2方式写入数据时可分为以下几种情况:
①写入数据尺寸为3*3,如图的四个角数据(实线框);
②写入数据尺寸为3*2,如图的上下边缘非角落数据(粗虚线框);
③写入数据尺寸为2*3,如图的左右边缘非角落数据(带点虚线框);
④写入数据尺寸为2*2,如图的非边缘数据(细虚线框);
接下来以Sub_bank1为例来给出写地址、写数据和写使能的公式推导示例:假设写数据为2*2方式,数据尺寸为偶数,图14中的斜纹块代表所有需要写入到Sub_bank1中的数据。
接下来列表给出Sub_BANK1写数据地址、写数据内容以及写数据使能信号随i和j计数变量的关系,如表2,给出了2*2写数据格式下,16*16尺寸的数据对应于Sub_bank1的所有数据的写地址、写数据内容以及写使能的值,根据表格,推导可得,Sub_bank1的三个公式如下:
对于2*2数据写入方式的右边推导公式当中的i和j取值范围:
1≤i≤i_max(i_max=W/2-1);1≤j≤j_max(j_max=H/2-1)
同理可以推导出2*2数据写入格式下其余Sub_bank的写地址、写数据以及写使能的表达式如下:
Sub_bank1:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?0:(j==1)?0:A(i)(j)[4]
write_en=[!(i>>1)||!(i%2)]&&[!(j>>1)||!(j%2)]
表2 2*2写数据格式下Sub_BANK1写数据地址、写数据内容以及写数据使能信号关系
i j sub1_wtaddr sub1_wtdata sub1_wten
1 1 0 0 1
1 2 1 0 1
1 3 - - 0
1 4 2 0 1
1 5 - - 0
1 6 3 0 1
1 7 - - 0
2 1 4 0 1
2 2 5 A(2)(2)[4] 1
2 3 - - 0
2 4 6 A(2)(4)[4] 1
2 5 - - 0
2 6 7 A(2)(6)[4] 1
2 7 - - 0
Sub_bank2:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(j==1)?0:A(i)(j)[3]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank3:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==1)?0:A(i)(j)[4]:(j==1)?0:A(i)(j)[4]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank4:
write_addr=(j>>1)+[(i-1)>>1]*[(j_max+1)/2]
write_data=(i==i_max)?0:(j==1)?0:A(i)(j)[3]
write_en=[!(i_max-i)||!(i%2))&&[!(j>>1)||!(j%2)]
Sub_bank5:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?0:A(i)(j)[2]
write_en=[!(i>>1)||!(i%2)]&&(j%2)
Sub_bank6:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=A(i)(j)[1]
write_en=(i%2)&&(j%2)
Sub_bank7:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:A(i)(j)[2]:A(i)(j)[2]
write_en=(i%2)&&(j%2)
Sub_bank8:
write_addr=(j>>1)+[(i-1)>>1]*[(j_max+1)/2]
write_data=(i==i_max)?0:A(i)(j)[1]
write_en=[!(i%2)||!(i_max-i)]&&(j%2)
Sub_bank9:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?0:A(i)(j)[4]
write_en=[!(i>>1)||!(i%2)]&&(j%2)
Sub_bank10:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(j==j_max)?0:A(i)(j)[3]:A(i)(j)[3]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank11:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j)[4]:A(i)(j)[4]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank12:
write_addr=(j>>1)+[(i-1)>>1]*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j)[3]:(i==i_max)?0:A(i)(j)[3]
write_en=[!(i%2)||!(i_max-i)]&&(j%2)
Sub_bank13:
write_addr=[(j-1)>>1]+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?(j==j_max)?0:A(i)(j)[2]
write_en=[!(i>>1)||!(i%2)]&&[!(j_max-j)||!(j%2)]
Sub_bank14:
write_addr=[(j-1)>>1]+(i>>1)*[(j_max+1)/2]
write_data=(j==j_max)?0:A(i)(j)[1]
write_en=(i%2)&&[!(j_max-j)||!(j%2)]
Sub_bank15:
write_addr=[(j-1)>>1)]+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j)[2]:(j==j_max)?A(i)(j)[2]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank16:
write_addr=[(j-1)>>1]+[(i-1)>>1]*[(j_max+1)/2]
write_data=(i==i_max)?0:(j==j_max)?0:A(i)(j)[1]
write_en=[!(i%2)||!(i_max-i)]&&[!(j%2)||!(j_max-j)]
注:以上公式中的(W%2)?是用来判断该层网络输出尺寸是否为奇数,按照前面分析的,如果输出图像尺寸为奇数,那么在padding时需要在右侧和下侧padding两圈零值元素,因此相较于偶数输出图像尺寸的情况,会有部分值为零。
2.2接下来讨论以1*1的方式进行写入的情况(池化层输出):
数据写入同样以按列写入的方式进行,当该层为池化层(Pooling)时,输出数据尺寸为1*1,仍假设该层的输出数据尺寸为16*16(padding之后),如图15,在数据写入时,不但需要写入该层计算得到的结果数据,另外还需要将通过padding方式给输出数据补的零值元素一同写入,因此,对于16*16的数据尺寸而言,在以1*1方式写入数据时可分为以下几种情况:
①写入数据尺寸为2*2,如图的四个角数据(实线框);
②写入数据尺寸为2*1,如图的上下边缘非角落数据(粗虚线框);
③写入数据尺寸为1*2,如图的左右边缘非角落数据(带点虚线框);
④写入数据尺寸为1*1,如图的非边缘数据(细虚线框);
接下来以Sub_bank1为例来给出写地址、写数据和写使能的公式推导示例:假设写数据为1*1方式,数据尺寸为偶数,1*1的数据写入格式下,图14中的斜纹块仍代表了所有需要写入到Sub_bank1中的数据,因此,接下来同样列表给出Sub_BANK1写数据地址、写数据内容以及写数据使能信号随i和j计数变量的关系,如表3,给出了1*1写数据格式下,16*16尺寸的数据对应于Sub_bank1的所有数据的写地址、写数据内容以及写使能的值,根据表格,推导可得,Sub_bank1的三个公式如下:
对于1*1数据写入方式的右边推导公式当中的i和j取值范围:
1≤i≤i_max(i_max=W-2);1≤j≤j_max(j_max=H-2)
Sub_bank1:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?0:(j==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{![(j>>1)%2]&&!(j%2)||[!(j>>1)]}
表3 1*1写数据格式下Sub_BANK1写数据地址、写数据内容以及写数据使能信号关系
i j subl_wtaddr sub1_wtdata sub1_wten
1 1 0 0 1
1 2 - - 0
1 3 - - 0
1 4 1 0 1
1 5 - - 0
1 6 - - 0
1 7 - - 0
1 8 2 0 1
1 9 - - 0
1 10 - - 0
1 11 - - 0
1 12 3 0 1
1 13 - - 0
1 14 - - 0
i j sub1_wtaddr sub1_wtdata sub1_wten
2 1 4 0 1
2 2 - - 0
2 3 - - 0
2 4 5 A(2)(4) 1
2 5 - - 0
2 6 - - 0
2 7 - - 0
2 8 6 A(2)(8) 1
2 9 - - 0
2 10 - - 0
2 11 - - 0
2 12 7 A(2)(12) 1
2 13 - - 0
2 14 - - 0
同理可以推导出1*1数据写入格式下其余Sub_bank的写地址、写数据以及写使能的表达式如下:
Sub_bank2:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(j==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{![(j>>1)%2]&&!(j%2)||[!(j>>1)]}
Sub_bank3:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==1)?0:A(i)(j):(j==1)?0:A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{![(j>>1)%2]&&!(j%2)||[!(j>>1)]}
Sub_bank4:
write_addr=(j>>2)+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(i==i_max)?0:(j==1)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{![(j>>1)%2]&&(j%2)||[!(j>>1)]}
Sub_bank5:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{![(j>>1)%2]&&(j%2)}
Sub_bank6:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{![(j>>1)%2]&&(j%2)}
Sub_bank7:
write_addr=(j>>2)+(i>>1)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:A(i)(j):A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{![(j>>1)%2]&&(j%2)}
Sub_bank8:
write_addr=(j>>2)+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(i==i_max)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{![(j>>1)%2]&&(j%2)}
Sub_bank9:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank10:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(j==j_max)?0:A(i)(j):A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank11:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j):A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank12:
write_addr=(j>>2)+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j):(i==i_max)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank13:
write_addr=[(j-1)>>2]+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?(j==j_max)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}
Sub_bank14:
write_addr=[(j-1)>>2]+(i>>2)*[(j_max>>1+1)/2]
write_data=(j==j_max)?0:A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}
Sub_bank15:
write_addr=[(j-1)>>2)]+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j):(j==j_max)?A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}
Sub_bank16:
write_addr=[(j-1)>>2]+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(i==i_max)?0:(j==j_max)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}
至此,已经推导出了各个Sub_ban分别以2*2格式以及1*1格式下数据写入的写地址、写数据以及写使能的公式,接下来,还需要分析大BANK以及数据块的位置对于写数据地址的影响。
数据写入过程中,每次写入2*2尺寸或1*1尺寸的数据块,对于某个输出通道的结果在数据写入时,首先要计算该输出通道对应于哪一个BANK当中(BANK1-BANK4),其次需要知道该输出通道的数据需要写入该BANK的哪一个sub_bank中,之后还需要知道该数据需要写入到哪一个数据块中去,最后考虑在某个块中如何写入数据(地址?数据?使能信号?)首先确定某个输出通道的数据在哪一个数据块中,如图16:
设当前输出通道数为X,首先确定该输出通道位于哪一个BANK:
X位于RAM的第p=(X-1)>>2列(列数取值从0到最后一列)
X位于RAM的第q=(X-1)%4行(即第几个BANK)(行数取值从0到3)
其次确定该输出通道位于哪数据块中:
X位于该BANK的第r=p*(W*H)+1个数据块(取值范围从1到最后一列)
而在每一个数据块中,对应于每个sub_bank的写数据地址(以i,j为变量)的地址及该写入的数据和写使能信号的生成见上面分析的公式。
总结起来,在根据以上的推导分析过程确定了某个输出通道数据的位置(在哪一个BANK的第几个数据块中),假设在第r+1个数据块中,则写数据地址公式如下:
wt_addr=(r-1)/16+subi_wtaddr
其中subi_wtaddr由之前推导的公式给出,16个sub_bank各不相同。
至此,已经推导出了加速器面向于多BANK数据存储结构的数据写入策略,分别讨论了以2*2和1*1尺寸进行数据写入时的情况,在该策略下,数据能够按照之前提出的无冲突的方式进行数据读取,数据读取和数据写入策略综合起来能够达到提高加速器数据带宽,从而间接提高加速器的性能效率的目的。
3)对于多BANK数据存储器,该部分为多BANK的存储结构,将RAM按照输入通道数量分为4个大的BANK组,之后针对每个BANK结构又分为16个子BANK(Sub_BANK),这样做的主要目的是便于数据读写地址的生成,该结构主要负责存储加速器工作过程中的中间数据,并根据2)中生成的读数据地址和读数据使能信号来读取相应地址的数据作为下一层网络的输入数据;根据2)中生成的写数据地址、写数据内容以及写数据使能信号来完成向对应位置写入对应的数据,该部分结构需根据神经网络模型中数据量最大的一层来确定存储器的大小,该部分结构如图4。
4)加速器数据通路,该部分结构主要负责根据2)生成的读数据地址及读数据使能信号从3)中读取相应的数据进行加速器计算过程,计算之后生成输出数据并根据2)中给出的写数据地址、写数据内容和写数据使能信号将输出数据写回3)当中,本发明中的加速器采用的是加速效果最好的F(2,3)尺寸的Winograd算法,并且输入通道和输出通道分别为4和16,该部分的结构图如图5。
首先对Winograd卷积算法作出一个简单的介绍:
Winograd算法是一种新的CNNs快速算法,它源自于Winograd的最小滤波算法[22]。Winograd算法通过输入图和卷积核上的一系列变换来减少乘法运算次数。为了简单说明,先讨论一维的情况。首先定义,如果一次卷积的输出尺寸为r,卷积核长为k,则将这次卷积描述为F(r,k)。那么对于F(2,3),假设输入向量为x=(x0,x1,x2,x3),卷积核为w=(w0,w1,w2),输出向量为y=(y0,y1)。
对于Winograd算法,首先要对输入向量和卷积核进行适当的变换:
x′=(x0-x2,x1+x2,x2-x1,x1-x3), (1)
其次,通过计算x′和w′的点积,可以得到以下的结果:
f1=(x0-x2)w0, (3)
f4=(x1-x2)w2 (6)
最后,Winograd算法给出以下的等式:
将结果整理成矩阵乘法后得到:
y=AT[(Gw)⊙(BTx)] (8)
其中⊙表示对应元素相乘。A、G和B都是恒定的变换系数矩阵,由所处理的数据尺寸而定。对于F(2,3),有以下系数矩阵:
可以看出,通过Winograd算法,一维卷积的乘法操作数由原先的m×r降低至)m+r-1)。
相似的,二维Winograd算法F(m×m,r×r)可以描述为:
y=AT[(GwGT)⊙(BTxB)]A (10)
从上面的公式中可以看出,Winograd算法需要(m+r-1)×(m+r-1)次乘法操作,而传统的卷积运算需要m×m×r×r次乘法操作。如果在CNNs中采用Winograd算法来加速卷积计算,对于大小为3×3的卷积核,至少可以将运算复杂度降低2.25倍[23](相当于m=2,n=3)。
本发明所设计的基于Winograd算法的卷积神经网络加速器采用的正是F(2,3)尺寸的Winograd算法,因此输入数据尺寸大小为4*4,输出数据尺寸大小为2*2,另外,加速器的输入通道数为4,输出通道数为16。
根据以上的公式,整个加速器数据通路的计算过程大体上可以分为三个循环遍历过程:
首先按照4个一组(加速器的输入通道为4)遍历该层输入数据的所有通道,取所有通道同一位置的4*4大小数据块送入加速器数据通路WRA_datapath中进行计算,直到将所有输入通道遍历完成(对应于图5中的棕色虚线框);
按照16个输出一组(加速器的输出通道数为16)遍历该层所有的输出通道,直到该层所有的输出通道遍历完成(对应于图5中的紫色虚线框);
得到对应于所有输入通道和输出通道同一位置的输出数据进行存储之后,开始进行该层输入通道滑动之后的下一组4*4位置上数据的计算过程,重复1)和2)过程,以此类推直到整张图像计算完成(对应于图5中的整体黑色方框)。
至此,已经完成了对整体加速器结构以及面向该加速器的运算数据无冲突存储组织和调度的方法已经介绍完毕,该方法能够有效的提高数据存储组织和调度的效率,从而间接的提高加速器的性能。

Claims (5)

1.一种基于Winograd的卷积神经网络加速器系统,其特征在于,包括:
A网络参数信息配置文件,用于存储神经网络每一层的配置信息;该部分结构用于存储神经网络每一层的配置信息,共21位,包括:1>该层的网络类型;2>该层的卷积核尺寸;3>该层的步长;4>该层是否进行Relu激活;5>该层是否进行Maxpooling池化;7>该层输入数据的padding方式;8>该层输入和输出数据尺寸;9>该层输入和输出通道数;这些信息存放在外部文件当中,每一行的21位数据包含了网络某一层的信息;
B数据读写控制器,用于提取A网络参数信息配置文件中神经网络配置信息并生成数据读写过程中的地址以及加速器数据通路计算迭代次数信息;该部分结构负责生成数据读写过程中的地址以及加速器数据通路计算迭代次数信息,包括以下内容:1>输入通道计算迭代次数;2>输出通道计算迭代次数;3>滑动窗口次数;4>输出数据写RAM地址;5>输入数据读RAM地址;
C多BANK数据存储器,用于存储加速器运算过程中的中间数据;该部分为多BANK的存储结构,分为4个BANK,针对每个BANK结构又分为16个子BANK(Sub_BANK),便于数据读写地址的生成,该结构负责存储加速器工作过程中的中间数据,并根据B数据读写控制器中生成的读数据地址和读数据使能信号来读取相应地址的数据作为下一层网络的输入数据;根据B数据读写控制器中生成的写数据地址、写数据内容以及写数据使能信号来完成向对应位置写入对应的数据,该部分结构根据神经网络模型中数据量最大的一层来确定存储器的大小;
D加速器数据通路,用于按照B数据读写控制器给出的数据读取地址从C多BANK数据存储器中读取数据完成加速器的计算流程,计算的结果又按照B数据读写控制器给出的数据写入地址存储到C多BANK数据存储器当中;该部分结构负责根据B数据读写控制器生成的读数据地址及读数据使能信号从C多BANK数据存储器中读取相应的数据进行加速器计算过程,计算之后生成输出数据并根据B数据读写控制器中给出的写数据地址、写数据内容和写数据使能信号将输出数据写回C多BANK数据存储器当中,加速器采用的是加速效果最好的F(2,3)尺寸的Winograd算法,并且输入通道和输出通道数分别为4和16。
2.一种面向权利要求1所述的基于Winograd的CNN加速器系统的数据无冲突调度方法,作为神经网络加速器的B数据读写控制器的数据读写地址生成方法,其特征在于,包括以下步骤:
1)将每次运算时数据读取尺寸大小定义为存储空间基本单位,根据整体数据量定义数据存储空间大小;
2)通过按列读取的方式根据数据读取地址信息从上一步骤定义的数据存储空间中读取相应数据进行计算;
3)上一步骤中读取的数据计算完成后通过按列写入的方式将计算结果再根据数据写入地址、写使能信息写回到数据存储空间当中。
3.根据权利要求2所述的一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法,其特征在于,步骤1)的具体实现方法如下:首先按照具体的神经网络模型中数据量最大的一层来定义一块数据存储空间,之后按照加速器的输入通道数将存储空间划分为4个BANK结构,由于加速器每次读取的数据尺寸为4*4大小,因此进一步再将每个BANK分为16个子BANK结构,子BANK又称Sub_BANK,每个Sub_BANK中专门存储某一个位置上的数据,4个通道对应的BANK结构相同。
4.根据权利要求2所述的一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法,其特征在于,步骤2)的具体实现方法如下:对于某个输入通道对应的BANK结构,待读取的4*4大小的数据通过按列的形式进行读取,每次按照数据读取地址读取每个Sub_BANK相应位置上的数据,每一次读取过程都是从每一个Sub_BANK中读取一个数据,无数据读取冲突;每个Sub_BANK对应的数据读取地址如下:
定义如下的变量:
i:4*4数据块横向计数变量;
j:4*4数据块纵向计数变量;
i_max:横向4*4数据块最大值;
j_max:纵向4*4数据块最大值;
in_ch:当前输入通道的计数变量;
sub_i_rdaddr:第i个sub_bank的读地址;
1≤i≤i_max(i_max=W/2-1)
1≤j≤j_max(j_max=H/2-1)
象限1:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*(i>>1)+(j>>1)
象限2:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*(i>>1)+[(j-1)>>1]
象限3:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*[(i-1)>>1]+(j>>1)
象限4:
[(i_max+1)/2]*[(j_max+1)/2]*[(in_ch-1)>>2]+[(j_max+1)/2]*(i-1)*[(i-1)>>1]+[(j-1)>>1]
其中,象限1,2,3,4分别代表了以下的Sub_bank:
象限1:sub_bank1、2、5、6 象限2:sub_bank9、10、13、14
象限3:sub_bank3、4、7、8 象限4:sub_bank11、12、15、16。
5.根据权利要求2所述的一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法,其特征在于,步骤3)的具体实现方法如下:经过加速器计算后的结果数据尺寸为2*2,需要根据数据写入地址、写使能以及写数据信息来将相应的数据写入到相应的位置上,每次需要写入的4个数据会分别写入到4个不同的Sub_BANK当中,因此写数据的过程也不存在冲突,写数据地址,写使能以及需要写入的数据由下列公式给出:
定义如下的变量:
i:数据块横向计数变量
j:数据块纵向计数变量
i_max:横向数据块最大值
j_max:纵向数据块最大值
out_ch:当前输入通道的计数变量
subi_wtaddr:第i个sub_bank的写地址
subi_wten:第i个sub_bank的写使能
以2*2方式和1*1方式写入数据时,对应的i_max和j_max的值不同,以2*2的方式写入数据:
对于2*2数据写入方式的右边推导公式当中的i和j取值范围:
1≤i≤i_max(i_max=W/2-1);1≤j≤j_max(j_max=H/2-1)
Sub_bank1:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?0:(j==1)?0:A(i)(j)[4]
write_en=[!(i>>1)||!(i%2)]&&[!(j>>1)||!(j%2)]
Sub_bank2:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(j==1)?0:A(i)(j)[3]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank3:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==1)?0:A(i)(j)[4]:(j==1)?0:A(i)(j)[4]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank4:
write_addr=(j>>1)+[(i-1)>>1]*[(j_max+1)/2]
write_data=(i==i_max)?0:(j==1)?0:A(i)(j)[3]
write_en=[!(i_max-i)||!(i%2))&&[!(j>>1)||!(j%2)]
Sub_bank5:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?0:A(i)(j)[2]
write_en=[!(i>>1)||!(i%2)]&&(j%2)
Sub_bank6:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=A(i)(j)[1]
write_en=(i%2)&&(j%2)
Sub_bank7:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:A(i)(j)[2]:A(i)(j)[2]
write_en=(i%2)&&(j%2)
Sub_bank8:
write_addr=(j>>1)+[(i-1)>>1]*[(j_max+1)/2]
write_data=(i==i_max)?0:A(i)(j)[1]
write_en=[!(i%2)||!(i_max-i)]&&(j%2)
Sub_bank9:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?0:A(i)(j)[4]
write_en=[!(i>>1)||!(i%2)]&&(j%2)
Sub_bank10:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(j==j_max)?0:A(i)(j)[3]:A(i)(j)[3]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank11:
write_addr=(j>>1)+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j)[4]:A(i)(j)[4]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank12:
write_addr=(j>>1)+[(i-1)>>1]*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j)[3]:(i==i_max)?0:A(i)(j)[3]
write_en=[!(i%2)||!(i_max-i)]&&(j%2)
Sub_bank13:
write_addr=[(j-1)>>1]+(i>>1)*[(j_max+1)/2]
write_data=(i==1)?(j==j_max)?0:A(i)(j)[2]
write_en=[!(i>>1)||!(i%2)]&&[!(j_max-j)||!(j%2)]
Sub_bank14:
write_addr=[(j-1)>>1]+(i>>1)*[(j_max+1)/2]
write_data=(j==j_max)?0:A(i)(j)[1]
write_en=(i%2)&&[!(j_max-j)||!(j%2)]
Sub_bank15:
write_addr=[(j-1)>>1)]+(i>>1)*[(j_max+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j)[2]:(j==j_max)?A(i)(j)[2]
write_en=(i%2)&&[!(j>>1)||!(j%2)]
Sub_bank16:
write_addr=[(j-1)>>1]+[(i-1)>>1]*[(j_max+1)/2]
write_data=(i==i_max)?0:(j==j_max)?0:A(i)(j)[1]
write_en=[!(i%2)||!(i_max-i)]&&[!(j%2)||!(j_max-j)]
以1*1的方式写入数据:
对于1*1数据写入方式的右边推导公式当中的i和j取值范围:
1≤i≤i_max(i_max=W-2);1≤j≤j_max(j_max=H-2)
Sub_bank1:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?0:(j==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{![(j>>1)%2]&&!(j%2)||[!(j>>1)]}
Sub_bank2:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(j==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{![(j>>1)%2]&&!(j%2)||[!(j>>1)]}
Sub_bank3:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==1)?0:A(i)(j):(j==1)?0:A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{![(j>>1)%2]&&!(j%2)||[!(j>>1)]}
Sub_bank4:
write_addr=(j>>2)+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(i==i_max)?0:(j==1)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{![(j>>1)%2]&&(j%2)||[!(j>>1)]}
Sub_bank5:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{![(j>>1)%2]&&(j%2)}
Sub_bank6:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{![(j>>1)%2]&&(j%2)}
Sub_bank7:
write_addr=(j>>2)+(i>>1)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:A(i)(j):A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{![(j>>1)%2]&&(j%2)}
Sub_bank8:
write_addr=(j>>2)+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(i==i_max)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{![(j>>1)%2]&&(j%2)}
Sub_bank9:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank10:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(j==j_max)?0:A(i)(j):A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank11:
write_addr=(j>>2)+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j):A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank12:
write_addr=(j>>2)+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j):(i==i_max)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{[(j>>1)%2]&&!(j%2)}
Sub_bank13:
write_addr=[(j-1)>>2]+(i>>2)*[(j_max>>1+1)/2]
write_data=(i==1)?(j==j_max)?0:A(i)(j)
write_en={![(i>>1)%2]&&!(i%2)||[!(i>>1)]}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}Sub_bank14:
write_addr=[(j-1)>>2]+(i>>2)*[(j_max>>1+1)/2]
write_data=(j==j_max)?0:A(i)(j)
write_en={![(i>>1)%2]&&(i%2)}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}
Sub_bank15:
write_addr=[(j-1)>>2)]+(i>>2)*[(j_max>>1+1)/2]
write_data=(W%2)?(i==i_max)?0:(j==j_max)?0:A(i)(j):(j==j_max)?A(i)(j)
write_en={[(i>>1)%2]&&!(i%2)}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}
Sub_bank16:
write_addr=[(j-1)>>2]+[(i-1)>>2]*[(j_max>>1+1)/2]
write_data=(i==i_max)?0:(j==j_max)?0:A(i)(j)
write_en={[(i>>1)%2]&&(i%2)||!(i_max-i)}&&{[(j>>1)%2]&&(j%2)||!(j_max-j)}。
CN202111178327.4A 2021-10-09 2021-10-09 一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法 Active CN113962361B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111178327.4A CN113962361B (zh) 2021-10-09 2021-10-09 一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111178327.4A CN113962361B (zh) 2021-10-09 2021-10-09 一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法

Publications (2)

Publication Number Publication Date
CN113962361A CN113962361A (zh) 2022-01-21
CN113962361B true CN113962361B (zh) 2024-04-05

Family

ID=79463404

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111178327.4A Active CN113962361B (zh) 2021-10-09 2021-10-09 一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法

Country Status (1)

Country Link
CN (1) CN113962361B (zh)

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110222818A (zh) * 2019-05-13 2019-09-10 西安交通大学 一种用于卷积神经网络数据存储的多bank行列交织读写方法
CN110516801A (zh) * 2019-08-05 2019-11-29 西安交通大学 一种高吞吐率的动态可重构卷积神经网络加速器架构
CN111459877A (zh) * 2020-04-02 2020-07-28 北京工商大学 基于FPGA加速的Winograd YOLOv2目标检测模型方法
CN111667051A (zh) * 2020-05-27 2020-09-15 上海赛昉科技有限公司 适用边缘设备的神经网络加速器及神经网络加速计算方法
WO2020258528A1 (zh) * 2019-06-25 2020-12-30 东南大学 一种可配置的通用卷积神经网络加速器

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110222818A (zh) * 2019-05-13 2019-09-10 西安交通大学 一种用于卷积神经网络数据存储的多bank行列交织读写方法
WO2020258528A1 (zh) * 2019-06-25 2020-12-30 东南大学 一种可配置的通用卷积神经网络加速器
CN110516801A (zh) * 2019-08-05 2019-11-29 西安交通大学 一种高吞吐率的动态可重构卷积神经网络加速器架构
CN111459877A (zh) * 2020-04-02 2020-07-28 北京工商大学 基于FPGA加速的Winograd YOLOv2目标检测模型方法
CN111667051A (zh) * 2020-05-27 2020-09-15 上海赛昉科技有限公司 适用边缘设备的神经网络加速器及神经网络加速计算方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
武磊 ; 魏子涵 ; 张伟功 ; 王晶 ; 高岚 ; .一种通用CNN加速器的缓冲区地址调度方法.微电子学与计算机.2020,(第07期),全文. *

Also Published As

Publication number Publication date
CN113962361A (zh) 2022-01-21

Similar Documents

Publication Publication Date Title
CN110097174B (zh) 基于fpga和行输出优先的卷积神经网络实现方法、系统及装置
CN109919311B (zh) 生成指令序列的方法、执行神经网络运算的方法和装置
CN111931918B (zh) 神经网络加速器
CN112840356A (zh) 运算加速器、处理方法及相关设备
CN110222818B (zh) 一种用于卷积神经网络数据存储的多bank行列交织读写方法
CN112668708B (zh) 一种提高数据利用率的卷积运算装置
CN110807170B (zh) 多样本多通道卷积神经网络Same卷积向量化实现方法
CN109993293B (zh) 一种适用于堆叠式沙漏网络的深度学习加速器
CN108897716B (zh) 通过存储器读写操作来缩减计算量的数据处理装置及方法
CN113919477A (zh) 一种卷积神经网络的加速方法及装置
CN115186802A (zh) 基于卷积神经网络的块稀疏方法、装置及处理单元
US20220113944A1 (en) Arithmetic processing device
CN113962361B (zh) 一种面向基于Winograd的CNN加速器系统的数据无冲突调度方法
CN114330656A (zh) 一种卷积运算硬件加速器及数据处理方法
JPH06162227A (ja) ベクトル並列計算機
US11663454B2 (en) Digital integrated circuit with embedded memory for neural network inferring
CN108920097B (zh) 一种基于交织存储的三维数据处理方法
JP7419574B2 (ja) 膨張畳み込み加速演算方法及び装置
CN104869284A (zh) 一种双线性插值放大算法的高效率fpga实现方法和装置
US11132195B2 (en) Computing device and neural network processor incorporating the same
CN112905954A (zh) 一种利用fpga bram的cnn模型卷积运算加速计算方法
CN114218136A (zh) 一种面向脉动阵列的面积友好存储地址映射方法
CN113448624A (zh) 数据存取方法及装置、系统、ai加速器
CN113542770B (zh) 一种dct变换方法及dct变换电路系统
US20230307036A1 (en) Storage and Accessing Methods for Parameters in Streaming AI Accelerator Chip

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
GR01 Patent grant
GR01 Patent grant