一种半精度浮点矩阵乘累加误差的优化方法与流程

文档序号:29350398发布日期:2022-03-22 19:49阅读:404来源:国知局
一种半精度浮点矩阵乘累加误差的优化方法与流程

1.本发明涉及一种半精度浮点矩阵乘累加误差的优化方法,属于深度学习技术领域。


背景技术:

2.使用半精度浮点类型不仅能够大幅度降低数据传输和存储成本,进一步使用运算核中的向量计算部件进行计算,还能有效提高计算算子的运算速度。
3.矩阵乘是深度学习中占比很大的计算操作,目前矩阵乘运算中的累加操作是通过逐一累加的方式进行的,由于fp16半精度数据格式中的尾数只有10位,这样的精度不足会造成部分数据进行加法操作时的精度损失,从而导致舍入误差的问题。
4.以fp16格式为例,数据结构格式表示如附图1所示,半精度数据在内存中储存时长度为16位, 尾数只有10位,这样短的尾数会导致fp16因精度不足而带来舍入误差:当两个浮点数进行加减运算时,首先要使两个数的阶码相同,即小数点的位置对齐,这个过程称为对阶。在对阶时,规定使小阶向大阶看齐,通过小阶的尾数算术右移来改变阶码;对阶过程中,由于fp16只有10位的尾数,当小阶的尾数右移超过11位时,会导致该数变为0,即以fp16表示的数,如果当大数与小数的比率大于2^11时,加减法运算结果出现较大误差。
5.在nvidia的gpu中提供了tensor core支持,由硬件提供了混合精度(fp16矩阵相乘和fp32相加)的方式,可以通过扩展乘法结果到fp32的方式应对累加运算时精度损失的问题,而在国产众核处理器上缺少类似的硬件支持,只支持单纯的fp16乘法和加法。
6.通常矩阵乘计算过程中分块数据的累加是以逐个累加的方式进行加法运算,当累加次数较多时,累加结果可能数值较大,此时容易出现无法累加较小数据的情况,导致计算结果误差较大的问题。


技术实现要素:

7.本发明的目的针对现有技术中存在的问题和传统矩阵乘的计算特点,提出一种国产众核处理器上半精度矩阵乘累加误差优化策略,降低半精度矩阵乘结果误差。
8.为达到上述目的,本发明采用的技术方案是:提供一种半精度浮点矩阵乘累加误差的优化方法,针对半精度浮点矩阵乘的分块运算,在进行分块结果累加计算时,先进行各分块内部累加,再进行分块间累加,具体包括以下步骤:s1、两个形状为m*k和k*n的矩阵进行半精度矩阵乘法时,如果k大于64,则将矩阵数据按kernel(m*n*k为8*32*32)进行分块;s2、每组分块中,对矩阵乘法的结果进行内部累加;s3、将s2中获得的每组分块的结果进行块间累加。
9.由于上述技术方案的运用,本发明与现有技术相比具有下列优点:本发明一种半精度浮点矩阵乘累加误差的优化方法,针对半精度浮点矩阵乘的分块运算,在进行分块结果累加计算时,先进行各分块内部累加,再进行分块间累加,有效缓
解了由于半精度类型数据表示范围较小导致的计算结果误差较大的问题。
附图说明
10.附图1为fp16 半精度浮点类型格式示意图;附图2为两个方阵进行矩阵乘的示意图。
具体实施方式
11.实施例:本发明提供一种半精度浮点矩阵乘累加误差的优化方法,针对半精度浮点矩阵乘的分块运算,在进行分块结果累加计算时,先进行各分块内部累加,再进行分块间累加,有效缓解由于半精度类型数据表示范围较小导致的计算结果误差较大的问题,具体包括以下步骤:s1、两个形状为m*k和k*n的矩阵进行半精度矩阵乘法时,如果k大于64,则将矩阵数据按kernel(m*n*k为8*32*32)进行分块;s2、每组分块中,对矩阵乘法的结果进行内部累加,而不是在上个分块计算结果的基础上进行累加;s3、将s2中获得的每组分块的结果进行块间累加。
12.这样分块矩阵乘且分块数据累加方式可以让每次参与加法的数据值更均衡,有效减少加法运算结果的精度误差;对上述实施例的进一步解释如下:本发明主要针对半精度浮点数据累加过程中,由于半精度数据表示范围较小,在对阶操作时出现数据下溢导致结果误差的问题,提供一种在众核处理器上的半精度浮点矩阵乘的累加误差优化策略。该策略先将矩阵乘分块内部的乘法计算结果进行累加,然后再对各分块的结果进行累加,使用该策略进行矩阵乘过程中的累加操作可以让累加的数据大小相对均衡,减少对阶时出现半精度数据下溢的情况,达到降低结果误差的目的。
13.基本算法原理和分块累加实现:一个非转置的矩阵乘基本实现如下所示:根据以上实现可以发现,目前矩阵乘过程中的累加是每个结果数据直接累加上去的,这样可能会出现w[cn][ck]*di[ck][cm]/tmp》2^11的情况,对于某些数据,当k维较大时,精度损失也会同比例增加。
[0014]
为了降低精度损失,提出了以下优化方法:
对于k维较大(大于64)的情况,首先将矩阵数据按矩阵乘kernel(m*n*k为8*32*32)进行分块,每个块矩阵乘法的结果首先进行内部累加,再将每块的结果进行块间累加,这样分块矩阵乘且分块数据累加方式可以让每次参与加法的数据值更均衡,有效减少加法运算结果的精度误差。
[0015]
如图2所示,以两个方阵进行矩阵乘为例,使用以上这种通过将每个分块内的数据进行内部累加后,再与其他分块结果再次相加的方式,可以根据分块的k维大小不同达到不同程度的精度优化。
[0016]
此种分块累加的方式,不仅在矩阵乘中有很好的效果,在其他如加法规约等加法计算较多的计算中也有较好的支持。
[0017]
对于某些情况的半精度数据的矩阵乘计算,能够有效降低运算结果的精度误差,同时该方法还适应其他一些场景的半精度数据运算:从数据类型上来说,不仅对于fp16格式的半精度数据适用,对于bf格式的半精度数据也是适用的;从计算内容上来说,不仅对半精度矩阵乘做累加时有很好的支持,对于加法规约等其他加法运算较多的计算也有很好的支持。
[0018]
采用上述一种半精度浮点矩阵乘累加误差的优化方法时,其针对半精度浮点矩阵乘的分块运算,在进行分块结果累加计算时,先进行各分块内部累加,再进行分块间累加,有效缓解了由于半精度类型数据表示范围较小导致的计算结果误差较大的问题。
[0019]
为了便于更好的理解本发明,下面将对本文中使用的术语进行简要的解释:对阶:是指将两个进行运算的浮点数的阶码对齐的操作,对阶的目的是为了使两个浮点数的尾数能够进行加法运算。
[0020]
上述实施例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人士能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。凡根据本发明精神实质所作的等效变化或修饰,都应涵盖在本发明的保护范围之内。


技术特征:
1.一种半精度浮点矩阵乘累加误差的优化方法,其特征在于:针对国产众核处理器半精度浮点矩阵乘的分块运算,在进行分块结果累加计算时,先进行各分块内部累加,再进行分块间累加,具体包括以下步骤:s1、两个形状为m*k和k*n的矩阵进行半精度矩阵乘法时,如果k大于64,则将矩阵数据按kernel(m*n*k为8*32*32)进行分块;s2、每组分块中,对矩阵乘法的结果进行内部累加;s3、将s2中获得的每组分块的结果进行块间累加。

技术总结
本发明公开一种半精度浮点矩阵乘累加误差的优化方法,针对半精度浮点矩阵乘的分块运算,在进行分块结果累加计算时,先进行各分块内部累加,再进行分块间累加,具体包括以下步骤:S1、两个形状为M*K和K*N的矩阵进行半精度矩阵乘法时,如果K大于64,则将矩阵数据按kernel(M*N*K为8*32*32)进行分块;S2、每组分块中,对矩阵乘法的结果进行内部累加;S3、将S2中获得的每组分块的结果进行块间累加。本发明有效缓解了由于半精度类型数据表示范围较小导致的计算结果误差较大的问题。导致的计算结果误差较大的问题。导致的计算结果误差较大的问题。


技术研发人员:刘沙 陈德训 刘鑫 黄则强 彭超 高捷 王宜鹏
受保护的技术使用者:无锡江南计算技术研究所
技术研发日:2021.04.30
技术公布日:2022/3/21
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1