一种并行浮点乘加单元的制作方法

文档序号:6614042阅读:167来源:国知局
专利名称:一种并行浮点乘加单元的制作方法
技术领域
本发明涉及浮点运算单元设计,是一种用于实现高性能浮点运算的高速浮点乘加单元。

背景技术
文献数据表明,几乎50%的浮点乘法指令后面紧跟的指令为浮点加法或减法。因此,浮点乘加融合操作A+B×C已经成为科学运算和多媒体应用中的一种基本操作。由于浮点乘加融合操作在应用程序中如此频繁地出现,用浮点乘加融合单元(简化为MAF单元)来实现该操作已经成为现代高性能商业处理器的一个很好的选择。这种实现方式主要有以下两个优点(1)仅需要一次舍入,不是两次;(2)通过共享一些组成模块,可降低电路延迟和硬件开销。乘加(MAF)指令需要3个操作数。例如,执行A+(B×C)操作,当把乘加指令中操作数A置为0时执行的是乘法指令,把操作数B或C置为1时,执行的是加法指令。在已实现的多数处理器中,浮点乘加运算一般通过以下步骤来实现(相关内容请见参考文献1Floating-Point Multiply-Add-Fused with Reduced Latency,实现过程的框图见图1) 1.首先对被乘数C做波茨编码,然后用进位保存压缩加法器(CSA)组成的压缩树实现B×C,得到两个部分积。在进行乘法的同时,操作数A进行取反和对齐移位操作。操作数A和B×C的符号可能相同,也可能相反。如果A和B×C的符号相反,将A和B×C做有效减法,需要得到A的补码进行相加,A需要取反。否则如果A和B×C的符号相同做有效加法,A不需要取反。下面不管是否需要进行取反操作,将通过取反器之后的A记为Ainv。
在IEEE-754标准中,单精度操作数的尾数是24比特,再加上2个额外的舍入位,Ainv比B×C的结果的最高位最多左移26位,或者比B×C结果的最高位最多右移48比特,即移位范围在[-26,48]之间。在浮点乘加的设计中为了使移位简单化,规一化A的移位方向为向右移位。所以Ainv最初置于B×C左端26比特的位置,Ainv在对齐中右移位的位数是27-(exp(A)-(exp(B)+exp(C)-127),其中,exp(A),exp(B)和exp(C)分别是操作数A,B和C的指数。
2.把对齐移位后的Ainv、和B×C压缩后的部分积用压缩比为3∶2的进位保存加法器(CSA)压缩,得到两个部分积,同时处理A求补时所需要的加1。
3.利用2中压缩后得到的两个部分积进行前导零预测(LZA,leading zeroanticipator),得到加法结果的规格化左移的位数。同时判断最终结果的正负。
4.在前导零预测和符合预测的同时做半加操作,并完成部分的加法运算。进行半加操作是为了保证后面能正确地进行舍入。由于符号预测所需要的时间比半加操作多,可在此时间空隙里完成最终加法的一部分。
5.加法结果利用LZA预测的左移的位数进行规格化左移。若3中符号预测部件判断最终结果为负,则选择2中压缩后得到的部分积的补数形式经第4步处理后的结果进行规格化移位。
6.最终加法和舍入操作。
图1所示的现有技术的不足如下 (1)不能同时处理一个加法指令(A+B)和一个乘法指令(C×D),而需要两个周期来完成这两条指令,而分析一些应用实例发现,如果加法和乘法指令能同时进行,能较大地提高指令流的执行效率; (2)连续两条指令存在数据相关时,流水线将被迫等待两个周期(三级流水线实现时),而在实际应用中,数据相关又是一个非常普遍的现象。
图1所示的现有技术的不足不能够通过采用单独的加法单元和乘法单元来解决,首先,会增大硬件开销,其次,乘加指令需要拆分成两条指令来执行,降低了其执行效率,且由于进行了两次舍入,降低了精度,最后,这种方案不能对发生了数据相关的指令进行加速。通过采用一个乘加单元和一个加法单元能弥补图1所示的现有技术的部分不足,但是其硬件开销的增加太大,而且对于发生了数据相关的指令,这种解决方案同样是无能为力。
相对图1所示的现有技术,本发明实现了形式为A+B+C×D的操作,称为并行的乘加操作,有如下优点 (1)能够同时处理一个加法指令(A+B)和一个乘法指令(C×D),实现了加法指令和乘法指令的指令级并行; (2)当相邻的两条指令发生如下三种数据相关时,能够作为一条指令在进行处理 a)第一条指令E=A+B,第二条指令F=E+C b)第一条指令E=A+B,第二条指令F=E+C×D c)第一条指令E=A+C×D,第二条指令F=E+B (3) 每条并行乘加指令运算完成时,都能同时得到乘法操作(C×D)的结果,而且可以单独指定乘法的舍入模式。


发明内容
本发明的目的在于设计一种高性能的全流水线的单精度高速的并行浮点乘加单元,提高浮点指令的并行度和执行效率,同时保证较少的硬件开销。
本发明特征在于,本发明提供了一种三级流水实现的单精度并行浮点乘加运算单元,实现形式为A+B+(C×D)的乘加操作,A≥B,其特征在于,该浮点乘加单元含有三级流水,吞吐量为每周期一条指令,且同时能够产生C×D的结果,该浮点乘加单元含有 第一级流水线由指数和符号处理单元(1)第一个74比特移位对齐器(2)、第二个74比特移位对齐器(3)、粘滞位计算器(4)、第一个按位取反器(5)、第二个按位取反器(6)、3:2的进位保存加法器CSA(7)、以4为基的波茨编码器(8)、3:2的进位保存加法器CSA组成的部分积压缩树(9)、24比特加法器(10)和选择器(11)组成;其中, 指数和符号处理单元(1),根据操作数A、B、C、D的指数和符号计算A+B+(C×D)的指数exp、C×D的指数exp_CD、是否为有效减sub、A+B+(C×D)的临时符号sign、C×D的符号sign_CD,并确定A和B相对C×D移位对齐时的移位量mv_A、mv_B,以及A和B移位对齐后是否需要按位取反sub_A、sub_B,按位取反即对每一位进行取反,也就是将0变为1,将1变为0; exp_CD=exp_C+exp_D, sub=sign_Asign_Csign_D, sign=sign_CD=sign_Csign_D, sub_A=sign_Asign_Csign_D, sub_B=sign_Bsign_Csign_D, 其中,sian_A、sign_B、sign_C和sign_D分别是操作数A、B、C和D的符号,exp_A、exp_B、exp_C和exp_D分别是操作数A、B、C和D的指数,根据IEEE 754标准,单精度浮点数的符号为其最高位,指数为第2位到第8位;为异或操作; exp_CD-exp_A≤-51且sign_A≠sign_B时, exp=exp_A, mv_A=0, mv_B=exp-exp_B, exp_CD-exp_A≤-51且sign_A=sign_B时, exp=exp_A+1, mv_A=1, mv_B=exp-exp_B, -27>exp_CD-exp_A>-51时, exp=exp_CD+51, mv_A=exp-exp_A, mv_B=exp-exp_B, 23≥exp_CD-exp_A≥-27时, exp=exp_CD+27, mv_A=exp-exp_A, mv_B=exp-exp_B, exp_CD-exp_A>23时, exp=exp_CD+1, mv_A=exp-exp_A, mv_B=exp-exp_B, 第一个74比特的移位器(2)根据指数和符号处理单元(1)中得到的mv_A值,对A的尾数man_A进行向右移位,根据IEEE 754标准,单精度浮点数的尾数为其第8位到32位,其为规格化数时在最高位补1,否则在最高位补零,非规格化数将作为0看待,移位后的输出记为align_A, align_A=man_A□mv_A, 其中□表示右移; 第二个74比特的移位器(3)根据指数和符号处理单元(1)中得到的mv_B值,对B的尾数man_B进行向右移位,移位后的输出记为align_B, align_B=man_B□mv_B; 粘滞位计算单元(4),根据第二个74比特的移位器(3)的移位结果和指数和符号处理单元(1)中计算的sub_B计算粘滞位st1_B,mv_B>74时,若sub_B=0且man_B移出74比特宽的数据通道的部分全为0,或者sub_B=1且man_B移出74比特宽的数据通道的部分全为1,则st1_B=0,否则st1_B=1; 第一个按位取反器(5),如果A的符号位和C×D的符号位不同,对第一个74比特的移位器(2)的输出结果align_A做按位取反操作,否则不做任何操作直接将align_A输出,第一个按位取反器(5)的输出记为inv_A; 第二个按位取反器(6),如果B的符号位和C×D的符号位不同,对第二个74比特的移位器(3)的输出结果align_B的每比特都做取反操作(也就是按位取反),否则不做任何操作直接将align_B输出,第二个按位取反器(6)的输出记为inv_B; 将第一个按位取反器(5)和第二个按位取反器(6)的输出结果inv_A和inv_B,以及指数和符号处理单元(1)中得出的sub_A一起送入3:2 CSA(7)中作一次压缩,得到sum_AB、carry_AB,其中 sum_AB=inv_A^inv_B^sub_A, carry_AB=((inv_A&inv_B)|(inv_A&sub_A)|(inv_A&sub_A))<<1, 并将sub_B和st1_B与操作的结果放在carry_AB的最低位上, carry_AB[73]=sub_B&st1_B, 这里^、&和|分别表示按位异或、按位与和按位或操作,<<表示向左移位; 基4的波茨编码器(8)对C的尾数进行编码,然后将编码的结果与D的尾数相乘得到13个部分积,这13个部分积的被送入3:2的进位保存CSA压缩树(9)中,3:2 CSA树即由3:2 CSA组成的树,3个输入经过一个CSA将被压缩成2个输出,若设输入为x、y、z,输出为s、c,则压缩过程可表示如下 s=x^y^z, c=((x&y)|(x&z)|(y&z))<<1, 将5级3:2 CSA级联,形成3:2 CSA树,就能将13个部分积压缩为2个,分别记为sum_CD、carry_CD; sum CD和carry_CD的低24位被送到24比特的加法器(10)中,加法结果被总结成两个信息输出st1_CD和st1_CD_3MSB,其中记录加法结果的低24位是否全为零,若全为零,则st1_CD=0,否则st1_CD=1;st1_CD_3MSB记录25比特的加法结果的最高三位; 选择器(11)根据指数和符号处理单元(1)中计算出的指数范围从st1_B和st1_CD中选取一个作为st1输出, -27>exp_CD_exp_A>-51时,st1=st1_CD,其它情况下st1=st1_B; 第二级流水线由4:2 CSA(12)、74比特的前导零预测模块(13)、第一个74比特的半加器(14)、第一个74比特的半加器(15)和第一个74比特的半加器(16)、符号预测逻辑(17)、选择器(18)、74比特的移位器(19)和与门(20)组成;其中, 4:2 CSA(12)相当与2个级联的3:2,将四个输入sum_AB、carry_AB、sum_CD和carry_CD压缩为两个sum和carry,其中sum_CD和carry_CD要根据指数和符号处理单元(1)中计算的指数范围进行移位后作为CSA的输入,当exp_CD-exp_A<-27时,将sum_CD和carry_CD的前24位作为输入,当23≥exp_CD-exp_A≥-27时,将sum_CD和carry_CD作为输入,其他情况下(exp_CD-exp_A>23),将sum_CD和carry_CD向左移26比特后作为输入,压缩后将10中得到的st1_CD_3MSB的最高位存放在carry的最低位上; 74比特的前导零预测模块(13),判断12的输出结果sum和carry相加时,前导零的数目,前导零数目即从最高位开始,到第一个非0位之间的位数,若sum和carry相加结果为负,则这里判断的将是前导一的数目,即从最高位到第一个非1位之间的位数,具体的判断方法为 通过检查某一位及其左右相邻的位确定哪一位可能是最高位,设一预测位fi, T=sumcarry,G=sum&carry,
其中sum、carry为(13)的两个输出,

表示将sum按位取反,Ti、Gi、Zi分别表示T、G、Z的第i位,若fi=1,而fj=0(j=0,1…i-1),则前导零个数(LZN)为i; 设半加器输入为x、y,输出为s、c,则其原理可表示为 s=x^y, c=(x&y)<<1, 第一个半加器(14)根据上述原理将4:2CSA(12)输出的sum和carry处理为输出sumHApos和carryHApos; 将sum和carry按位取反后作为半加器第二个半加器(15)的输入,输出为sumHAinv和carryHAinv,并将carryHAinv的最低位置为1; 将sumHAinv和carryHAinv按位取反后作为第三个半加器(16)的输入,输出为sumHAcom和carryHAcom,并将carryHAcom的最低位置为1,这样sumHAcom+carryHAcom就相当于sum+carry的补数形式了; 符号预测模块(17),预测方法为判断sum+carry最高位是否有进位产生,若有进位产生,则相加结果为负,将输出信号complement赋为1,否则complement=0; 选择器(18)根据符号预测的结果,从sumHApos、carryHApos和sumHAcom、carryHAcom中选择一对作为输出,其输出记为sumHA、carryHA, complement=0时,sumHA=sumHApos,carryHA=carryHApos, complement=1时,sumHA=sumHAcom,carryHA=carryHAcom; 74比特的移位器(19)根据前导零预测的结果,对选择器(18)的输出向左进行移位,移位量为LZN,移位后的输出记为sumnor和carrynor; 与门(20)对符号预测模块(17)的输出complement和指数和符号处理单元(1)的输出sign进行与操作,得到A+B+C×D的符号; 第三级流水线由A+B+C×D的指数计算单元(21)、A+B+C×D的最终加/舍入单元(22)、C×D的指数修正单元(23)、C×D的最终加/舍入单元(24)组成;其中, A+B+C×D的指数计算单元(21),根据指数和符号处理单元(1)中得到的exp、74比特的前导零预测模块(13)中得到的LZN和A+B+C×D的最终加/舍入单元(22)中是否发生1位左移计算A+B+C×D的指数,若A+B+C×D的最终加/舍入单元(22)中不发生1位左移,则A+B+C×D的指数为exp-LZN,否则需要进行1比特的修正,最终A+B+C×D的指数将表示为exp-LZN-1; 在A+B+C×D的最终加/舍入单元(22)中,首先将74比特的移位器(19)的输出sumnor和carrynor相加,结果记为ABCD_added, ABCD_added=sumHAnor+carryHAnor, 然后根据ABCD_added、选择器(11)中得到的st1和舍入模式进行舍入,舍入模式有就近舍入(RN),向正无穷舍入(RP),向负无穷舍入(RM),向零舍入(RZ),从应用的角度来看,这四种舍入模式能减少到三个RN、RI、RZ;


RZ(x)=x 这里

和x分别表示向上取整和向下取整; 对于负数,舍入模式RP可等效为RI,RM可等效为RN;对于正数,舍入模式RP可等效为RN,RM可等效为RI; 首先计算粘滞位st2,若ABCD_added的最高位为1,则st2=|abcd_added[25:74],否则st2=|abcd_added[26:74];整个的粘滞位st由st1和st2两部分组成 st=st1|st2 然后根据st、ABCD added和舍入模式RI、RN或RZ,计算舍入结果的两个临时值,分别记为rounding_result_tmp1和rounding_result_tmp2,rounding_result_tmp1的计算方法如下 RI=1时, 如果st=1或者ABCD_added[24]=1,rounding_result_tmp1=ABCD_added
+1; 否则rounding_result_tmp1=ABCD_added
; RI=0时,若RN=1, 若ABCD_added[24]=0rounding_result_tmp1=ABCD_added
; 否则,st=1时,rounding_result_tmp1=ABCD_added
+1; ABCD_added[23]=1时,rounding_result_tmp1=ABCD_added
+1; 否则,rounding_result_tmp1=ABCD_added
; RI=0时,若RN=0,rounding_result_tmp1=ABCD_added
; rounding_result_tmp2的计算方法如下 RI=1时, 如果st=1或者ABCD_added[25]=1, rounding_result_tmp2=ABCD_added[1:24]+1; 否则rounding_result_tmp2=ABCD_added[1:24]; RI=0时,若RN=1, 若ABCD_added[25]=0rounding_result_tmp2=ABCD_added[1:24]; 否则,st=1时,rounding_result_tmp2=ABCD_added[1:24]+1; ABCD_added[24]=1时,rounding_result_tmp2=ABCD_added[1:24]+1; 否则rounding_result_tmp2=ABCD_added[1:24]; RI=0时,若RN=0,rounding_result_tmp2=ABCD_added[1:24]; 最后根据ABCD_added的最高位和rounding_result_tmp1的最高位从rounding_result_tmp1和rounding_result_tmp2中选取一个作为最终A+B+C×D的尾数,并决定21中的指数是否需要1比特的修正 若rounding_result_tmp1的最高位为1且ABCD_added的最高位为0,或者ABCD_added的最高位为1时,选取rounding_result_tmp1作为最终结果,21中不需要1比特的修正,否则选取rounding_result_tmp2作为最终结果,21中需要1比特的修正; C×D的指数修正单元(23)根据C×D的最终加/舍入单元(24)中是否进行了一位的左移判断是否需要对指数和符号处理单元(1)中输出的exp_CD进行修正后才能作为最终的C×D的指数,若C×D的最终加/舍入单元(24)中判得需要进行修正,则最终的C×D的指数为exp_CD-1,否则最终的C×D的指数为exp_CD; 在C×D的最终加/舍入单元(24)中,根据3:2的进位保存加法器CSA组成的部分积压缩树(9)中得到的sum_CD、carry_CD的高24位和(10)中得到的st1_CD、st1_CD_3MSB,计算C×D的尾数,并判定是否需要进行1比特的修正; 首先将sum_CD、carry_CD的高24位和st1_CD_3MSB的最高位相加,得到CD_added CD_added=sum_CD
+carry_CD
+st1_CD_3MSB
, 然后用A+B+C×D的最终加/舍入单元(22)中类似的方法计算C×D的尾数,先计算两个临时值rounding_result_CD_tmp1和rounding_result_CD_tmp2, rounding_result_CD_tmp1的计算方法如下 若RI=1,若st1_CD=1或st1_CD_3MSB[1]=1, rounding_result_CD_tmp1=CD_added+1;否则, rounding_result_CD_tmp1=CD_added; 若RI=0,且RN=1,若st1_CD_3MSB[1]=0, rounding_result_CD_tmp1=CD_added;否则,若st=1, rounding_result_CD_tmp1=CD_added+1;若st1_CD_3MSB[1]=1,且CD_added[23]=1, rounding_result_CD_tmp1=CD_added+1;e否则 rounding_result_CD_tmp1=CD_added; 若RI=0,且RN=0, rounding_result_CD_tmp1=CD_added; rounding_result_CD_tmp2的计算方法如下 若RI=1, 若st1_CD=1或st1_CD_3MSB[2]=1, rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}+1; 否则, rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}; 若RI=0,且RN=1,若st1_CD_3MSB[2]=0, rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}; 否则,若st=1, rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}+1;若st1_CD_3MSB[2]=1,且st1_CD_3MSB[1]=1, rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}+1;否则, rounding_result_CD_tmp2<={CD_added[1:23],st1_CD_3MSB[1]}; 若RI=0,且RN=0, rounding_result_CD_tmp2<={CD_added[1:23],st1_CD_3MSB[1]}; 若rounding_result_CD_tmp1的最高位为1且CD_added的最高位为0,或者CD_added的最高位为1时,选取rounding_result_CD_tmp1作为C×D的最终结果,C×D的指数修正单元(23)中不需要1比特的修正,否则选取rounding_result_CD_tmp2作为C×D的最终结果,C×D的指数修正单元(23)中需要1比特的修正。
本发明采用三级流水线实现,用VerilogHDL实现,通过验证后用0.18微米标准单元库进行电路综合。对综合结果进行时序分析,结果显示最大延时为2.89纳秒。用SPEC 2000评估显示,采用本发明后,相比普通的乘加单元,能够获得约20%的性能提升。



图1是参考文献1Floating-Point Multiply-Add-Fused with Reduced Latency中介绍的一种已有的乘加单元的结构框图; 图2是本发明的三级流水线实现的单精度并行浮点乘加单元的结构框图; 图3a是exp_CD-exp_A≤-51且sign_A≠sign_B时,A相对C×D移位对齐后在数据通道中摆放的示意图; 图3b是exp_CD-exp_A≤-51且sign_A=sign_B时,A相对C×D移位对齐后在数据通道中摆放的示意图; 图3c是-27>exp_CD-exp_A>-51时,A相对C×D移位对齐后在数据通道中摆放的示意图; 图3d是23≥exp_CD-exp_A≥-27时,A相对C×D移位对齐后在数据通道中摆放的示意图; 图3e是exp_CD-exp_A>23时,A相对C×D移位对齐后在数据通道中摆放的示意图; 图4是乘法压缩树具体实现的框图,这一压缩树由11个49比特的CSA组成。

具体实施例方式 下面结合附图和具体实施方式
对本发明作进一步的详细描述。
本发明采用三级流水线实现,用VerilogHDL实现,通过验证后用0.18微米标准单元库进行电路综合。
本发明的单精度并行浮点单元按时序划分为了三个流水节拍,下面参照图2,对整个工作过程进行说明。在本实施例中,仍以A+B+C×D表示一个并行乘加操作。且这里B小于等于A,这是由编译器预先处理过的。
第一级流水线A、B的移位对齐和C×D的波斯编码、部分积压缩。
基4的波茨编码器3对C的尾数进行编码,然后将编码的结果与D的尾数相乘得到13个部分积,编码后的13个部分积的被送入3:2的进位保存(CSA)压缩树9中,CSA压缩树的构造分别在图4中做了详细的介绍,图4中每一个单元模块的输入x、y、z为3个要被压缩的49比特的数,输出S、C分别为压缩后的49比特的和字节和进位字节,其逻辑关系为 S=x^y^z, C=((x&y)|(x&z)|(y&z))<<1, 这里^、&和|分别表示按位异或、按位与和按位或操作,<<表示向右移位。
图4的输入in1~in13为波茨编码后得到的13个部分积,输出为压缩后得到的和、进位字节,也就是图2中9的输出sum_CD和carry_CD。整个压缩树由11个49比特的CSA构成,将13个部分积压缩为两个,需要5级的CSA树。
A、B的移位对齐、取反与C×D的波斯编码、部分积压缩并行执行。若A或B的符号与C×D的符号不同,则需要对其求补。求一个数的补数的方法为取反后加一。求补所需的加1可利用3:2 CSA进位字节最低位上的空位来实现。Ainv表示将A的尾数按位对齐并取反(如果A的符号位与B×C的符号位相同则不需取反)的输出。
在普通的乘加单元(这里以A+C×D表示一个普通的乘加操作)中,对A移位对齐的方法通常为将其从C×D的最高位左侧26比特的位置开始存放,然后根据指数差向右进行移位。在A的最初存放位置和C×D的最高位之间有两个空位,目的是在A远大于C×D时确保能够正确的舍入。在EMAF中,有两个加数,必须采用新的移位对齐策略,本发明中根据A、C、D的指数差,分五种情况,分别采用不同的移位对齐策略,这五种情况的划分方法如下 1)exp_CD-exp_A≤-51且sign_A≠sign_B 2)exp_CD-exp_A≤-51且sign_A=sign_B 3)-27>exp_CD-exp_A>-51 4)23≥exp_CD-exp_A≥-27 5)exp_CD-exp_A>23 其中,sign_A、sign_B、sign_C和sign_D分别是操作数A、B、C和D的符号,exp_A、exp_B、exp_C和exp_D分别是操作数A、B、C和D的指数,根据IEEE 754标准,单精度浮点数的符号为其最高位,指数为第2位到第8位。
各种情况下的数据通道,以及A移位对齐后相对于C×D在数据通道中的摆放情况如图3所示。图3中没有给出B在数据通道的摆放,这是因为B对数据通道的形式不产生影响,而仅仅是先将其从数据通道的最高位开始存放,然后根据其与C×D的指数差,相对C×D进行移位。
exp_CD-exp_A≤-51且sign_A≠sign_B时,数据通道的构成如图3(a)所示,A远远大于C×D,将A从74比特的数据通道的最高位开始摆放,C×D的高24比特置于74比特数据通道的低24位上,而其低24比特置于数据通道之外。若B与A的指数差小于等于24,则B移位对齐后,其最低位将在C×D最高位的左边,C×D将完全不影响最终结果,除了舍入;若B与A的指数差大于24,则B移位对齐后,其最高位将在A最低位的右边,B和C×D都将不影响最终A+B+C×D的结果。总结上述两种情况可以发现,B和C×D在这种情况下移出数据通道的部分对最终A+B+C×D的结果都没有影响,也就不需要考虑了。
exp_CD-exp_A≤-51且sign_A=sign_B时,数据通道的构成如图3(b)所示,将A从数据通道的第二位开始摆放,这是为了防止最终A+B+C×D的结果溢出数据通道,其它与前一种情况类似。
-27>exp_CD-exp_A>-51时,数据通道的构成如图3(c)所示,C×D在数据通道中的摆放与前两种情况相同,移位前将A置于74比特数据通道的最高24比特上,然后根据A和C×D的指数差进行移位,由于其指数差在-51到-27之间,移位后A的最低位在C×D最高位的左边。当B的移位量大于50时,B和C×D都有一部分在数据通道之外,但是此时移位后的B和C×D都在A的最低位的右边,不影响最终A+B+C×D的结果,可见不需要同时考虑B和C×D移出数据通道外的部分。注意此时C×D压缩后的两个部分积的低24比特可能有进位产生,这个进位是需要考虑的。
23≥exp_CD-exp_A≥-27时,数据通道的构成如图3(d)所示,C×D放于数据通道的低48比特上,移位前将A置于74比特数据通道的最高24比特上,然后根据A和C×D的指数差进行移位,由于其指数差在-27到23之间,移位后A可能在数据通道的任意位置,但是不会移出数据通道。
exp_CD-exp_A>23时,数据通道的构成如图3(e)所示,C×D放于数据通道的高48比特上,移位前将A置于74比特数据通道的最高24比特上,然后根据A和C×D的指数差进行移位,由于其指数差大于23,移位后A可能在数据通道第25比特右边的任意位置,甚至会移出数据通道。当A被移出数据通道时,其最高位在C×D最低位的右边,由于B小于等于A,此时B也远小于C×D,A和B都将不影响最终结果。
总结上述5中情况可发现 1)A永远不会有效的移出数据通道,也就是说,当A移出数据通道时(仅在图3(e)所示的情况下有可能),它将不影响最终A+B+C×D的结果,所以A的求补将被大大简化sign_A≠sign_Csign_D(此时sub_A=1)时在数据通道的最低位加1即可,这里表示异或。
2)B在各种情况下都有可能移出数据通道,只有在sign_B≠sign_Csign_D(此时sub_B=1),且B移出数据通道的全为0(此时st1_B=0)时,需要在数据通道的最低位加1完成B的求补。
3)移位后的B和C×D可能会同时有一部分在数据通道之外,但是这时B和C×D都对数据通道没有影响,故不用考虑B和C×D同时在数据通道之外的部分相加后会不会有进位产生的问题。
4)-27>exp_CD-exp_A>-51时,C×D压缩后的两个部分积的低24比特可能有进位产生,这个进位是需要考虑的。
对A和B求补的加1由图2的7部件完成,由于有两个加1操作,这里引入了一个3:2CSA,A求补所需的加1作为CSA的一个输入,而B求补所需的加1利用CSA输出的进位字节的最低位空位完成。由于乘法的编码和部分积压缩的延时大于A和B的移位对齐,这一CSA不会导致关键路径的加大。, -27>exp_CD-exp_A>-51时,C×D压缩后的两个部分积的低24比特的进位会对最终结果产生影响,将这一进位加入到数据通道的方法为将st1_CD_3MSB
置入图2中4:2 CSA进位字节的最低位上,其中st1_CD_3MSB为C×D压缩后的两个部分积sum_CD、carry_CD的低24位相加后的25比特结果的最高三位。
第二级流水线A、B移位对齐后的结果和C×D的部分积压缩后的结果经4:2 CSA压缩后。进行前导零预测、符号预测、半加运算以及规格化移位。
在上一级流水线中已经得到了A、B移位对齐的结果sum_AB、carry_AB(图2里部件7的输出)和C×D压缩后的两个部分积sum_CD、carry_CD,这里首先用一4:2 CSA将这四个输入压缩为两个,分别记为sum和carry,然后将sum和carry输入到前导零预测单元13中,计算前导零个数(记为LZN)。
如果下面直接对sum和carry进行规格化移位,再相加,若相加结果为负,还需要对其求补,增加了延时。避免这一延时的办法是在前导零预测的同时判断sum+carry的符号,若sum+carry<0,则选择sum和carry的补数表示进行后续的处理,如规格化移位、最终加和舍入等。这里求sum和carry的补数时所需的加1是利用半加器15和16的进位字节的最低位空位实现的。
74比特的移位器19根据13中计算出的LZN对选择器18的输出进行向右移位,其输出结果记为sumnor、carrynor。
第三级流水线利用第二级流水线输出的sumnor、carrynor完成最终加法和舍入,计算A+B+C×D的指数。同时根据第一级流水线的输出计算C×D的尾数和指数。
在22中,首先将sumnor和carrynor相加,结果记为ABCD_added,然后根据舍入模式分别将第25位和第26位作为舍入位时的结果,分别记为rounding_result_tmp1和rounding_result_tmp2,若rounding_result_tmp1的最高位为1且ABCD_added的最高位为0,或者ABCD_added的最高位为1时,选取rounding_result_tmp1作为最终结果,否则选取rounding_result_tmp2作为最终结果。
21中根据1中计算出的数据通道的临时指数和13中计算出的规格化移位量计算A+B+C×D的指数,然后根据22的运算结果进行修正若rounding_result_tmp2被选为最终结果,将指数减1。
24计算C×D的尾数,方法与22中计算A+B+C×D的尾数的方法类似,同样23中要根据24的计算结果对C×D的指数进行修正。
权利要求
1.一种并行的浮点乘加单元,实现形式为A+B+(C×D)的乘加操作,A≥B,其特征在于,该浮点乘加单元含有三级流水,吞吐量为每周期一条指令,且同时能够产生C×D的结果,该浮点乘加单元含有
第一级流水线由指数和符号处理单元(1)第一个74比特移位对齐器(2)、第二个74比特移位对齐器(3)、粘滞位计算器(4)、第一个按位取反器(5)、第二个按位取反器(6)、3:2的进位保存加法器CSA(7)、以4为基的波茨编码器(8)、3:2的进位保存加法器CSA组成的部分积压缩树(9)、24比特加法器(10)和选择器(11)组成;其中,
指数和符号处理单元(1),根据操作数A、B、C、D的指数和符号计算A+B+(C×D)的指数exp、C×D的指数exp_CD、是否为有效减sub、A+B+(C×D)的临时符号sign、C×D的符号sign_CD,并确定A和B相对C×D移位对齐时的移位量mv_A、mv_B,以及A和B移位对齐后是否需要按位取反sub_A、sub_B,按位取反即对每一位进行取反,也就是将0变为1,将1变为0;
exp_CD=exp_C+exp_D,
sub=sign_Asign_Csign_D,
sign=sign_CD=sign_Csign_D,
sub_A=sign_Asign_Csign_D,
sub_B=sign_Bsign_Csign_D,
其中,sign_A、sign_B、sign_C和sign_D分别是操作数A、B、C和D的符号,exp_A、exp_B、exp_C和exp_D分别是操作数A、B、C和D的指数,根据IEEE 754标准,单精度浮点数的符号为其最高位,指数为第2位到第8位;为异或操作;
exp_CD-exp_A≤-51且sign_A≠sign_B时,
exp=exp_A,
mv_A=0,
mv_B=exp-exp_B,
exp_CD-exp_A≤-51且sign_A=sign_B时,
exp=exp_A+1,
mv_A=1,
mv_B=exp-exp_B,
-27>exp_CD-exp_A>-51时,
exp=exp_CD+51,
mv_A=exp-exp_A,
mv_B=exp-exp_B,
23≥exp_CD-exp_A≥-27时,
exp=exp_CD+27,
mv_A=exp-exp_A,
mv_B=exp-exp_B,
exp_CD-exp_A>23时,
exp=exp_CD+1,
mv_A=exp-exp_A,
mv_B=exp-exp_B,
第一个74比特的移位器(2)根据指数和符号处理单元(1)中得到的mv_A值,对A的尾数man_A进行向右移位,根据IEEE 754标准,单精度浮点数的尾数为其第8位到32位,其为规格化数时在最高位补1,否则在最高位补零,非规格化数将作为0看待,移位后的输出记为align_A,
align_A=man_A□mv_A,
其中□表示右移;
第二个74比特的移位器(3)根据指数和符号处理单元(1)中得到的mv_B值,对B的尾数man_B进行向右移位,移位后的输出记为align_B,
align_B=man_B□mv_B;
粘滞位计算单元(4),根据第二个74比特的移位器(3)的移位结果和指数和符号处理单元(1)中计算的sub_B计算粘滞位st1_B,mv_B>74时,若sub_B=0且man_B移出74比特宽的数据通道的部分全为0,或者sub_B=1且man_B移出74比特宽的数据通道的部分全为1,则st1_B=0,否则st1_B=1;
第一个按位取反器(5),如果A的符号位和C×D的符号位不同,对第一个74比特的移位器(2)的输出结果align_A做按位取反操作,否则不做任何操作直接将align_A输出,第一个按位取反器(5)的输出记为inv_A;
第二个按位取反器(6),如果B的符号位和C×D的符号位不同,对第二个74比特的移位器(3)的输出结果align_B的每比特都做取反操作(也就是按位取反),否则不做任何操作直接将align_B输出,第二个按位取反器(6)的输出记为inv_B;
将第一个按位取反器(5)和第二个按位取反器(6)的输出结果inv_A和inv_B,以及指数和符号处理单元(1)中得出的sub_A一起送入3:2 CSA(7)中作一次压缩,得到sum_AB、carry_AB,其中
sum_AB=inv_A^inv_B^sub_A,
carry_AB=((inv_A&inv_B)|(inv_A&sub_A)|(inv_A&sub_A))<<1,
并将sub_B和st1_B与操作的结果放在carry_AB的最低位上,
carry_AB[73]=sub_B&st1_B,
这里^、&和|分别表示按位异或、按位与和按位或操作,<<表示向左移位;
基4的波茨编码器(8)对C的尾数进行编码,然后将编码的结果与D的尾数相乘得到13个部分积,这13个部分积的被送入3:2的进位保存CSA压缩树(9)中,3:2 CSA树即由3:2 CSA组成的树,3个输入经过一个CSA将被压缩成2个输出,若设输入为x、y、z,输出为s、c,则压缩过程可表示如下
s=x^y^z,
c=((x&y)|(x&z)|(y&z))<<1,
将5级3:2 CSA级联,形成3:2 CSA树,就能将13个部分积压缩为2个,分别记为sum_CD、carry_CD;
sum_CD和carry_CD的低24位被送到24比特的加法器(10)中,加法结果被总结成两个信息输出st1_CD和st1_CD_3MSB,其中记录加法结果的低24位是否全为零,若全为零,则st1_CD=0,否则st1_CD=1;st1_CD_3MSB记录25比特的加法结果的最高三位;选择器(11)根据指数和符号处理单元(1)中计算出的指数范围从st1_B和st1_CD中选取一个作为st1输出,
-27>exp_CD-exp_A>-51时,st1=st1_CD,其它情况下st1=st1_B;
第二级流水线由4:2 CSA(12)、74比特的前导零预测模块(13)、第一个74比特的半加器(14)、第一个74比特的半加器(15)和第一个74比特的半加器(16)、符号预测逻辑(17)、选择器(18)、74比特的移位器(19)和与门(20)组成;其中,4:2 CSA(12)相当与2个级联的3:2,将四个输入sum_AB、carry_AB、sum_CD和carry_CD压缩为两个sum和carry,其中sum_CD和carry_CD要根据指数和符号处理单元(1)中计算的指数范围进行移位后作为CSA的输入,当exp_CD-exp_A<-27时,将sum_CD和carry_CD的前24位作为输入,当23≥exp_CD-exp_A≥-27时,将sum_CD和carry_CD作为输入,其他情况下(exp_CD-exp_A>23),将sum_CD和carry_CD向左移26比特后作为输入,压缩后将10中得到的st1_CD_3MSB的最高位存放在carry的最低位上;
74比特的前导零预测模块(13),判断12的输出结果sum和carry相加时,前导零的数目,前导零数目即从最高位开始,到第一个非0位之间的位数,若sum和carry相加结果为负,则这里判断的将是前导一的数目,即从最高位到第一个非1位之间的位数,具体判断方法为通过检查某一位及其左右相邻的位确定哪一位可能是最高位,设一预测位fi,
T=sumcarry,G=sum&carry,
其中sum、carry为(13)的两个输出,
表示将sum按位取反,Ti、Gi、Zi分别表示T、G、Z的第i位,若fi=1,而fj=0(j=0,1…i-1),则前导零个数(LZN)为i;
设半加器输入为x、y,输出为s、c,则其原理可表示为
s=x^y,
c=(x&y)<<1,
第一个半加器(14)根据上述原理将4:2CSA(12)输出的sum和carry处理为输出sumHApos和carryHApos;
将sum和carry按位取反后作为半加器第二个半加器(15)的输入,输出为sumHAinv和carryHAinv,并将carryHAinv的最低位置为1;
将sumHAinv和carryHAinv按位取反后作为第三个半加器(16)的输入,输出为sumHAcom和carryHAcom,并将carryHAcom的最低位置为1,这样sumHAcom+carryHAcom就相当于sum+carry的补数形式了;
符号预测模块(17),预测方法为判断sum+carry最高位是否有进位产生,若有进位产生,则相加结果为负,将输出信号complement赋为1,否则complement=0;
选择器(18)根据符号预测的结果,从sumHApos、carryHApos和sumHAcom、carryHAcom中选择一对作为输出,其输出记为sumHA、carryHA,
complement=0时,sumHA=sumHApos,carryHA=carryHApos,
complement=1时,sumHA=sumHAcom,carryHA=carryHAcom;
74比特的移位器(19)根据前导零预测的结果,对选择器(18)的输出向左进行移位,移位量为LZN,移位后的输出记为sumnor和carrynor;
与门(20)对符号预测模块(17)的输出complement和指数和符号处理单元(1)的输出sign进行与操作,得到A+B+C×D的符号;
第三级流水线由A+B+C×D的指数计算单元(21)、A+B+C×D的最终加/舍入单元(22)、C×D的指数修正单元(23)、C×D的最终加/舍入单元(24)组成;其中,
A+B+C×D的指数计算单元(21),根据指数和符号处理单元(1)中得到的exp、74比特的前导零预测模块(13)中得到的LZN和A+B+C×D的最终加/舍入单元(22)中是否发生1位左移计算A+B+C×D的指数,若A+B+C×D的最终加/舍入单元(22)中不发生1位左移,则A+B+C×D的指数为exp-LZN,否则需要进行1比特的修正,最终A+B+C×D的指数将表示为exp-LZN-1;
在A+B+C×D的最终加/舍入单元(22)中,首先将74比特的移位器(19)的输出sumnor和carrynor相加,结果记为ABCD_added,
ABCD_added=sumHAnor+carryHAnor,
然后根据ABCD_added、选择器(11)中得到的st1和舍入模式进行舍入,舍入模式有就近舍入(RN),向正无穷舍入(RP),向负无穷舍入(RM),向零舍入(RZ),从应用的角度来看,这四种舍入模式能减少到三个RN、RI、RZ;
RZ(x)=x
这里
和x分别表示向上取整和向下取整;
对于负数,舍入模式RP可等效为RI,RM可等效为RN;对于正数,舍入模式RP可等效为RN,RM可等效为RI;
首先计算粘滞位st2,若ABCD_added的最高位为1,则st2=|abcd_added[25:74],否则st2=|abcd_added[26:74];整个的粘滞位st由st1和st2两部分组成
st=st1|st2,
然后根据st、ABCD_added和舍入模式RI、RN或RZ,计算舍入结果的两个临时值,分别记为rounding_result_tmp1和rounding_result_tmp2,rounding_result_tmp1的计算方法为RI=1时,
如果st=1或者ABCD_added[24]=1,
rounding_result_tmp1=ABCD_added
+1;
否则
rounding_result_tmp1=ABCD_added

RI=0时,若RN=1,
若ABCD_added[24]=0
rounding_result_tmp1=ABCD added

否则,st=1时,
rounding_result_tmp1=ABCD_added
+1;
ABCD_added[23]=1时,
rounding_result_tmp1=ABCD_added
+1;
否则,
rounding_result_tmp1=ABCD_added

RI=0时,若RN=0,
rounding_result_tmp1=ABCD_added

rounding_result_tmp2的计算方法如下
RI=1时,
如果st=1或者ABCD_added[25]=1,
rounding_result_tmp2=ABCD_added[1:24]+1;
否则
rounding_result_tmp2=ABCD_added[1:24];
RI=0时,若RN=1,
若ABCD_added[25]=0
rounding_result_tmp2=ABCD_added[1:24];
否则,st=1时,
rounding_result_tmp2=ABCD_added[1:24]+1;
ABCD_added[24]=1时,
rounding_result_tmp2=ABCD_added[1:24]+1;
否则,rounding_result_tmp2=ABCD_added[1:24];
RI=0时,若RN=0,
rounding_result_tmp2=ABCD_added[1:24];
最后根据ABCD_added的最高位和rounding_result_tmp1的最高位从rounding_result_tmp1和rounding_result_tmp2中选取一个作为最终A+B+C×D的尾数,并决定21中的指数是否需要1比特的修正
若rounding_result_tmp1的最高位为1且ABCD_added的最高位为0,或者ABCD_added的最高位为1时,选取rounding_result_tmp1作为最终结果,21中不需要1比特的修正,否则选取rounding_result_tmp2作为最终结果,21中需要1比特的修正;
C×D的指数修正单元(23)根据C×D的最终加/舍入单元(24)中是否进行了一位的左移判断是否需要对指数和符号处理单元(1)中输出的exp_CD进行修正后才能作为最终的C×D的指数,若C×D的最终加/舍入单元(24)中判得需要进行修正,则最终的C×D的指数为exp_CD-1,否则最终的C×D的指数为exp_CD;
在C×D的最终加/舍入单元(24)中,根据3:2的进位保存加法器CSA组成的部分积压缩树(9)中得到的sum_CD、carry_CD的高24位和(10)中得到的st1_CD、st1_CD_3MSB,计算C×D的尾数,并判定是否需要进行1比特的修正;
首先将sum_CD、carry_CD的高24位和st1_CD_3MSB的最高位相加,得到CD_added
CD_added=sum_CD
+carry_CD
+st1_CD_3MSB

然后用A+B+C×D的最终加/舍入单元(22)中类似的方法计算C×D的尾数,先计算两个临时值rounding_result_CD_tmp1和rounding_result_CD_tmp2,
rounding_result_CD_tmp1的计算方法如下
若RI=1,
若st1_CD=1或st1_CD_3MSB[1]=1,
rounding_result_CD_tmp1=CD_added+1;
否则,
rounding_result_CD_tmp1=CD_added;
若RI=0,且RN=1,
若st1_CD_3MSB[1]=0,
rounding_result_CD_tmp1=CD_added;
否则,若st=1,
rounding_result_CD_tmp1=CD_added+1;
若st1_CD_3MSB[1]=1,且CD_added[23]=1,
rounding_result_CD_tmp1=CD_added+1;
e否则
rounding_result_CD_tmp1=CD_added;
若RI=0,且RN=0,
rounding_result_CD_tmp1=CD_added;
rounding_result_CD_tmp2的计算方法如下
若RI=1,
若st1_CD=1或st1_CD_3MSB[2]=1,
rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}+1;
否则,
rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]};
若RI=0,且RN=1,
若st1_CD_3MSB[2]=0,
rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]};
否则,若st=1,
rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}+1;
若st1_CD_3MSB[2]=1,且st1_CD_3MSB[1]=1,
rounding_result_CD_tmp2={CD_added[1:23],st1_CD_3MSB[1]}+1;
否则,
rounding_result_CD_tmp2<={CD_added[1:23],st1_CD_3MSB[1]};
若RI=0,且RN=0,
rounding_result_CD_tmp2<={CD_added[1:23],st1_CD_3MSB[1]};
若rounding_result_CD_tmp1的最高位为1且CD_added的最高位为0,或者CD_added的最高位为1时,选取rounding_result_CD_tmp1作为C×D的最终结果,C×D的指数修正单元(23)中不需要1比特的修正,否则选取rounding_result_CD_tmp2作为C×D的最终结果,C×D的指数修正单元(23)中需要1比特的修正。
全文摘要
一种并行浮点乘加单元简化了类似技术,实现形式为A+B+C×D的乘加操作(A≥B),同时能够得到C×D的结果,实现时分三级流水线在第一级流水线中,对A、B进行移位对齐,同时完成C×D的波斯编码、部分积压缩;在第二级流水线中,将A、B移位对齐后的结果和C×D的部分积压缩后的结果经4∶2CSA压缩后,然后进行前导零预测、符号预测、半加运算以及规格化移位;在第三级流水线中,完成A+B+C×D最终加法和舍入,计算其指数,同时根据第一级流水线的输出计算C×D的尾数和指数。本发明的优点在于,能够实现指令级的并行能同时实行一条加法指令和一条乘法指令;还能对一些发生了数据相关的连续两条指令进行加速。
文档编号G06F9/38GK101178645SQ20071017997
公开日2008年5月14日 申请日期2007年12月20日 优先权日2007年12月20日
发明者李兆麟, 李恭琼 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1