前言

编写本书的目的

从本书第一版开始,到现在已经是第五个版本了,我们的目标一直没有改变,就是要阐述那些为未来技术发展奠定基础的基本原理。计算机体系结构的各种发展机遇总是让我们激情澎湃,不曾有丝毫消退。关于这一领域,我们一直重复在第一版中做出的论述:“这个学科不是令人昏昏欲睡、百无一用的纸版模型。绝对不是!这是一个受到人们热切关注的学科,需要在市场竞争力与成本-效能-能耗之间做好权衡,从事这个学科既可能导致可怕的失败,也可能带来显赫的成功。”

在编写第一版时,我们的主要目的是希望改变人们原来学习和研究计算机体系结构的方式。我们感到这一目标现在依然正确、依然重要。这是一个日新月异的领域,在对其进行研究时,必须采用真实计算机上的测量数据和真实示例,而不是去研究一大堆从来都不需要实现的定义和设计。我们热烈欢迎过去与我们结伴而行的老读者,同样欢迎现在刚刚加入我们的新朋友。无论对谁,我们都承诺将采用同样的量化方法对真实系统进行分析。

和前几版一样,我们在编写这个新版本时,力争使其既适用于学习高等计算机体系结构与设计课程的学生,也适用于专业的工程师和设计师。与第一版类似,这个版本对新平台(个人移动设备和仓库级计算机)和新体系结构(多核和GPU)进行了重点介绍。这一版还秉承了前几版的做法,希望能够通过强调成本、性能、能耗之间的平衡和优秀的工程设计,揭去计算机体系结构的神秘面纱。我们相信这一领域正在日趋成熟,发展成为一门具备严格量化基础的经典理工学科。

关于第五版

我们曾经说过,《计算机体系结构:量化研究方法》(第4版)可能因为转向讨论多核芯片而成为自第1版以来的最重要版本。但我们收到了这样的反馈意见:第4版已经失去了第1版重点突出的优点,它一视同仁地讨论所有内容,不分重点和场合。我们非常确信,对于第5版不会再有这样的说法了。 我们相信最令人激动的地方在于计算规模的两个极端:以移动电话和平板电脑之类的个人移动设备(PMD)为客户端,以提供云计算的仓库级计算机为服务器。(具有敏锐观察力的读者可能已经看到本书封面上对云计算的寓意。)尽管这两个极端的规模不同,但它们在成本、性能和能效方面的共同主题给我们留下了深刻印象。因此,每一章的讨论背景都是PMD和仓库级计算机的计算,第6章是全新的一章,专门讨论仓库级计算机。

另一条主线是讨论了并行的所有不同形式。我们首先在第1章指出了两种应用级别的并行,一个是数据级并行(DLP),它的出现是因为有许多数据项允许同时对其进行操作;另一个是任务级并行(TLP),它的出现是因为创建了一些可以在很大程度上并行、独立执行的工作任务。随后我们解释四种利用DLP和TLP的体系结构样式,分别是:第3章介绍的指令级并行(ILP);第4章介绍的向量体系结构和图形处理器(GPU),这一章是第5版新增加的内容;第5章介绍的线程级并行;第6章通过仓库级计算机介绍的需求级并行(RLP),这一章也是第5版中新增加的。在本书中,我们将存储器层次结构的内容提前到第2章,并将存储系统章节移到附录D中。我们对第4章、第6章的内容尤为感到自豪,第4章对GPU的解读是目前最详尽、最清晰的,第6章首次公布了Google仓库级计算机的最新细节。

和过去一样,本书的前三个附录提供了有关MIPS指令系统、存储器层次结构和流水线的基础知识,如果读者没有读过《计算机组织与设计》之类的书籍,可用作参考。为了在降低成本的同时还能提供一些读者感兴趣的补充材料,我们在网络上提供了另外9个附录,网址为:http://booksite.mkp.com/9780123838728。这些附录的页数之和比本书的页数还要多!

这一版继续发扬“以真实示例演示概念”的传统,并增加了全新的“融会贯通”部分。这一版中的“融会贯通”内容包括以下各服务器的流水线组成与存储器层次结构:ARM Cortex A8处理器、Intel core i7处理器、NVIDIA GTX-280和GTX-480 GPU,还有Google仓库级计算机。

主题的选择与组织

和以前一样,我们在选择主题时采用了一种保守的方法,毕竟这个领域中值得讨论的思想实在太多了,不可能在这样一本主要讨论基本原理的书中全部涵盖。我们没有面面倶到地对读者可能遇到的所有体系结构都进行全面概述,而是将重点放在那些在任何新计算机中都可能涉及的核心概念上。根据我们一贯坚持的选择标准,本书讨论的思想都是经过深入研究和成功应用,足以采用量化方法对其进行讨论的内容。

我们一直重点关注的内容都是无法以同等形式从其他资源获取的资料,因此我们将继续尽可能讨论比较高级的内容。事实上,在本书介绍的系统中,有一些就无法在文献中找到相关描述。如果读者需要了解更为基础的计算机体系结构知识,可以阅读《计算机组成与设计:硬件/软件接口》(Computer Organization and Design: The Hardware/Software Interface)一书。

内容概述

这一版对第1章进行了补充,其中包括能耗、静态功耗、动态功耗、集成电路成本、可靠性和可用性的计算公式。(封二上也列出了这些公式。)在本书后续部分读者能够一直应用这些内容。除了计算机设计与性能测量方面的经典量化原理之外,还对PIAT一节进行了升级,采用了新的SPECPower基准测试。

我们认为,与1990年相比,指令集体系结构扮演的角色有所弱化,所以我们把这一部分内容移到附录A中。它仍然采用MIPS64体系结构。(为便于快速查看,封三对MIPS ISA进行了汇总。)附录K中包括10种RISC体系结构、80x86、DEC VAX和IBM 360/370,献给ISA爱好者们。

随后,我们在第2章开始讨论存储器层次结构,这是因为在此很容易应用成本、性能、功耗原理,而且存储器是其余各章的关键资源。和上一版一样,附录B对缓存原理进行了介绍性概述,供读者需要时查阅。第2章讨论了对缓存的10种高级优化。这一章包括虚拟机,它在提供保护、软硬件管理方面均有优势,而且在云计算中也扮演着重要角色。除了介绍SRAM和DRAM技术之外,这一章还包括了闪存的相关材料。PIAT示例选择了PMD中使用的ARM Cortex A8和服务器中使用的Intel Core i7。

第3章主要研究高性能处理器中的指令级并行技术,包括超标量执行、分支预测、推理、动态调度和多线程。前面曾经提到,附录C是关于流水线的一个综述,以备不时之需。第3章还研究了ILP的局限性。和第2章一样,PIAT示例还是ARM Cortex A8和Intel Core i7。第三版包括大量有关Itanium和VLIW的材料,现在这些材料被放在附录H中,这表明了我们的观点:这种体系结构未能达到过去所宣称的效果。

多媒体应用程序(比如游戏和视频处理)的重要性在提高,因此,那些采用数据级并行的体系结构也变得更为重要。具体来说,越来越多的人在关注利用图形处理器(GPU)执行的运算,但很少有设计师了解GPU到底是如何工作的。我们决定编写新的一章,主要就是为了揭开这种新型计算机体系结构的面纱。第4章开始介绍向量体系结构,对多媒体SIMD指令集扩展和GPU的解释就是以此为基础的。(附录G对向量体系结构进行了更深入的讨论。)GPU一节是本书最难编写的部分,因为需要多次重复才能给出一个既精确又容易理解的描述。一个重大挑战就是术语。我们决定使用我们自己的术语,然后给出这些术语与NVIDIA官方术语之间的对应关系。(在封底内页中列有这张表。)这一章介绍了Roofline性能模型,然后用它来对比Intel Core i7、NVIDIA GTX 280和GTX 480 GPU。这一章还介绍了供PMD使用的Tegra 2 GPU。

第5章介绍多核处理器,探讨了对称、分布式存储器体系结构,对组织原理和性能都进行了研究。接下来是有关同步和存储器一致性模型的主题,所采用的示例是Intel Core i7。对片上互连网络感兴趣的读者可以阅读附录F,对更大规模多处理器和科学应用感兴趣的读者可以阅读附录I。

前面曾经提到,第6章介绍了计算机体系结构中的最新主题——仓库级计算机(WCS, Warehouse-Scale Computer)。依靠Amazon Web服务部门和Google工程师的帮助,本章整合了有关WSC设计、成本与性能的详细资料,了解这些内容的设计师寥寥无几。在开始描述WSC的体系结构和物理实现(及成本)之前,首先介绍了MapReduce编程模型。从成本的角度可以解释云计算的出现,在云中使用WSC进行计算的成本要低于在本地数据中心的计算成本。PIAT实例是对Google WSC的描述,有些内容是首次发布。

接下来就是附录A到附录L。附录A介绍ISA的原理,包括MIPS64,附录K介绍Alpha、MIPS、PowerPC和SPARC的64位版本及其多媒体扩展。其中还包括一些经典体系结构(80x86、VAX和IBM 360/370)和流行的嵌入指令集(ARM、Thumb、SuperH、MIPS16和Mitsubishi M32R)。附录H与其相关,介绍了VLIW ISA的体系结构和编译器。

前面曾经提到,附录B和附录C是缓存与流水线基本概念的教程。建议对缓存不够熟悉的读者在阅读第2章之前先阅读附录B,新接触流水线的读者在阅读第3章之前先阅读附录C。

附录D——存储系统,包括:对可靠性和可用性的延伸讨论,以RAID 6方案介绍为主体的RAID教程,非常珍贵的真实系统故障统计信息。接下来介绍了排队理论和I/O性能基准测试。我们评估了一个真实集群(Internet Archive)的成本、性能和可靠性。“融会贯通”部分以NetApp FAS6000文件管理程序为例。

附录E由Thomas M. Conte撰写,它将嵌入式系统的相关材料集中在一起。

附录F讨论互连网络,由Timothy M. Pinkston和Joséć Duato进行了修订。附录G最初由Krste Asanović撰写,其中详细介绍了向量处理器。我们认为,就我们所知,这两个附录是其各自关主题的最好材料。

附录H详细介绍了VLIW和EPIC,也就是Itanium采用的体系结构。

附录I详细介绍了用于大规模共享存储器多处理的并行处理应用和一致性协议。附录J由David Goldberg撰写,详细介绍了计算机算法。

附录L将第三版中每一章的“历史回顾与参考”部分集中在一起。对于各章介绍的思想,它尽量给予一个恰当的评价,并让读者了解这些创造性思想背后的历史。我们希望以此来展现人类在计算机设计方面的戏剧性发展过程。这个附录还提供了一些参考文献,主修体系结构的学生可能会非常喜欢它们。这些部分提到了本领域的一些经典论文,如果时间允许,建议读者阅读这些论文。直接听原创者讲述他们的思想,在深受教育的同时,也是一种享受。“历史回顾”是以前版本中最受欢迎的章节之一。

内容导读

在阅读这些章节和附录时,除了所有读者都应当从第1章开始阅读之外,并不存在什么唯一的最佳顺序。如果您不希望阅读全部内容,可以参考下面这些顺序:

-存储器层次结构:附录B、第2章、附录D

-指令级并行:附录C、第3章、附录H

-数据级并行:第4章、第6章、附录G

-线程级并行:第5章、附录F、附录I

-请求级并行:第6章

-ISA:附录A、附录K

附录E可以随时阅读,但在ISA和缓存序列之后阅读,效果可能会更好一些。附录J可以在涉及运算时阅读。附录L的各部分内容应当在读完正文中相应章节后阅读。

篇章结构

我们根据一种统一的框架对选定材料进行调整,使书中各章在结构方面保持一致。首先会介绍一章的思想,然后是“交叉剪接问题”部分,说明某一章介绍的思想与其他各章介绍的思想有什么相互关系。接下来是“融会贯通”部分,通过展示如何在实际计算机中应用这些思想,将它们串在一起。

再下面是“谬论与易犯错误”,让读者从他人的错误中汲取教训。我们将举一些常见误解与体系结构陷阱的例子,要避开它们是非常困难的,哪怕你明明知道它们就在前面等着你。“谬论与易犯错误”部分是本书最受欢迎的内容。每一章都以一个“结语”节结束。

案例研究与练习

每一章的最后都有案例研究和练习。这些案例研究由业内和学术界的专家编撰而成,通过难度逐渐增大的练习来探讨该章的关键概念,检验读者的理解程度。教师们应当会发现这些案例研究都非常详尽、完善,完全可以针对它们设计一些练习。

每个练习中用尖括号括起的内容(<章.节>)指明了为完成该练习所需阅读的主要正文内容。我们这样做的目的,一方面是为了提供复习内容,另一方面是希望帮助读者避免在还没有阅读相应正文的情况下去做一些练习。为了使读者大致了解完成一个练习所需要的时间,我们为这些练习划定了不同等级:

[10] 短于5分钟(阅读和理解时间)

[15] 5-15分钟给出完整答案

[20] 15-20分钟给出完整答案

[25] 在1小时内给出完整的书面答案

[30] 小型编程项目:编程时间短于1整天

[40] 大型编程项目:耗时2周

[讨论] 与他人进行讨论的主题

在textbooks.elsevier.com注册的老师可以得到案例研究与习题的解答。

补充材料

我们还通过网络提供了多种资料,网址为http://booksite.mkp.com/9780123838728/,内容包括:

-参考附录——涵盖了一系列高级主题,由相关领域的专家撰写

-历史材料,考察了正文各章所介绍的关键思想的发展形成

-供老师使用的PowerPoint幻灯片

-PDF、EPS和PPT格式的书中插图

-网上相关材料的链接

-勘误表

我们会定期补充新材料和网上其他可用资源的链接。

帮助改进本书

最后要说的是,读者在阅读本书的同时还有可能赚钱。(聊聊性价比吧!)如果您阅读后面的“致谢”部分,将会看到我们已经下了很大的功夫来纠正错误。由于一本书会进行多次印刷,所以我们有机会进行更多的校订。如果您发现了任何遗留错误,请通过电子邮件联系出版商(ca5bugs@mkp.com)。

我们欢迎您对本书给出其他意见,并请您将它们发送到另一个电子信箱:ca5comments@mkp.com。

结语

本书仍然是一本真正的合著作品,我们每人编写的章节和附录各占一半。如果没有对方完成另一半工作,如果没有对方在任务似乎无望完成时给予鼓励,如果没有对方点透某个难以表述的复杂概念,如果没有对方花费周末时间来审阅书稿,又如果没有对方在自己因为其他繁重职责而难以提笔时给予宽慰(从简历可以看出,这些职责是随着本书的版本号以指数形式增加的),我们无法想像这本书要花费多长时间才能完成。同样,对于您将要读到的内容,其中若有不当之处,我们也负有同等责任。

                                                  John Hennessy  David Patterson