浮点数的加减乘除运算及流水线

浮点数的加减运算

设两个浮点数如下:
x = 2 E x ∗ M x y = 2 E y ∗ M y E 表示阶码, M 表示尾数 x=2^{E_x}*M_x\\y=2^{E_y}*M_y\\ E表示阶码,M表示尾数\\ x=2ExMxy=2EyMyE表示阶码,M表示尾数
两个浮点数的加减运算规则是
x ± y = ( M x ∗ 2 E x − E y ± M y ) ∗ 2 E y E x ≤ E y x\pm y=(M_x*2^{E_x-E_y}\pm M_y)*2^{E_y}\\E_x\leq E_y x±y=(Mx2ExEy±My)2EyExEy

浮点数加减运算过程

  1. 0操作数的检查

对于0操作数的检查,是很必要的,浮点加减运算过程比定点加减过程复杂,如果实现判断两个操作数中有了一个零,后面的操作步骤就没必要进行了,可以节省操作时间。

  1. 比较阶码大小并完成对阶

两个浮点数的加减运算,首先要看两个数的阶码是否相同,也就是看两个数的小数点位置是否对齐,如果相同就可以直接进行尾数加减运算,如果不同就要对阶以使小数点对齐。

对阶过程中一定要令小阶向大阶对齐,因为小阶变为大阶的时候,需要右移,也就是移出尾数,而如果相反,大阶向小阶对齐,则需要左移即将高位移出,这样做的误差会远远大于低位移出,因此要采用小阶向大阶的对阶方式。

对阶过程如下:

先求两数阶码之差, Δ E = E x − E y \Delta E=E_x-E_y ΔE=ExEy,如果其等于零表示二者阶码相等,如果小于零表示x的阶码小于y的阶码,如果大于零表示x的阶码大于y的阶码,需要小的阶码向大的阶码靠拢,即小阶的尾数右移,每右移一位阶码加一,重复阶码差值的绝对值次

  1. 尾数求和

方法与定点加减运算相同

  1. 结果规格化

当运算结果的尾数不为0时,要求尾数真值的绝对值大于等于1/2,将运算结果左移成为左规,右移成为右规。

当符号位为单符号法表示时,

如果尾数用原码表示,不论正负第一数值位为1才是规格化数

对于补码反码来说,需要符号位与第一数值位不同才是规格化数

有一个-0.5的特例,需要求出其真值判断是否为规格化数

如果尾数用双符号位即变形补码来表示,经过加减运算后会有六种情况出现,

  • 00.1xxxx
  • 11.0xxxx

上面两种情况是已经规格化的数字,即符号位都为0或者1,第一数值位与符号位不同

  • 11.1xxxx
  • 00.0xxxx

上面两种情况需要左规,阶码减一

  • 01.xxxxx
  • 10.xxxx

上面两种情况发生溢出,但是对于双符号表示,并非真正的溢出,需要对其进行右规,阶码加一,右规最多有一次,左规可以有多次.

  1. 舍入处理

在对阶或右规时,尾数要向右移,被右移的尾数的低位部分会被丢掉,造成一定的误差,为了减小误差,需要进行舍入处理

  • 0舍1入法

即如果右移时被丢掉的是0则舍去,是1则将尾数的末尾加1

  • 恒置1法

即只要有数位被移掉,就在末尾的末尾恒置1

IEEE754也给出了舍入方法

  • 就近舍入

相当于四舍五入,当多余的数位大于1000…时尾数有效位加1,当小于01111…时直接舍去,当等于1000…时,尾数最低有效位为0的话不变,为1的话加1

  • 朝正无穷舍入

恒向数轴正方向舍入

  • 朝负无穷舍入

恒向数轴负方向舍入

  • 朝0舍入

直接舍去

  1. 溢出分析

阶码正上溢|X|->正无穷

阶码负下溢|X|->0

浮点数的溢出是以其阶码溢出表现出来的

浮点数的乘除运算

通常分为4步完成

  1. 0操作数检查
  2. 阶码相加减
  3. 尾数相乘除
  4. 结果规格化及舍入处理

运算过程

  1. 0操作数与加减运算相同
  2. 阶码相加减

阶码是补码时使用补码运算,是移码时使用移码运算
[ x + y ] 补 = [ x ] 补 + [ y ] 补 [ x − y ] 补 = [ x ] 补 + [ − y ] 补 [ x + y ] 移 = [ x ] 移 + [ y ] 补 [ x − y ] 移 = [ x ] 移 + [ − y ] 补 [x+y]_补=[x]_补+[y]_补\\ [x-y]_补=[x]_补+[-y]_补\\ [x+y]_移=[x]_移+[y]_补\\ [x-y]_移=[x]_移+[-y]_补\\ [x+y]=[x]+[y][xy]=[x]+[y][x+y]=[x]+[y][xy]=[x]+[y]

  1. 尾数相乘除

定点运算器完成

对于尾数运算中超出尾数位的数据的处理

  • 截断法

无条件丢弃

  • 舍入处理

运算过程中保留右移移出的位中若干高位的值,最后再按照某种规则用这些位上的值修正尾数

浮点运算流水线

计算机中把一个重复的过程分解为若干个子过程,每个子过程与其他子过程并行进行,由于这种工作方式与工厂中的生产流水线十分相似,因此成为流水线技术

从本质上讲,流水线技术是一种时间并行技术

流水线中的每个子过程及其功能部件成为流水线的级或者段,段与段之间相互连接形成流水线

假定作业T被分为K个子任务,各个子任务之间有一定的优先关系,如果i<j则必须在Ti完成之后Tj才能开始工作,具有这种线性优先关系的流水线称为线性流水线。

对于线性流水线子任务的划分原则,原则上要求各个阶段的处理时间都相同,如果某一阶段的处理时间比较长,势必造成其他阶段的空转等待

流水线的加速比

C k = 非流水时所需周期数 流水线时所需周期数 = T L T K = n ⋅ k k + ( n − 1 ) C_k=\frac{非流水时所需周期数}{流水线时所需周期数}=\frac{T_L}{T_K}=\frac{n·k}{k+(n-1)} Ck=流水线时所需周期数非流水时所需周期数=TKTL=k+(n1)nk

当n>>k时,可以近似有Ck=k

理论上k级流水线处理任务可以提高k倍的速度,但是实际上由于存储冲突,数据相关,理想加速比不一定能达到

也可以使用:
C k = 非流水一个时钟周期时间 流水线一个时钟周期时间 C_k=\frac{非流水一个时钟周期时间}{流水线一个时钟周期时间} Ck=流水线一个时钟周期时间非流水一个时钟周期时间

猜你喜欢

转载自blog.csdn.net/weixin_67340472/article/details/129913462