书 · 1993-06 · 戴维·A.帕特森、约翰·L.亨尼斯

《计算机组成与设计:硬件/软件接口》

计算机与 AI书单第 28 名

一句话结论

理解计算机,就是沿着程序、指令、处理器、存储和输入输出逐层追踪:工作怎样完成,时间又花在了哪里。

值不值得读完整本?

值得读完整本的九章正文,并配合练习。它能把编程知识和硬件实现接起来,让你有根据地解释程序为什么快、为什么慢;首版的产品实例需要放回当时的技术条件中理解。

  • 先读第一、二章,建立抽象层次和性能衡量方法,再按第三至七章的顺序学习指令、算术、处理器、流水线和存储层次。
  • 第四章不要只记补码和浮点格式,要理解有限位数如何影响结果;第五、六章最好亲手画数据通路,并追踪几条指令的执行过程。
  • 第八、九章也应读完:I/O、通信和串行部分会限制整机性能,不能因为更关注CPU就跳过。
  • 不熟悉数字逻辑时先补附录B;附录A适合配合汇编练习,附录C、D及历史材料可按基础和兴趣选读,附录E可用于比较MIPS与VAX。
  • 每章至少做几道解释机制、计算性能和追踪执行过程的题。以下章节编号按英文第一版目录;出版日期采用出版社所列1993年6月,WorldCat纸本记录另标©1994。

核心观点

1. 指令集是接口,数据通路与控制把接口变成执行

程序经过翻译成为机器指令,处理器再用数据通路和控制信号完成这些指令。指令规定要实现的行为,同一种指令集可以有不同的硬件实现。

为什么:抽象让软件能够依照明确的指令规则工作,不必知道每根导线怎样连接。数据通路负责保存、运送和运算数据,控制负责在正确时刻选择操作与写入位置。作者采用的MIPS指令格式较规整,算术主要围绕寄存器进行,访存由装入和存储指令承担,这有助于简化译码和执行组织。同一指令行为既可以用单周期设计实现,也可以拆成多个周期实现,因此理解接口以后,还要比较实现的时钟周期、资源使用与控制代价。

2. 用完整工作负载衡量性能,并找出真正瓶颈

性能判断要围绕实际任务的执行时间或吞吐量展开,不能只看主频、指令数或某个部件。CPU、存储、外设和软件共同决定任务完成得有多快。

为什么:CPU执行时间可以分解为执行的指令数、平均每条指令的时钟周期数和时钟周期时间的乘积,改善一个因素可能同时恶化另一个因素。不同程序的指令组成和访存行为不同,所以评测程序必须能代表目标用途。用户等待的总时间还包含I/O等开销,CPU变快只能改善其中受到影响的部分。I/O设计还要考虑CPU介入的成本:中断能减少持续查询,DMA能让设备与内存之间的批量传输减少逐项占用CPU的需要。这些办法仍受设备、总线和存储带宽约束,最终要看完整任务是否受益。

3. 计算机算术必须正视有限表示的边界

计算机中的数由有限位串表示,整数有范围,浮点数有精度限制。理解运算结果,需要同时理解编码、运算电路和异常情况。

为什么:固定字长只能表示有限多个值,因此数学上成立的结果可能超出机器的表示范围。补码让有符号整数的加减法可以共享基本加法结构,但是否溢出仍要按有符号数的规则判断。浮点数通过指数扩大可表示的数值范围,却只有有限的有效数字,因此许多实数只能近似表示。运算过程中必须舍入,舍入误差又可能随计算顺序改变,所以把实数代数规则原封不动套到浮点运算上会出问题。

4. 流水线靠重叠提高吞吐量,相关性决定实际收益

流水线把指令执行分成阶段,让不同指令同时占用不同阶段。它主要提高连续完成指令的速率,收益取决于能否处理资源冲突、数据依赖和分支。

为什么:各条指令依次经过相似阶段时,前一条进入下一阶段,后一条就能利用空出的阶段,从而提高硬件利用率。但阶段耗时不均会限制时钟,流水寄存器也有额外开销。如果后一条指令需要前一条尚未准备好的结果,直接推进就可能得到错误答案;前递能提前送达部分结果,仍无法消除所有等待。分支还会让后续取指方向不确定,因此理想的重叠程度不能直接当作实际加速比。

5. 存储层次用局部性换取接近高速存储的体验

少量快速存储配合大量较慢存储,可以在成本、容量和速度之间取得折中。这个办法能否奏效,取决于程序的访问局部性以及未命中的代价。

为什么:程序往往会再次访问刚用过的数据,也常访问相邻位置,这分别形成时间局部性和空间局部性。缓存把近期可能需要的数据块留在较快的一层,让多数访问不必等待较慢的下一层。但未命中时必须付出查找和搬运代价,所以平均访问时间要同时考虑命中时间、未命中率与未命中惩罚。虚拟存储也采用分层和按需调入的思路,同时通过地址转换与权限机制组织进程的地址空间,不能只把它理解成扩大内存。

6. 并行性能取决于任务能否拆开,以及拆开后的协调成本

更多处理器提供更多计算资源,但程序必须暴露可同时执行的工作,才能利用这些资源。并行设计需要同时考虑执行方式、通信、同步和负载分配。

为什么:程序中的数据依赖决定哪些工作可以同时进行,不能并行的部分仍必须依次完成。对固定工作量来说,即使并行部分不断加速,串行部分也会形成总时间的下限。任务拆开后还要交换数据、等待同步,并可能争用共享总线或存储,这些开销会抵消计算收益。SIMD用统一指令控制多份数据上的运算,MIMD允许多个指令流独立推进,适合哪一种组织要看程序的工作结构。

反对意见

简化指令集可能把成本转移到别处(Douglas W. Clark、William D. Strecker)

两人在1980年的《Comments on “The Case for the Reduced Instruction Set Computer,” by Patterson and Ditzel》中反驳早期RISC论证:硬件中的复杂功能被删除后,编译器和运行时仍要完成相应工作,代码密度、缓存利用和多语言支持也可能受到影响。他们要求比较完整硬件、软件和多种应用的实际表现。这是对帕特森早期思想的回应,早于本书,并非针对教材首版的书评。

不能把整台机器的收益都归给RISC标签(Robert P. Colwell等)

Colwell等人在1985年的《Instruction Sets and Beyond: Computers, Complexity, and Controversy》中主张,真正的问题是把系统功能放在哪个实现层级。他们指出,早期比较混合了指令集、寄存器组织、编译器和其他实现差异,不能把测得的优势全部解释成指令精简的结果。这同样是本书思想背景中的技术争论,也与本书强调完整性能分析的方法形成呼应。

处理器讲得深入,整机其他方面相对不足(Ranjit Mathew)

Mathew在2009年的具名技术书评《“Computer Organization And Design”》中肯定本书的实现细节和定量方法,同时认为篇幅过于集中于微处理器,对其他计算机组成与设计问题着墨较少。他还指出,紧跟技术发展的实例容易变旧。该评论涉及后来的版本,因此只能作为对本书系列教学取向的评价,不能直接充当首版缺陷的证据。

相关推荐

导读由 AI 根据公开资料整理,没有读取原书全文,一切以原著为准。导读 Primer 首页