本发明实施例涉及数据处理技术领域,尤其涉及一种乘累加器及累加输出方法。
背景技术:
乘累加器(multiplyandaccumulate,简称mac)是用于完成向量相乘并将结果累加的运算器。乘累加器结构作为运算子系统的一个重要部分,常常出现在数字信号处理器、向量处理器、专用向量加速器等系统中。乘累加器能够增加向量运算和矩阵运算的并行度,提高运算速度,是很多算法硬件实现的基础子系统,如图像处理算法、深度学习算法等。
现有的乘累加器主要有两种结构:一种是包括两级运算单元组,第一级运算单元组为乘法运算单元,乘法运算单元个数为n,n为正整数,n也是乘累加单元输入数据向量的最大维度。第二级运算单元组为加法运算单元,加法运算单元个数为n。每个运算单元都连接一个寄存器,用于在每个时刻寄存该运算单元的结果并输出。第一级乘法运算单元的输出通过寄存器连接到第二级的加法运算单元的一个输入;加法运算单元的输出通过寄存器连接到加法运算单元的另一个输入。该乘累加单元可以实现两组向量相乘,并且对每个乘法运算单元的结果实现多次累加,图1是现有技术提供的一种乘累加器示意图,其中n=8,r表示寄存器。
另一种是包括m级的运算单元组,m为大于2的正整数。第一级运算单元组为乘法运算单元,乘法运算单元个数为n,n为正整数,n也是乘累加器输入数据向量的最大维度。剩下m-1级运算单元组为加法运算单元组成,且满足:2m-1=n。第2级到第m级的每级中的运算单元组中的加法运算单元个数为上一级的乘法运算单元或加法运算单元个数的二分之一。每个运算单元都连接一个寄存器,用于在每个时刻寄存该运算单元的结果并输出。每一级的输出通过寄存器输出给下一级运算单元组,从第2级开始每一级的运算单元组中的加法器用于实现前一级的两个运算单元的输出结果的相加运算,其结果通过连接的寄存器输出给下一级运算单元组。第m级包含一个加法器,最终输出一个结果,该结果为第1级所有乘法运算单元运算结果的和。图2是现有技术提供的另一种乘累加器示意图,其中n=8,m=4,r表示寄存器。
但是现有技术提供的第一种方案只能实现对单个乘法运算单元输出结果的累加,多个乘法运算单元输出之间的累加操作无法实现,而第二种方案只能实现对同一时刻运算的多路乘法器结果的累加,无法对同一乘法运算单元相邻时刻的结果进行累加。
因此,现在亟需一种新的乘累加器来解决上述现有技术中存在的问题。
技术实现要素:
为了解决上述问题,本发明实施例提供一种克服上述问题或者至少部分地解决上述问题的一种乘累加器及累加输出方法。
第一方面本发明实施例提供一种乘累加器,包括:
m级运算列,每一级运算列中包括若干个寄存器,所述寄存器用于在每个时刻存储运算结果并输出;
其中,第一级运算列由n个乘法运算单元组成,每个乘法运算单元连接一个寄存器;第二级至第m-1级运算列由加法运算单元组成,每个加法运算单元连接一个寄存器,第i级的所述加法运算单元数量为
其中,第二级运算列还包括n个二选一多路器,所述二选一多路器包括两个输入端口,其中一个输入端口的输入为0,另一个输入端口连接所述第二级运算列加法运算单元所连接的寄存器。
其中,第二级至第m-1级运算列中,每一级的两个加法运算单元分为一个小组,所述小组的输出连接下一级加法运算单元的输入。
其中,第二级至第m-1级运算列中,第i级每一个加法运算单元的输出均连接第i+1级对应的一个寄存器。
第二方面本发明实施例还提供了一种累加输出方法,包括:
通过控制第二级运算列中所述二选一多路器的输入,获取每个乘法运算单元多个时刻输出结果的累加输出。
其中,所述方法还包括:
通过控制第m级运算列中所述多路选择器的输入,获取第二级加法运算单元输出的分组累加结果作为所述乘累加器的最终输出。
本发明实施例提供的一种乘累加器及累加输出方法,既可以实现时间维度对乘法运算单元输出的累加,又可以对多路乘法运算单元输出进行分组累加,提高了乘累加器的灵活度,满足多种运算形式对乘累加器的需求。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是现有技术提供的一种乘累加器示意图;
图2是现有技术提供的另一种乘累加器示意图;
图3是本发明实施例提供的一种乘累加器结构示意图;
图4是本发明实施例提供的一种累加输出方法流程图;
图5是本发明实施例提供的一种累加输出方式t1时刻示意图;
图6是本发明实施例提供的一种累加输出方式t2时刻示意图;
图7是本发明实施例提供的一种累加输出方式t3时刻示意图;
图8是本发明实施例提供的一种累加输出方式t4时刻示意图;
图9是本发明实施例提供的一种累加输出方式t5时刻示意图;
图10是本发明实施例提供的一种累加输出方式t6时刻示意图;
图11是本发明实施例提供的另一种累加输出方式t1时刻示意图;
图12是本发明实施例提供的另一种累加输出方式t2时刻示意图;
图13是本发明实施例提供的另一种累加输出方式t3时刻示意图;
图14是本发明实施例提供的另一种累加输出方式t4时刻示意图;
图15是本发明实施例提供的另一种累加输出方式t5时刻示意图;
图16是本发明实施例提供的又一种累加输出方式t1时刻示意图;
图17是本发明实施例提供的又一种累加输出方式t2时刻示意图;
图18是本发明实施例提供的又一种累加输出方式t3时刻示意图;
图19是本发明实施例提供的又一种累加输出方式t4时刻示意图;
图20是本发明实施例提供的又一种累加输出方式t5时刻示意图;
图21是本发明实施例提供的又一种累加输出方式t6时刻示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
目前,现有技术提供的乘累加器只能实现对单个乘法运算单元输出结果的累加,多个乘法运算单元输出之间的累加操作无法实现。并且,现有技术只能实现对同一时刻运算的多路乘法器结果的累加,无法对同一乘法运算单元相邻时刻的结果进行累加。进一步的,现有技术提供的累加器将所有乘法运算单元的结果均累加在一起输出,但是有的算法比如深度学习算法,需要先对乘法运算单元输出分组,然后再将组内的运算结果累加,现有技术的方案无法满足这种需求。
针对上述现有技术中存在的问题,图3是本发明实施例提供的一种乘累加器结构示意图,如图3所示,所述乘累加器包括:
m级运算列,每一级运算列中包括若干个寄存器,所述寄存器用于在每个时刻存储运算结果并输出;
其中,第一级运算列由n个乘法运算单元组成,每个乘法运算单元连接一个寄存器;第二级至第m-1级运算列由加法运算单元组成,每个加法运算单元连接一个寄存器,第i级的所述加法运算单元数量为
第二级运算列还包括n个二选一多路器,所述二选一多路器包括两个输入端口,其中一个输入端口的输入为0,另一个输入端口连接所述第二级运算列加法运算单元所连接的寄存器。
可以理解的是,图3是本发明实施例提供的一种乘累加器示意图,在图3中,mux表示多路选择器,r表示寄存器。其中具体的参数取值为:n=4、m=5、k=2。相应的,图3提供的乘累加器中,第一级即包括4个乘法运算单元,第二级包括4个加法运算单元,第三级包括2个加法运算单元,第四级包括1个加法运算单元,第五级包括2个多路选择器和4个寄存器。
其中,每个乘法运算单元和每个加法运算单元均连接有一个寄存器,且第三级和第四级还设有若干个多余的寄存器。那么,对于第五级中第一个多路寄存器的输入端口分别连接第二级、第三级、第四级的第一个加法运算单元的输出对应的在第四级的寄存器的输出。
第m级的运算列中包含
如图3所示,本发明实施例提供的乘累加器在第二级运算列中,第一级乘法运算单元的输出通过寄存器连接到第二级一个加法运算单元的一个输入,加法运算单元的输出通过寄存器连接到一个二选一多路器的一个输入,二选一多路器的另一个输入为‘0’,该二选一多路器的输出连接到该加法运算单元的另一个输入。
在上述实施例的基础上,第二级至第m-1级运算列中,每一级的两个加法运算单元分为一个小组,所述小组的输出连接下一级加法运算单元的输入。
如图3所示,本发明实施例提供的乘累加器从第二级开始,每一级的加法运算单元每两个分为一组,一组内的加法运算单元的输出通过寄存器连接到下一级的同一个加法运算单元的输入。
在上述实施例的基础上,第二级至第m-1级运算列中,第i级每一个加法运算单元的输出均连接第i+1级对应的一个寄存器。
如图3所示,本发明实施例提供的乘累加器从第二级开始,第i级每一个运算单元通过寄存器的输出,均会连接到第i+1级对应的一个寄存器,第i+1级对应的寄存器又会连接到第i+2级相应的寄存器,一直到第m-1级,即第i级运算单元的输出会通过寄存器一级一级的传递到第m-1级。
在上述实施例的基础上,图4是本发明实施例提供的一种累加输出方法流程图,包括:
410、通过控制第二级运算列中所述二选一多路器的输入,获取每个乘法运算单元多个时刻输出结果的累加输出。
可以理解的是,本发明实施例提供的乘累加器能够实现对每个乘法器多个时刻的结果的累加。
具体的,所述通过控制第二级运算列中所述二选一多路器的输入,获取每个乘法运算单元多个时刻输出结果的累加输出,包括:
若控制所有二选一多路器的输入选择为第二级运算列加法运算单元所连接的寄存器的输出时,则第二级加法运算单元的输出为相应乘法运算单元多个时刻输出结果的累加输出。
若控制所有二选一多路器的输入选择为0时,则第二级加法运算单元输出为相应乘法运算单元当前时刻的输出结果。
可以理解的是,本发明实施例提供的累加输出方案是通过控制第二级中加法运算单元所连接的二选一多路器选择的输入确定的,第二级中通过寄存器的输出既可以是第一级的每个乘法运算单元当前时刻的计算结果,也可以是乘法运算单元多个时刻结果的累加输出结果。
在上述实施例的基础上,本发明实施例提供的累加输出方法还包括:
通过控制第m级运算列中所述多路选择器的输入,获取第二级加法运算单元输出的分组累加结果作为所述乘累加器的最终输出。
具体的,所述通过控制第m级运算列中所述多路选择器的输入,获取第二级加法运算单元输出结果的分组累加输出,包括:
若控制第m级运算列中第s个多路选择器的输入选择为第m-1-r级第s个加法运算单元所连接的寄存器的输出,则将第m级运算列中前
所述第二级加法运算单元输出为乘法运算单元当前时刻的输出或乘法运算单元多个时刻输出的累加结果输出。
若控制第二级中所有二选一多路器的输入选择为0时,则第二级加法运算单元输出为乘法运算单元当前时刻的输出;
若控制第二级中所有二选一多路器的输入选择为1时,则第二级加法运算单元输出为乘法运算单元多个时刻累加结果的输出。
可以理解的是,本发明实施例提供的乘累加器可以实现对第二级的n路通过寄存器的输出进行分别单独输出,也可以将相邻的乘法运算单元结果进行分组累加后再输出。
其中,第三级到第m-1级的加法单元用以实现该分组累加输出过程,不同输出方式的选择是通过控制第m级的多路选择器组实现的。令p=2q、p≤n、q为自然数,当需要将第二级通过寄存器输出的每p个相邻的结果为一组进行累加输出的时候,令
进一步的,本发明实施例提供的乘累加器中的乘法运算单元分组是可预先配置的,可预先配置分成2k组,其中n%(2k)=0,n≥2k,k为自然数,n为第一级乘法运算单元个数,%为取余运算。
为了方便理解本发明实施例提供的乘累加器的具体累加方案,本发明实施例以图3为例,对可能出现的累加情况进行举例说明,但对具体的参数选择和合理变形不做具体限定。
例1、对两个四维向量x、y在t1和t2两个时刻输入的相乘结果进行累加输出。x包含四个元素x[0]、x[1]、x[2]、x[3],y包含四个元素y[0]、y[1]、y[2]、y[3],xt1表示t1时刻输入的x。需要计算的乘累加运算为:
z=[xt1[0]*yt1[0]+xt2[0]*yt2[0],xt1[1]*yt1[1]+xt2[1]*yt2[1],xt1[2]*yt1[2]+xt2[2]*yt2[2],xt1[3]*yt1[3]+xt2[3]*yt2[3]]。
可以理解的是,本发明实施例实质上是在计算乘累加器的输出在时间维度进行累加的过程。
具体的执行过程为:将第二级中的多路选择器均选择相应加法运算单元通过寄存器的输出作为自己的输入。第五级的第一个多路选择器选择第二级第一个加法运算单元的输出对应的在第四级的寄存器的输出作为输入;第五级的第二个多路选择器选择第二级第2个加法运算单元的输出对应的在第四级的寄存器的输出作为输入。
那么,在t1时刻,可参考图5,第一级中xt1、yt1向量输入第一级的乘法运算单元中进行运算,得到xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]。
在t2时刻,可参考图6,第一级中xt2、yt2向量输入第一级的乘法运算单元中进行运算,得到xt2[0]*yt2[0],xt2[1]*yt2[1],xt2[2]*yt2[2],xt2[3]*yt2[3]。第二级中第一级t1时刻得到的xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]分别与相应的加法运算单元的输出寄存器的值相加,各个寄存器初始值为0,因此第二级输出通过寄存器输出的值为:xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]。
在t3时刻,可参考图7,第二级中第一级上一时刻得到的xt2[0]*yt2[0],xt2[1]*yt2[1],xt2[2]*yt2[2],xt2[3]*yt2[3]分别与相应的加法运算单元的输出寄存器的值相加,即得到:xt1[0]*yt1[0]+xt2[0]*yt2[0],xt1[1]*yt1[1]+xt2[1]*yt2[1],xt1[2]*yt1[2]+xt2[2]*yt2[2],xt1[3]*yt1[3]+xt2[3]*yt2[3]。
在t4时刻,可参考图8,在第三级中将第二级得到的运算结果通过寄存器传递到第三级对应的寄存器中。
在t5时刻,可参考图9,在第四级中将第三级寄存器存储的结果传递到第四级相应的寄存器中。
在t6时刻,可参考图10,在第五级中将第五级多路选择器选择相应的结果输出到本级的寄存器中,得到最终的输出结果,最终的输出结果为:xt1[0]*yt1[0]+xt2[0]*yt2[0],xt1[1]*yt1[1]+xt2[1]*yt2[1],xt1[2]*yt1[2]+xt2[2]*yt2[2],xt1[3]*yt1[3]+xt2[3]*yt2[3]。
通过上述例子可以看出,本发明实施例能够对乘法运算单元的输出在时间维度进行累加,即对每个乘法运算单元的输出在相邻的一个或多个时刻的输出结果进行累加,且运算过程简单清楚。
例2、对两个4维向量x、y在t1时刻的输入相乘,将相乘结果相邻的每两个一组进行累加并输出。x包含四个元素x[0]、x[1]、x[2]、x[3],y包含四个元素y[0]、y[1]、y[2]、y[3],xt1表示t1时刻输入的x。需要计算的乘累加运算为:z=[xt1[0]*yt1[0]+xt1[1]*yt1[1],xt1[2]*yt1[2]+xt1[3]*yt1[3]]。
可以理解的是,本发明实施例实质上是在计算乘累加器的分组累加输出的过程。
具体的执行过程为:将第二级中的二选一多路器均选择0为输入。第五级的第一个多路选择器选择第三级第1个加法运算单元的输出对应的在第四级的寄存器的输出作为输入;第五级的第2个多路选择器选择第三级第2个加法运算单元的输出对应的在第四级的寄存器的输出作为输入。
那么,在t1时刻,可参考图11,在第一级中将xt1、yt1向量输入第一级的乘法运算单元中进行运算,得到xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]。
在t2时刻,可参考图12,在第二级中将第一级上一时刻得到的xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]在这里分别与0相加,得到xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]。
在t3时刻,可参考图13,在第三级中将第二级上一时刻得到的xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]每两个作为一组输入到加法运算单元中,得到xt1[0]*yt1[0]+xt1[1]*yt1[1],xt1[2]*yt1[2]+xt1[3]*yt1[3]。
在t4时刻,可参考图14,在第四级中将第三级寄存器存储的结果传递到第四级相应的寄存器中。
在t5时刻,可参考图15,在第五级中将第五级多路选择器选择相应的结果输出到本级的寄存器中,得到最终的输出结果。第五级的输出寄存器中,第一、第二个的值分别为xt1[0]*yt1[0]+xt1[1]*yt1[1]和xt1[2]*yt1[2]+xt1[3]*yt1[3],即本发明实施例所需要的输出,而其他寄存器输出为无效输出。
通过上述例子的计算过程可以看出,本发明实施例能够实现对多路输出进行空间维度的累加,即对乘法运算单元的输出进行分组,并对组内的乘法运算单元输出结果累加。
例3、对两个4维向量x、y在t1和t2两个时刻的输入相乘,将两个时刻相乘结果进行累加,将累加结果相邻的每两个一组进行累加并输出。x包含四个元素x[0]、x[1]、x[2]、x[3],y包含四个元素y[0]、y[1]、y[2]、y[3],xt1表示t1时刻输入的x。
需要计算的乘累加运算为:
z=[xt1[0]*yt1[0]+xt1[1]*yt1[1]+xt2[0]*yt2[0]+xt2[1]*yt2[1],xt1[2]*yt1[2]+xt1[3]*yt1[3]+xt2[2]*yt2[2]+xt2[3]*yt2[3]]。
可以理解的是,本发明实施例实质上是在计算乘累加器先将多个时刻乘法结果累加,再将结果分组累加的过程。
具体的执行过程为:将第二级中的多路选择器均选择相应加法运算单元通过寄存器的输出作为输入。第五级的第一个多路选择器选择第三级第1个加法运算单元的输出对应的在第四级的寄存器的输出作为输入;第五级的第2个多路选择器选择第三级第2个加法运算单元的输出对应的在第四级的寄存器的输出作为输入。
那么,在t1时刻,可参考图16,在第一级中将xt1、yt1向量输入第一级的乘法运算单元中进行运算,得到xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]。
在t2时刻,可参考图17,在第一级中将xt2、yt2向量输入第一级的乘法运算单元中进行运算,得到xt2[0]*yt2[0],xt2[1]*yt2[1],xt2[2]*yt2[2],xt2[3]*yt2[3]。在第二级中将第一级上一时刻得到的xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]在这里分别与相应的加法运算单元的输出寄存器的值相加,各个寄存器初始值为0,因此第二级输出到寄存器的值为:xt1[0]*yt1[0],xt1[1]*yt1[1],xt1[2]*yt1[2],xt1[3]*yt1[3]。
在t3时刻,可参考图18,在第二级中将第一级上一时刻得到的xt2[0]*yt2[0],xt2[1]*yt2[1],xt2*yt2[2],xt2[3]*yt2[3]分别与相应的加法运算单元的输出寄存器的值相加,即得到:xt1[0]*yt1[0]+xt2[0]*yt2[0],xt1[1]*yt1[1]+xt2[1]*yt2[1],xt1[2]*yt1[2]+xt2[2]*yt2[2],xt1[3]*yt1[3]+xt2[3]*yt2[3]。
在t4时刻,可参考图19,在第三级中将第二级上一时刻得到的xt1[0]*yt1[0]+xt2[0]*yt2[0],xt1[1]*yt1[1]+xt2[1]*yt2[1],xt1[2]*yt1[2]+xt2[2]*yt2[2],xt1[3]*yt1[3]+xt2[3]*yt2[3],每两个一组输入到加法运算单元中,得到:
xt1[0]*yt1[0]+xt1[1]*yt1[1]+xt2[0]*yt2[0]+xt2[1]*yt2[1]和xt1[2]*yt1[2]+xt1[3]*yt1[3]+xt2[2]*yt2[2]+xt2[3]*yt2[3]。
在t5时刻,可参考图20,在第四级中将第三级寄存器存储的结果传递到第四级相应的寄存器中。
在t6时刻,可参考图21,在第五级中将第四级多路选择器选择相应的结果输出到本级的寄存器中,得到最终的输出结果。第五级的输出寄存器中,第一、第二个的值分别为:
xt1[0]*yt1[0]+xt1[1]*yt1[1]+xt2[0]*yt2[0]+xt2[1]*yt2[1]和xt1[2]*yt1[2]+xt1[3]*yt1[3]+xt2[2]*yt2[2]+xt2[3]*yt2[3],也就是本发明实施例所需要的输出,而其他寄存器输出为无效输出。
通过上述例子的计算过程可以看出,本发明实施例能够实现先对多路乘法器输出进行时间维度累加,再对时间维度的累计结果进行进行空间维度的累加,即对第二级加法运算单元的输出进行分组,并对组内的加法运算单元输出结果累加。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。