一种浮点数乘法的舍入方法及装置
技术领域
本发明属于集成电路设计中的浮点乘法运算技术领域,确切地说,属于IEEE 754标准的浮点乘法的尾数舍入技术领域。
背景技术
随着数字信号处理技术的不断发展,人们对数据的精确性和处理实时性要求日益提高。浮点数据运算已经被数字信号处理(DSP)领域广泛采用。
浮点乘法器是DSP处理器和高性能计算系统的重要组成部分,有研究表明,在涉及浮点的操作中,有31%左右是乘法操作。在以往的设计中,浮点乘法是整个系统的关键路径所在,主要原因为浮点乘法器进行尾数处理时间较长。
IEEE 754定义的浮点表示由符号位,带偏移指数部分和尾数部分组成。浮点乘法可以分为三部分:符号位异或,指数相加与尾数相乘。这三部分运算可以并行计算,并在相应阶段做出调整。因为在浮点表示中,尾数位宽固定,尾数相乘后的结果须舍弃一部分,对此,IEEE 754标准定义了四种舍入模式:就近舍入,向零舍入,向正无穷舍入和向负无穷舍入。在尾数的处理中,何处是临界的舍入点与尾数相乘的结果有关,这也是浮点乘法中最易出错和最耗时的部分。
所以,本发明提出一种适用于IEEE 754标准的单双精度各种舍入模式的快速浮点乘法舍入装置,以提高浮点乘法器的性能。
发明内容
(一)要解决的技术问题
有鉴于此,本发明的主要目的在于提供一种快速浮点乘法舍入装置,通过归纳IEEE 754的舍入模式和在尾数处理中部分积压缩时提前引入一个与舍入相关的特殊值,简化后续尾数舍入。
(二)技术方案
本发明提出了一种浮点数乘法的舍入方法,其特征在于,在进行部分积压缩时,引入预定数据作为部分积参与部分积压缩;所述预定数据根据浮点乘法结果的舍入方式不同而不同,具体如下取值:
(1)舍入是向零舍入时,特殊数为0;
(2)舍入是就近取偶舍入时,特殊数为2N-2;
(3)舍入是向正无穷舍入时,如果结果的符号位是正,取值为2N-1-1,否则是0;
(4)舍入是向负无穷舍入时,如果结果的符号位是负,取值为2N-1-1,否则是0;
其中,N表示浮点数尾数的长度。
本发明还提出了一种浮点数乘法的舍入装置,其特征在于,包括:
部分积压缩模块,其在进行部分积压缩时,引入预定数据作为部分积参与部分积压缩;所述预定数据根据浮点乘法结果的舍入方式不同而不同,具体如下取值:
(1)舍入是向零舍入时,特殊数为0;
(2)舍入是就近取偶舍入时,特殊数为2N-2;
(3)舍入是向正无穷舍入时,如果结果的符号位是正,取值为2N-1-1,否则是0;
(4)舍入是向负无穷舍入时,如果结果的符号位是负,取值为2N-1-1,否则是0;
其中,N表示浮点数尾数的长度。
(三)有益效果
从上述技术方案可以看出,本发明具有以下有益效果:
本发明完全适用于IEEE 754单、双精度及扩展精度四种舍入模式的乘法舍入,由于在部分积压缩阶段提前引入一个与舍入相关的特殊值,简化了后续尾数计算阶段的逻辑。该特殊值产生的负面影响,如面积、延迟等相比于其带来的性能提高可以忽略不计。实践证明,采用该装置的浮点乘法器能显著提高性能。
附图说明
图1是现有技术中12×5行列乘法计算过程示意图;;
图2是现有技术中16行部分积利用华莱士树结构压缩为2个部分积过程的示意图;
图3是现有技术中全加器的结构示意图;
图4是现有技术中半加器结构示意图;
图5是本发明中引入特殊数据后17行部分积利用华莱士树结构压缩为2个部分积过程的示意图;
图6是本发明中浮点数乘法的舍入装置结构示意图;
图7是本发明具体实施例中浮点数乘法的舍入装置结构示意图;
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下以IEEE 754单精度浮点乘法器舍入作为具体实施案例,对本发明进一步详细说明。
本发明提出了一种针对浮点乘法有效的舍入方法,其包括:
在进行部分积压缩时,引入特殊数据作为部分积参与部分积压缩;所述特殊数据根据浮点乘法结果的舍入方式不同而不同,具体如下取值:
(1)舍入是向零舍入时,特殊数为0;
(2)舍入是就近取偶舍入时,特殊数为2N-2;
(3)舍入是向正无穷舍入时,如果结果的符号位是正,取值为2N-1-1,否则是0;
(4)舍入是向负无穷舍入时,如果结果的符号位是负,取值为2N-1-1,否则是0;
其中,N表示浮点数尾数的长度。
本发明提出的上述方法能够实现IEEE 754标准定义的四种舍入:就近舍入,向零舍入,向正无穷舍入和向负无穷舍入,其中的向正无穷舍入和向负无穷舍入在舍入时与结果的正负有关,可以转换为向零舍入和向无穷舍入进行处理。
输入数据可以是规格化数也可以是非规格化数,当输入数据是非规格化数时,可以通过扩展指数表示范围,转换成规格化数处理。
用N表示浮点数尾数总长度,本发明在传统的部分积压缩基础上,引入一个特殊数据同时参与压缩,获取两个部分积Sum和Carry,这个特殊数的产生、压缩引起的面积、延迟等代价非常小,与其带来的性能提高相比可以忽略。
两个N位的尾数相乘,其中N为自然数,结果至多是2N位,所以中间结果只保留所需的2N位,超出范围的直接舍去,对最终结果没有影响。并且由于处理的是规格化数,结果位数从0开始编号,结果的第2N-1位和第2N-2位至少有一位是1。
下面就现有技术中的浮点数乘法运算与本发明的浮点数乘法运算进行比较说明。
现有技术中,如图1所示,以简单乘法12×5为例,介绍部分积及部分积压缩的过程,其进行行列乘法的过程中,先生成4项每项4位的部分积,然后对这些部分积适当移位对齐后求和,可并行进行压缩得到两个结果Sum和Carry,然后对Sum和Carry进行求和,得到最终结果。数据压缩过程为:第一行部分积1100、第二行部分积0000、第三行部分积1100对齐后进行3∶2压缩,得到部分积000100和11100,与第四行部分积进行对齐后压缩,得到Sum和Carry:0000100和011100,将此两个数进行对齐后相加,得到最终的计算结果00111100,以上部分积压缩过程中所述位宽不等长,在实际运算中会根据具体算法对位宽进行处理,比如补0操作。
以上所述部分积压缩过程可以通过多种形式完成,比如华莱士树压缩,以16行部分积压缩为2个部分积为例,示意如图2所示。
华莱士树压缩,其并行地对部分积求和而非顺序地求和,为了将16个部分积输入减少到2个部分积输出,华莱士树需要即6级3∶2压缩结构。
其中,对于三输入两输出的数据采用3∶2压缩器实现,其结构和功能如图3和表1所示,功能就是一个全加器。
表1
a |
b |
c |
进位 |
和 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
其中,对于两输入两输出的数据采用2∶2压缩器实现,其结构和功能如图4和表2所示,功能就是一个半加器。
表2
a |
b |
进位 |
和 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
本发明引入特殊数据参与压缩,假设之前的部分积行为m行,引入该特殊数据后,被压缩的部分积行为m+1行,即第m+1行为所引入的特殊数据;举例说明,如之前部分积行为16行,则引入特殊数据后,部分积行为17行,部分积压缩过程可采用华莱士树进行,压缩过程如图5所示。引入特殊数据后部分积压缩过程,除第二级压缩树由3行变为4行同时并行进行压缩外,其余没有变化,总压缩级数还为6级,压缩时间没有增加。
下面,就本发明提出的上述方法,在引入特殊数据作为部分积参与部分积压缩的整个浮点数乘法过程进行说明。如图6所示,部分积压缩后,得到两个2N位的数Sum和Carry,即图6中的601和602。601是这两个数的高部分,从第2N-1位到第N-1位共N+1位,602是这两个数低部分,从第N-2位到第0位,共N-1位。在部分积压缩中,特殊数据已经包含,部分积压缩结果601和602是已经引入特殊数据后的压缩结果。
601进入一个N+1位宽的半加器行603,603半加器行对601提供的数据,采用N+1个如图4所示的半加器进行运算,得到两个N位宽的结果和一个1位宽的结果,这两个N位宽的结果位于第2N-1位到第N位,这个1位宽的结果位于第N-1位,这个位于第N-1位的一位宽的数据进入606,两个N位宽的数进入N位复合加法器605。
604进行602提供的两个N-1位数进行加法运算,得到第N-1位的进位,第N-2位的和,以及加法结果第N-3位至第0位,并将第N-3位至第0位进行或操作。将第N-1位的进位信号表示为Carry[N-1],第N-2位的和表示为Sum[N-2]即为Round位,加法结果第N-3位至第0位的或的结果即为Sticky。
Sticky的计算也可用简化的方式,以降低延迟和面积,定义604输入的两个数为Sum,Carry,位宽为N-1位,Sumi和Carryi为Sum和Carry各位上的数值,设变量pi,hi,zi,i为0到N-3的正整数:
(异或)
hi=Sumi|Carryi(或)
Sticky=z0|z1|...|zN-3
为了加快运算速度,进位Carry[N-1]和Round位Sum[N-2]可采用超前进位加法器或者其他快速加法器获得。
超前进位加法器利用两个输入操作数和最低有效位的进位输入,并行产生其它各位的进位输入,基本思想如下:
一位全加器的逻辑表达式为ci+1=xi·yi+(xi+yi)ci公式(1)定义进位产生因子gi=xiyi,进位传播因子pi=xi+yi,则ci=gi-1+pi-1ci-1,迭代可得:
ci=gi-1+pi-1gi-2+pi-1pi-2gi-3+…+pi-1pi-2…p1g0+pi-1pi-2…p1p0c0 公式(2)
利用公式(2)计算进位的加法器就是超前进位加法器。
605复合加法器对输入的两个N位宽操作数进行求和。得到结果Sum0[2N-1:N]和Sum1[2N-1:N],Sum0是两个输入数据之和,Sum1=Sum0+1。
606对尾数的结果进行最后的选择和调整,并产生指数是否增加1的调整信号,如果尾数运算结果超出其能表示的最大范围,则除了对尾数输出进行调整,并且指数增加1信号有效,指数在被乘数和乘数指数相加的基础上再进行加1运算,606具体实现如下所示。
定义Res0[N-1:1]和Res1[N-1:1],其逻辑如下:
如果Sum0[2N-1]=1,则Res0[N-1:1]=Sum0[2N-1:N+1];
如果Sum0[2N-1]=0,则Res0[N-1:1]=Sum0[2N-2:N]。
如果Sum1[2N-1]=1,则Res1[N-1:1]=Sum1[2N-1:N+1];
如果Sum1[2N-1]=0,则Res1[N-1:1]=Sum1[2N-2:N]。
现假定最后的尾数结果为M[N-1:0],该位宽包含一位隐含位。
定义指数增加1信号overflow,overflow=1,则指数需要调整加1。
它们的逻辑如下:
当且仅当以下四个条件满足其一时:M[N-1:1]选择Res1,overflow=Sum1[2N-1];否则M[N-1:1]选择Res0,overflow=Sum0[2N-1]。
(1)如果向零舍入或者Sum0[2N-1]=0时:Sum[N-1]&Carry[N-1]为真
(2)如果是向正/负无穷舍入,乘法结果与舍入方向相反时,与(1)一致
(3)如果是向正/负无穷舍入,乘法结果与舍入方向相同且Sum0[2N-1]=1时:Sum[N-1]|Carry[N-1]为真
(4)如果就近取偶舍入且Sum0[2N-1]=1时:Sum[N-2]+Sum[N-1]+Carry[N-1]≥2
M[0]的逻辑如下:
如果overflow=1:
在逻辑~|(~Sum[N-2])|Sticky|~(就近取偶舍入)为真且以上四个条件满足其一时,M[0]=Sum1[N];
在逻辑~|(~Sum[N-2])|Sticky|~(就近取偶舍入)为真且以上四个条件都不满足时,M[0]=Sum0[N];
在逻辑~|(~Sum[N-2])|Sticky|~(就近取偶舍入)为假时,M[0]=0;
如果overflow=0:
在逻辑Sum[N-2]|Sticky|~(就近取偶舍入)为真且以上四个条件满足其一时,M[0]=Sum1[N-1];
在逻辑Sum[N-2]|Sticky|~(就近取偶舍入)为真且以上四个条件都不满足时,M[0]=Sum0[N-1];
在逻辑Sum[N-2]|Sticky+~(就近取偶舍入)为假时,M[0]=0;
至此,浮点乘法尾数计算部分完成。
下面就以两个24位的数相乘为例说明。
IEEE 754单精度的表示方法如下:设A[31:0]为单精度浮点数,A[31]为符号位,A[30:23]为指数位,A[22:0]为不含隐含位的尾数位。在IEEE 754标准中,权重从左至右依次递减,最高位隐含位的权重是0,这里为了讨论的方便,将权重看成从右至左依次递增,最低位的权重是0。
为了使描述方便,现假定输入的操作数是规格化数,输入是非规格化数时,可以通过扩展指数表示范围,转换成类似规格化数。
尾数乘法采用部分积压缩再求和的方法,方式是基四Booth编码和Wallace树压缩,基四Booth编码可以将部分积数目减少一半左右,Wallace树可以并行的压缩这些部分积,同时将特殊值与部分积一起进行压缩。
这个特殊数的取值方式如下:
舍入是向零舍入时,特殊数为0;
舍入是就近取偶舍入时,特殊数为222;
舍入是向正无穷舍入时,如果结果的符号位是正,取值为223-1,否则是0;
舍入是向正无穷舍入时,如果结果的符号位是正,取值为223-1,否则是0。
两个24位的数相乘,结果至多是48位,所以中间结果只需要保存48位即可。并且由于处理的是规格化数,结果的第47位和第46位至少有一位是1。
如图7所示,部分积压缩后,得到两个48位的数Sum和Carry,即图7中的701和702。701是这两个数的高部分,从第47位到第23位共25位,702是这两个数低部分,从第22位到第0位,共23位。在部分积压缩中,特殊数据已经包含,部分积压缩结果701和702是已经引入特殊数据后的压缩结果。
701进入一个25位宽的半加器行703,703半加器行对701提供的数据,采用25个如图4所示的半加器进行运算,得到两个24位宽的结果和一个1位宽的结果,这两个24位宽的结果位于第47位到第24位,这个1位宽的结果位于第23位,这个位于第23位的一位宽的数据进入706,两个24位宽的数进入复合加法器705。
704进行702提供的两个23位数进行加法运算,得到第23位的进位,第22位的和,以及加法结果第21位至第0位,并将第21位至第0位进行或操作。将第23位的进位信号表示为C[23],第22位的和表示为S[22]即为Round位,加法结果第21位至第0位的或的结果即为Sticky。
Sticky的计算也可用简化的方式,以降低延迟和面积,定义704输入的两个数为Sum,Carry,位宽为23位,Sumi和Carryi为Sum和Carry各位上的数值,设变量pi,hi,zi,i为0到21的正整数:
(异或)
hi=Sumi|Carryi(或)
Sticky=z0|z1|...|z21
进位Carry[23]和Round位Sum[22]也可采用超前进位加法器的方式获得。
705复合加法器对输入的两个24位宽操作数进行求和。得到结果Sum0[47:24]和Sum1[47:24],Sum0是两个输入之和,Sum1=Sum0+1。
706对尾数的结果进行最后的选择和调整,并产生指数增加1的调整信号,如果尾数运算结果超出其能表示的最大范围,则除了对尾数输出进行调整,并且指数增加1信号有效,指数在被乘数和乘数指数相加的基础上再进行加1运算,706具体实现如下所示。
定义Res0[23:1]和Res1[23:1],其逻辑如下:
如果Sum0[47]=1,则Res0[23:1]=Sum0[47:25];
如果Sum0[47]=0,则Res0[23:1]=Sum0[46:24]。
如果Sum1[47]=1,则Res1[23:1]=Sum1[47:25];
如果Sum1[47]=0,则Res1[23:1]=Sum1[46:24]。
现假定最后的尾数结果为M[23:0],该位宽包含隐含位。
定义指数增加1信号overflow,overflow=1,则指数需要调整加1。
它们的逻辑如下:
当且仅当以下四个条件满足其一时:M[23:1]选择Res1,overflow=Sum1[47];否则M[23:1]选择Res0,overflow=Sum0[47]。
(1)如果向零舍入或者Sum0[47]=0时:S[23]&C[23]为真
(2)如果是向正/负无穷舍入,乘法结果与舍入方向相反时,与第一条一致
(3)如果是向正/负无穷舍入,乘法结果与舍入方向相同且Sum0[47]=1时:S[23]|C[23]为真
(4)如果就近取偶舍入且Sum0[47]=1时:S[22]+S[23]+C[23]≥2
M[0]的逻辑如下:
如果overflow=1:
在逻辑~|(~Sum[22])|Sticky|~(就近取偶舍入)为真且以上四个条件满足其一时,M[0]=Sum1[24];
在逻辑~|(~Sum[22])|Sticky|~(就近取偶舍入)为真且以上四个条件都不满足时,M[0]=Sum0[24];
在逻辑~|(~Sum[22])|Sticky|~(就近取偶舍入)为假时,M[0]=0;
如果overflow=0:
在逻辑Sum[22]|Sticky|~(就近取偶舍入)为真且以上四个条件满足其一时,M[0]=Sum1[23];
在逻辑Sum[22]|Sticky|~(就近取偶舍入)为真且以上四个条件都不满足时,M[0]=Sum0[23];
在逻辑Sum[22]|Sticky|~(就近取偶舍入)为假时,M[0]=0;
至此,尾数部分计算完成。
以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。