《计算机组成与设计》(三)——计算机的算数运算

《计算机组成与设计》(三)——计算机的算数运算

摘要:个人计算机组成学习笔记

0x01 笔记部分

本章主要围绕着乘法除法以及浮点运算在计算机中的硬件实现来展开的,包括各操作的硬件结构寄存器使用、一些实现过程中的tips等等,结尾部分还提到了子字并行技术。

加法和减法

这里主要需要注意的点是溢出的条件,参看下面这个表格:

这边注意在本书的附录B有算术逻辑单元(ALU)的硬件实现。

饱和(saturating)操作出现在结果溢出时,将结果设置为最大的正数或者最小的负数。

下面开始就是乘法和除法了,在学习这两个操作的硬件实现时一定要注意的是寄存器的位数的大小,不然会产生莫名其妙的感觉。

乘法

直接看流程图配合着书中的第一版乘法器就可理解了:

而后再来看看升级精简版的硬件实现图:

以上的算法对于有符号乘法而言也是成立的,只要在计算时单独提出符号位而后进行计算。

然后本节提到的更快的乘法图示如下,事实上本人也是一知半解,先放着吧。基本思想是为乘数的每一位提供一个32位的加法器:一个用来输入被乘数和一乘数位相与的结果,另一个是上一个加法器的输出。

除法

同样,结合着硬件实现图和流程图来看就能很好的理解了:

然后再来看看升级精简版的硬件实现图:

如果注意观察乘法和除法的硬件实现图,会发现乘法和除法的硬件实现结构是一样的。这种共用硬件的方案允许MIPS提供一对单独的32位寄存器来支持乘法和除法。

有符号的除法只需要记住一点:如果除数和被除数的符号相异那么商为负。

SRT除法算法为一种更为快速的除法算法,其通过查表的方法来尝试猜测每步几个商位,其中查找表基于被除数和余数的高位部分来进行。

上面最开头描述的算法为恢复除法,还存在一种更快的不恢复除法,它只是在下一步简单地将被除数加到移位后的余数上。

浮点运算

规格化(normalized)数指的是没有前导零且小数点左边只有一位整数的科学计数法表示的数。如:1.0*10^9

单精度(single precision)浮点数格式

双精度浮点数格式

注意IEEE 754标准隐藏了前导位1,故除0外其格式如下:

可以参看IEEE 754的编码表:

带偏阶的表示法,是为了直观的去显示正数与负数的大小,其表示方法如下:

在这种表示法下,计算时要将指数减去偏阶的数作为真正的指数。

上溢:指数太大而不能在指数域表示

下溢:指数太小而不能在指数域表示

浮点加法

同样,参考流程图以及硬件图就可以理解:

浮点乘法

这个就更好理解了,直接看流程框图即可:

MIPS中是有单独的浮点寄存器的,用$f0-$fn表示。

IEEE 754 标准中在中间计算过程中右边总是会多保留两位,分别称为保护位舍入位

子字并行

前提:通过在128位内对进位链进行分割,处理器可以同时对16个8位、8个16位、4个32位或2个64位同时进行并行操作,对加法器进行这样的操作开销是很小的。这种在一个宽字内部进行的并行操作称为子字并行

可以看一个通过自己并行技术加速矩阵运算的例子,分别贴一下源码以及非并行和并行操作的汇编代码。

非并行:

谬误与陷阱

1)右移指令不能用来代替除法;

2)并行计算不适用于浮点数的计算。这是因为浮点数的非精确,不同的相加顺序会导致结果的不同;

0x02 总结

这本计组因为有CSAPP的功底在读起来还是很快的,但说实话读快了容易囫囵吞枣,接下来几天我打算把前三张的习题过一过,策略是一眼能够看出思路的直接跳过,主要看那些有查缺补漏的习题。

回到本章来,本章讲的东西其实说实话不算太难(可能因为很多内容在CSAPP里面都有接触过,但自己还是有一些地方不太明白而且没有深究的,比方说那两个更快的乘法、除法的实现,比方说子字并行技术的细节、比方说那些具体的MIPS的指令(我觉得这本书重点不应该放在MIPS指令上,看懂就行。总而言之,一步一步来吧,后几天就停下来稍微消化下。


评论