470 likes | 572 Views
处理器设计. — 浮点部件 王海霞 周旭 2001.6.8. 主要内容 (1). IEEE 754 标准 浮点数的表示 特殊数 舍入模式 浮点操作 例外 MIPS R4000 控制 / 状态寄存器 Godson 浮点 ALU 部件介绍. 主要内容 (2). 浮点加减 基本算法 Two-Path 算法 LOP(leading one prediction) 提前舍入算法 浮点 ALU 其他指令的实现 比较指令 定点和浮点之间的转换指令 双精度浮点和单精度浮点的转换指令 其他
E N D
处理器设计 —浮点部件 王海霞 周旭 2001.6.8
主要内容 (1) • IEEE 754标准 浮点数的表示 特殊数 舍入模式 浮点操作 例外 • MIPS R4000控制/状态寄存器 • Godson浮点ALU部件介绍
主要内容 (2) • 浮点加减 • 基本算法 • Two-Path算法 • LOP(leading one prediction) • 提前舍入算法 • 浮点ALU其他指令的实现 • 比较指令 • 定点和浮点之间的转换指令 • 双精度浮点和单精度浮点的转换指令 • 其他 • 浮点ALU各级流水寄存器的控制
浮点格式 • IEEE 754标准支持四种浮点格式: 单精度, 单精度扩展, 双精度和双精度扩展。其中单精度和双精度属于基本格式, 单精度扩展和双精度扩展属于扩展格式。 • 扩展格式 扩展格式是依赖于具体实现的。IEEE 754 标准允许实现上存在一部分冗余编码,用于特殊目的,但要保证对用户透明。在我们的系统中,目前没有提供扩展格式。所以后面只介绍基本格式。
浮点数的基本格式 • 浮点数由以下三个字段组成: 一位符号位 s;移码表示的指数 e = E + bias; 尾数 f = .b1b2 …bp-1。
指数移码值与实际值的对应关系 以单精度指数为例,单精度的指数位数是8位,可表示的移码数是0 ~ 255, IEEE 754 标准规定: • 0用于表示±0和denormalized number; • 255用于表示±∞和 NaN(Not a number), • 剩余的254个数1~254 表示规格化浮点数的指数, bias为127,所以对应的指数实际值(E):-126 ~127,即Emax =127, Emin= -126。
单精度浮点数值 单精度格式表示的浮点数值v: • 当 e = 255 并且 f ≠ 0 时,不管s的值,v是NaN • 当 e = 255 并且 f = 0 时,v = (-1)s ∞ • 当 0 < e < 255 时,v = (-1)s2e-127(1.f) • 当 e = 0 并且 f ≠ 0 时, v = (-1)s2-126(0.f) (denormalized numbers) • 当 e = 0 并且 f = 0 时, v = (-1)s0 (zero)
双精度浮点数值 双精度格式表示的浮点数值v: • 当 e = 2047 并且 f ≠ 0 时,不管s的值,v是NaN • 当 e = 2047 并且 f = 0 时,v = (-1)s ∞ • 当 0 < e < 2047 时,v = (-1)s2e-1023(1.f) • 当 e = 0 并且 f ≠ 0 时, v = (-1)s2-1022(0.f) (denormalized numbers) • 当 e = 0 并且 f = 0 时, v = (-1)s0 (zero)
NaN • NaN分为两种:signaling NaN 和 quiet NaN. • Signaling NaN(报警非数): 当变量没有初始化或者其他需要报警的情况下,出现SNaN。 一旦操作数是SNaN, 那么一定会产生invalid例外。如果没有trap并且需要一个浮点结果,那么结果为一个QNaN. • Quiet NaN(静态非数):提供数据或结果无效或不可用等判别信息。因此QNaN在经过运算部件或者格式转换时应该保持这些判别信息,并且不产生invalid例外。
Denormalized mumber • Denormalized number判别条件:e = 0 并且 f ≠ 0 • 单精度Denormalized number对应的实际值v: v = (-1)s2-126(0.f) • 无符号单精度Denormalized number 的取值范围: 2-149 ≤ v < 2-126 2-126:最小的一个规格化数, e = 1,f = 23’b0; 2-149:最小的可以表示的非规格化数,e = 0, f = {22’b0,1’b1};
浮点操作 • 算术运算: 加,减,乘,除,求平方根,求余数。 • 浮点格式转换 :单精度和双精度 • 浮点和定点格式之间的转换 • 浮点舍入到定点 • 二进制和十进制之间的转换 • 比较指令
Exception(1) • 无效(Invalid): (1)、任何对 SNaN的操作 (2)、加减法中,两个无穷大的数实际相减 +∞)- (+∞), (+∞) + ( - ∞) (3)、乘法中,0×∞ (4)、除法中,0/0或者∞/∞ (5)、求余数中,x REM y, 其中y是0或∞ (6)、求平方根中,操作数小于等于0 (7)、格式转换中,出现操作数是NaN, 无穷大,或者发 生上溢 (8)、比较中,如果操作数是无序的(NaN),而比较符 中没有是否无序项。
Exception(2) • 零做除数(Division by Zero) • 上溢(Overflow) :指的是指数上溢 • 下溢(Underflow) : 指的是指数上溢 • 不精确(Inexact ):结果需要舍入或者溢出
R4000中Control/Status Register(1) FS: FS为1时表示denormalized结果变为0。 C: 比较指令的结果,转移指令的依据。 Cause:上一条浮点操作 产生的例外(load, store, 和move 指令除外)。R4000比IEEE 754 标准增加了 E(unimplemented)位,表示有效的但目前没有实 现的操作。 Enable:浮点操作产生的例外只有在相应的Enable置位的 情况下才会被触发,否则,结果取IEEE 754 标 准定义的缺省值。只有E例外属于不可屏蔽的例 外,没有相应的Enable位。
R4000中Control/Status Register(2) Flag: 进行例外处理时,浮点例外处理程序对flag置位, 处理完毕,对flags复位。 RM: 舍入模式。
浮点加减的基本算法 • 1.00011 - 1.10001*2-3 (1)、计算指数差: 0 - (-3) = 3 (2)、对阶: 1.10001右移3位,得到0.00110001 (3)、尾数运算(补码形式): 1.00011 + 1.11001 111 0.11100 111 (4)、如果尾数运算结果为负数,需要将补码转化为原码。 (5)、Leading zero detector: 0.11100 111中有1个Leading zero (6)、规格化:将尾数和0.11100 111左移一位,指数加1。 (7)、舍入 (8)、重新规格化
Two-Path算法 • 算法改进的基础在于对各种情况的讨论:
Two-Path算法 • 基于上面的分析,我们可以将整个路径一分为二,一条是CLOSE路径,另一条是FAR路径。CLOSE路径计算指数差小于等于1的减法和两个操作数都是denormalized的加法。FAR路径执行其他情况下的运算。 • 虽然操作数是denormalized情况下,产生unimplemented例外,但是我们仍然要求硬件给出运算结果,便于软件处理,所以在浮点ALU的设计中支持denormalized operand。
Two-Path算法优点 • CLOSE路径上对阶时需要一位移位器(指数差≤1),规格化时需要全长(full-length)移位器(尾数和出现0.0x…x情况,左移位数超过1)。 • FAR Path对阶时需要full-length移位器(指数差>1),规格化时只需要一位移位器(最多左移或右移1位)。 • 因此,Two-Path算法相当于将基本算法的一个 full-length移位器转化成了一个一位移位器。由于一位移位器的逻辑比较简单,延迟很小,所以与基本算法相比,延迟降低。
其他改进措施(1) • 通过比较操作数大小,使得符号位与运算脱离,运算过程中使用无符号数。再通过交换操作数,保证尾数和运算结果始终是正数,省略了结果求补的一步。 • 采用Leading-One Prediction(LOP)(或称Leading Zero Detector)方法将数1过程与尾数加并行执行,当求和运算结束时,需要的移位数目也已经计算出来,缩小了latency。 • 先做Rounding,后做Normalization,不需要重新规格化。并且用compound adder代替原来的加法器,尾数求和的同时计算可能产生的舍入结果,缩短了舍入延迟。
其他改进措施(2) • 对于Close Path, 不必等判断条件计算出来再开始运算,而是和求指数差同时开始,仅通过分析两个操作数指数的低两位来估计操作数的大小,交换操作数。如果计算出来的结果不选择CLOSE路径, 那么再终止CLOSE;否则继续。 • 采用Pipelining技术,增加浮点部件的吞吐率。
浮点加减部件物理结构图 PENC:Priority encode, 对LOP产生的结果编码,得到移位数目。
LOP算法 • LOP(leading one prediction): 对结果规格化前需要先得到leading one position,即规格化的移位数目。一般来讲,该数一过程是在尾数和得到以后才开始的。现在将LOP提前,从操作数着手判断最后结果的leading one position. • 一般的LOP算法并不精确定位leading one position, 经常存在一位误差,最后再重新进行1位移位调整。我们采用了1997年Javier D.Bruguera and Tomas Lang提出的同时计算leading-one position和position correction的算法,减小了延迟,但该系统要求尾数和结果一定是正数。 • 因为两个denormalized数相加的情况不需要规格化,所以LOP算法只需考虑两个指数差小于等于1的操作数做减法的情况。
Leading-one Position Analysis • LOP算法也是基于对各种输入位模式的分析。 • 位模式Bit Pattern: 假定被减数和减数的第i位分别为ai, bi ,如果ai=1,bi=0,那么用1表示该位;如果ai=0 , bi=1 ,那么用 表示;如果ai = bi,那么用0表示。对各位的分析就构成了Bit Pattern.
Leading-One Position • 实质:将确定leading one 位置的问题转化为确定各种可能的子串模式的位置问题。
Concurrent Position Correction • 首先用ni定义修正子串模式0 • 其次,通过detection tree判定Bit Pattern 是否具有 zjpzkn…形式,其中j ≥0, k>0。
Detection tree • 首先定义几个状态:
Detection tree • 然后,定义相邻两个状态组合后的值,并推导出新值的逻辑表达式。 Y = Yl + ZlYr + PlNr Z = ZlZr P = ZlPr + PlZr N = ZlNr + Nl
舍入逻辑 • 如果对原码表示的浮点数X=x0.x1x2…xsxs+1xs+2… xn舍入,保留小数点后s位,我们定义L(least significance bit)= xs,g(ground) = xs+1,s(sticky) = xs+2 +xs+3+… +xn。舍入逻辑如下: • Round to nearest even: up = g(L+s) • Round to zero: up = 0 • Round to positive infinity: up = !sign (正数) • Round to negative infinity: up = sign(负数)
对阶移位保留位数 • 对阶移出位保留3位就可以支持IEEE 754标准给出的四种舍入模式。 • 加法 如果两个加数都是denormalized,那么不用对阶,不存在移出位保留问题。否则,得到的尾数和只有两种形式:1.xx…x和10.xx…x,根据舍入逻辑,预留两位(g:移出位中最高位,s:除最高位以外的其他移出位是否含有1)。 • 减法 如果两个操作数的指数差大于1,减法得到的尾数和只有两种形式:1.xx…x和0.1xx…x,对于0.1xx…x形式,规格化需要移入一位,所以,预留三位(两位存放移出位最高两位,一位保存其他移出位是否含有1 )就可以满足条件。 否则,指数差小于等于1,最多移出一位,预留一位就可以。
提前舍入逻辑 符号说明: cout; 尾数和的向前进位。 L-1, L:尾数和的最低两位。 g(ground), r(round), s(sticky):预留的三位。 sp1: 选择结果X+Y+1 • Round to nearest even • 加法:
提前舍入逻辑 • 减法
FAR 路径求和电路的实现 • FAR路径上除了计算X+Y, X+Y+1以外, 还要计算X+Y+2. 采用Half-adder加Compound Adder的方法, 可以避免增加一个加法器. • 方法: 如果X+Y的最低位(半加器的低位输出)是0, 那么只计算X+Y+1和X+Y+2即可, 因为X+Y可以通过将X+Y+1的低位置0实现; 如果X+Y的最低位(半加器的低位输出)是1, 那么只计算X+Y和X+Y+1即可, 因为X+Y+2可以通过将X+Y+1的低位置1实现.