前言
我们能体验的最美好的事情莫过于神秘,它是所有真实的艺术和科学的源泉。
——阿尔伯特·爱因斯坦,《我的信仰》,1930年
关于本书
我们认为,在学习计算机科学与工程时,除了掌握计算的基本原理外,还应该了解该领域的最新进展。同时,我们还认为,各种计算领域中的读者都应学习计算机系统的组成理论,因为这是决定计算机系统的功能、性能、能耗甚至最终成功的关键。
现代计算机技术需要各个计算领域的专业人员对计算机软件和硬件都有所了解。软硬件在不同层次上的相互影响,恰好也提供了一个理解计算基础的框架。不管你的关注点是硬件还是软件,专业是计算机科学还是电气工程,计算机组成和设计的核心思想都是相同的。因此,本书的重点是展示硬件和软件之间的关系,并重点关注现代计算机的基本概念。
本书从MIPS版的第1版起就提出了以上观点,最近从单处理器向多核微处理器的转变再一次印证了这个颇有远见的观点。然而,程序员无视我们的忠告,不想改造程序,只想依赖计算机体系结构设计者、编译器设计者或者芯片设计者来让自己的程序运行得更快、更高效——这样的时代已经一去不复返了。为了运行得更快,需要把程序改造成并行的。让程序员尽可能不知道他们正在使用的底层硬件的并行属性是许多研究者的目标,但这需要花费很长时间才能实现。我们的观点是,至少在接下来的十年里,如果想让程序在并行计算机上运行得更为高效,大多数程序员还是需要了解硬件/软件接口的。
本书的读者包括:不了解汇编语言或者逻辑设计,但需要了解计算机基本组成的人;具有汇编语言或者逻辑设计背景,但想学习如何设计计算机或者想搞清楚系统的工作原理的人。
关于另一本书
有些读者可能熟悉我们的另一本书——Computer Architecture: A Quantitative Approach(《计算机体系结构:量化研究方法》,后文简称为《量化研究》)。该书已广为流传,经常以作者的姓名命名,称为“Hennessy和Patterson”(本书则常被称为“Patterson和Hennessy”)。我们写《量化研究》的动机是,希望能够使用坚实的工程基础、量化的成本/性能折中来描述计算机体系结构的基本原则。我们使用的方法是,基于商业系统,将实例与评估相结合,建立真实的设计体验。我们的目标是,证实可以使用量化分析方法而不是描述性方法来学习计算机体系结构。希望这一方法有助于培养能深入理解计算机的专业人才。
本书的大多数读者并不一定要成为计算机体系结构设计者。但是,未来软件系统的性能和能效,很大程度上取决于软件设计者对所使用系统的基本硬件技术的了解程度。因此,编译器设计者、操作系统设计者、数据库程序员以及大多数其他软件设计者需要对本书中提到的基本原则有深入的理解。同样,硬件设计者也需要清楚地知道自己的设计对软件应用程序的影响。
因此,本书不仅仅是《量化研究》一书的子集,而是进行了大幅修订以满足不同读者的需要。我们非常高兴地看到《量化研究》的后续版本也在不断修订,删除了大量的介绍性材料。相比第1版,此后两本书之间的内容重叠会越来越少。
关于RISC-V版本
选择合适的指令系统对于计算机体系结构教材来说至关重要。不管是不是主流指令系统,我们都不希望介绍那些具有不必要的新奇特性的指令系统。理想情况是,你学习的第一个指令系统应该是一个典范,就像你的初恋一样。令人惊讶的是,你学习的第一个指令系统和你的初恋都会令你分外怀念。
由于当时有太多选择,所以在《量化研究》的第1版中我们提出了自己的RISC风格指令系统。之后,MIPS指令系统因简洁的风格而日益受到关注,我们在本书MIPS版的第1版时选择了它,并且《量化研究》的后续版本也是如此。MIPS一直为我们和读者提供了很好的服务。
多年来,使用MIPS指令系统的芯片数以亿计,并且还在不断生产出来。它们一般用于嵌入式设备,而该领域的指令系统几乎不可见。因此,目前很难找到一台真实的计算机,让读者能够下载并运行MIPS程序。
好消息是,最近一个开放的RISC指令系统首次亮相,并快速获得了不少追捧者。它就是由加州大学伯克利分校(UC Berkeley)开发的RISC-V指令系统,它不仅消除了MIPS指令系统的弊病,而且还具备指令系统应有的简洁、优雅和现代的特点。
此外,RISC-V指令系统不是闭源的,它提供了一套开源的模拟器、编译器、调试器等,这些都很容易获得。它甚至还提供使用硬件描述语言编写的开源的RISC-V处理器实现,而且,2020年还引入了基于RISC-V的低成本开发板,相当于树莓派(Raspberry Pi),而MIPS指令系统则不具备这些资源。读者不仅可以学习这些设计,还能修改它们并贯穿整个实现流程,以充分了解这些修改对性能、晶片面积和能耗方面的影响。
这对于计算产业和教育行业来说是一个令人激动的机会。截止到写这篇前言之时,已经有300多家公司加入RISC-V基金会,赞助商名单几乎囊括了除ARM和Intel以外的所有主要厂商,包括Alibaba、Amazon、AMD、Google、HP、IBM、Microsoft、NVIDIA、Qualcomm、Samsung和Western Digital公司。
正是因为这些,我们为本书撰写了RISC-V版本,同样,《量化研究》也有对应版本。
在RISC-V版本中,我们从64位的RV64切换到32位的RV32。授课教师发现64位指令系统额外的复杂性增加了学生的学习难度。RV32减少了10条指令,即删除了ld、sd、lwu、addw、subw、addwi、sllw、srlw、sllwiw、srliw,而且学生不必费心理解64位寄存器的低32位操作。我们还可以在很大程度上忽略双字(doubleword),只在文本处理中使用字(word)。在这一版中,我们在第4章之前隐藏了看起来有些奇怪的SB和UJ指令编码格式,第4章会解释在SB和UJ编码格式的立即数字段使用旋转位排序可以带来硬件开销上的好处,这一章主要讨论数据通路的硬件设计。正如我们在MIPS版的第6版中所做的,这一版也添加了一个在线章节(4.5节)来展示多周期实现,同时我们对其进行了修改以匹配RISC-V指令系统。这是因为一些授课教师喜欢在单周期实现之后、引入流水线之前介绍一下多周期实现。
相比MIPS版,RISC-V版唯一的修改就是那些与指令系统相关的描述,主要影响第2、3章,以及第5章中的虚拟存储部分和第6章中的VMIPS示例。在第4章中,我们改用RISC-V指令,修改了相关的图表,添加了一些“详细阐述”模块,这些变化没有我们想象中那么复杂。第1章和大多数附录几乎没有变化。由于存在大量的在线文档,并且与RISC-V相关的修改过多,因此MIPS版中的附录A(汇编器、链接器和SPIM仿真器,详见MIPS版的第6版)很难再用。另外,第2、3和5章中包含数百条RISC-V指令的快速概览,这些指令都不在本书详细介绍的RISC-V核心指令范围内。
第2版中的改变
可以说,自上一版出版以来,计算机体系结构的技术和商业范畴有了更多的变化,主要表现在以下方面:
• 摩尔定律放缓。单个芯片的晶体管数量每两年翻一番,戈登·摩尔的这一预测在50年之后不再成立。半导体技术仍然会改进,但比过去更慢,更难以预测。
• 领域定制体系结构(DSA)兴起。一部分由于摩尔定律放缓,另一部分由于登纳德缩放定律终结,通用处理器的性能每年仅提高几个百分点。此外,阿姆达尔定律也说明,即使增加单个芯片上的处理器数量,所得到的实际好处也是有限的。2020年,DSA被普遍认为是最有前途的。它不像通用处理器那样尝试运行所有东西,而是专注于如何比传统CPU更好地运行某个领域的程序。
• 利用微体系结构进行安全攻击。Spectre证明了利用推测式乱序执行和硬件多线程可以进行基于时间的侧信道攻击。而且,这并不是源于可被修复的错误,而是对主流处理器设计风格的根本性挑战。
• 开放指令系统和开源实现。开源软件的机会和影响已经来到了计算机体系结构领域。开放指令系统如RISC-V使得不同组织能够在没有事先协商许可的情况下就开始构建自己的处理器,并且RISC-V的专有实现和开源实现一样可以自由下载和使用。开源软件与硬件是学术研究和教学的福音,能够让学生看到并去增强产业的技术实力。
• 信息技术产业再次整合。云计算导致不超过6家公司便可提供计算基础设施供所有人使用。与20世纪60年代和70年代的IBM非常相似,这些公司决定了所部署的软件栈和硬件。上述变化导致其中一些“超级大公司”开发出自己的DSA和RISC-V芯片,用于部署在它们的云中。
本书反映了上述这些变化,更新了所有的例题和图。针对用书教师提出的要求,对教学方法也做了进一步改进,这一改进的灵感来自给我的孙子辅导数学课时使用的教科书。
在详细介绍第2版的修订情况之前,首先看下表。该表给出了这一版的主要内容,并为软件人员和硬件人员分别提供了阅读建议。
(续)
• 每一章都增加了“性能提升”一节。第1章中给出了实现矩阵乘法运算的Python版本,但是性能较为低下,这激发了我们学习C语言的兴趣,第2章用C语言重写该程序。后续章节分别采用数据级并行、指令级并行、线程级并行以及调整存储访问顺序以匹配现代服务器的存储层次结构等方法来对矩阵乘法运算进行加速。书中使用的计算机支持512位SIMD操作、推测式乱序执行、三级高速缓存,并包含48个处理器内核。四种优化方法的实现虽然只添加了21行C语言代码,但可以将矩阵乘法运算加速近50000倍,将整个程序的运行时间从Python版本的近6h缩短到优化后的C语言版本的不到1s。如果我重新当一次学生,这个运行示例必定会激励我使用C语言,并学习本书中的底层硬件概念。
• 每一章都增加了“自学”一节,在该节中会提出一些启发思考的问题并提供答案,以帮助读者评估自己对章节内容的掌握情况。
• 除了解释摩尔定律和登纳德缩放定律不再成立之外,第2版中的一个重要变化就是不再强调摩尔定律是推动变革的重要因素。
• 第2章中使用更多的篇幅强调二进制数没有实质性的含义,是程序决定了数据类型,这对于初学者来说不太容易理解。
• 为了与RISC-V指令系统进行比较,除了ARMv7、ARMv8和x86之外,第2章还对MIPS进行了简要介绍。(本书的MIPS版本也进行了这样的比较,我们也对其进行了更新。)
• 第2章中基准测试程序的例子从SPEC2006升级到SPEC2017。
• 第4章中,根据教师的要求,在单周期实现和流水线实现之间,将RISC-V的多周期实现作为一节在线内容。一些教师认为使用这种三步教学法可使流水线的讲授更为简单。
• 第4章和第5章的“实例”一节都已更新为ARM A53微体系结构和Intel i7 6700 Skylake微体系结构。
• 第5章和第6章的“谬误与陷阱”一节都增加了使用Row Hammer和Spectre进行硬件安全攻击的内容。
• 第6章增加了一节,介绍领域定制体系结构,并使用Google的张量处理单元TPUv1作为示例。第6章的“实例”一节更新为将Google的TPUv3 DSA超级计算机与NVIDIA Volta GPU集群进行比较。
最后,我们还更新了本书的所有练习。
虽然发生了不少变化,但我们依然保留了旧版本中那些有用的元素。为使本书更适合作为参考书籍,我们仍在新术语第一次出现时在页边给出定义。书中名为“理解程序性能”的模块是用来帮助读者理解如何改善程序性能的,同样,“硬件/软件接口”模块是用来帮助读者了解该接口并进行软硬件划分权衡的。书中仍保留“重点”模块,以防止读者在学习过程中“只见树木而不见森林”。“自我检测”部分在每一章的结尾都附有答案,可以帮助读者第一时间确认自己对书中内容的理解。这一版也包括RISC-V的参考数据卡[1],这是受到了IBM System/360的“绿卡”的启发。该卡片已更新,适于在书写RISC-V汇编程序时作为参考资料使用。
教学支持[2]
我们收集了大量的资料,帮助教师使用本书进行授课。只要教师在出版商处进行注册,就能获得练习答案、书中的图表、教学讲义以及其他资料。除此之外,配套网站还提供了开源RISC-V软件的下载链接。如需更多信息,可访问出版商网站:https://textbooks.elsevier.com/web/manuals.aspx?isbn=9780128203316[3]。
结束语
从后续的“致谢”一节可以看到,我们花了大量的时间来进行修订。这本书经过了多次印刷,我们也有机会不断完善。如果你在此版中发现任何一处错误或遗漏,请联系出版商。
本书的这一版本是Hennessy和Patterson自1989年长期合作以来的第四次突破。由于要管理一所世界一流大学,Hennessy校长无法再对编写新版本做出实质性的承诺。这使得另一位作者再次感到自己像一个没有安全措施就走上钢丝的人。因此,加州大学伯克利分校的同事和致谢中提到的人在本书的内容方面发挥了更大的作用。无论如何,这一次只有一位作者对你所阅读的新内容负责。
致谢
对于本书的每一个版本,我们都很幸运地得到了许多读者、审稿人和其他贡献者的帮助。这些人的帮助使这本书变得更好。
我们非常感谢Khaled Benkrid以及他在ARM公司的同事,他们非常认真地检查了ARM的相关材料,并提供了有益的反馈。
特别感谢Rimas Avizenis博士,他开发了各种版本的矩阵乘法程序并提供了性能数据。非常感谢他从加州大学伯克利分校毕业后还继续提供帮助。当我在加州大学洛杉矶分校读研究生时,曾与他父亲一起工作,而能与他在加州大学伯克利分校共事,真的是一种美好的缘分。
同时,还要感谢我的长期合作者——Randy Katz(加州大学伯克利分校),他帮助我提出了“计算机体系结构中的伟大思想”的概念,并将其作为我们一起合作开设的本科生课程的教学内容。
我还要感谢David Kirk和John Nickolls以及他们在NVIDIA的同事(Michael Garland、John Montrym、Doug Voorhies、Lars Nyland、Erik Lindholm、Paulius Micikevicius、Massimiliano Fatica、Stuart Oberman和Vasily Volkov),他们编写了第一个深入阐述GPU的附录。我希望能再次表达我对Jim Larus的感激之情,最近他刚被任命为洛桑联邦理工学院(EPFL)计算机和通信科学学院的院长。感谢他愿意在汇编语言编程方面贡献自己的专业知识,并欢迎本书的读者使用他开发及维护的模拟器。
还要感谢Jason Bakos(南卡罗来纳大学),是他在原始版本的基础上更新并重新设计了新的章末练习。原始版本由Perry Alexander(堪萨斯大学)、Javier Bruguera(圣地亚哥德孔波斯特拉大学)、Matthew Farrens(加州大学戴维斯分校)、Zachary Kurmas(大峡谷州立大学)、David Kaeli(东北大学)、Nicole Kaiyan(阿德莱德大学)、John Oliver(加州州立理工大学圣路易斯-奥比斯波分校)、Milos Prvulovic(佐治亚理工学院)、Jichuan Chang(谷歌公司)、Jacob Leverich(斯坦福大学)、Kevin Lim(惠普公司)和Partha Ranganathan(谷歌公司)开发。
特别感谢Jason Bakos,他在Peter Ashenden(Ashenden设计公司)提供的版本的基础上更新了课程讲义。
感谢下面这些教师,他们回复了出版商的调查问卷,审阅了我们的提议,还参加了各种专题小组会议。
专题小组人员如下:Bruce Barton(萨福克郡社区学院),Jeff Braun(蒙大拿大学理工分校),Ed Gehringer(北卡罗来纳州立大学),Michael Goldweber(泽维尔大学),Ed Harcourt(圣劳伦斯大学),Mark Hill(威斯康星大学麦迪逊分校),Patrick Homer(亚利桑那大学),Norm Jouppi(惠普实验室),Dave Kaeli(东北大学),Christos Kozyrakis(斯坦福大学),Jae C. Oh(雪城大学),Lu Peng(路易斯安那州立大学),Milos Prvulovic(佐治亚理工学院),Partha Ranganathan(惠普实验室),David Wood(威斯康星大学),Craig Zilles(伊利诺伊大学厄巴纳-香槟分校)。
调查问卷和审阅人员如下:Mahmoud Abou-Nasr(韦恩州立大学),Perry Alexander(堪萨斯大学),Behnam Arad(加州州立大学萨克拉门托分校),Hakan Aydin(乔治梅森大学),Hussein Badr(纽约州立大学石溪分校),Mac Baker(弗吉尼亚军事学院),Ron Barnes(乔治梅森大学),Douglas Blough(佐治亚理工学院),Kevin Bolding(西雅图太平洋大学),Miodrag Bolic(渥太华大学),John Bonomo(威斯特敏斯特学院),Jeff Braun(蒙大拿大学理工分校),Tom Briggs(西盆斯贝格大学),Mike Bright(格罗夫城学院),Scott Burgess(洪堡州立大学),Fazli Can(毕尔肯大学),Warren R. Carithers(罗切斯特理工学院),Bruce Carlton(梅萨社区学院),Nicholas Carter(伊利诺伊大学厄巴纳-香槟分校),Anthony Cocchi(纽约市立大学),Don Cooley(犹他州立大学),Gene Cooperman(东北大学),Robert D. Cupper(阿勒格尼学院),Amy Csizmar Dalal(卡尔顿学院),Daniel Dalle(舍布鲁克大学),Edward W. Davis(北卡罗来纳州立大学),Nathaniel J. Davis(空军技术学院),Molisa Derk(俄克拉荷马城市大学),Andrea Di Blas(斯坦福大学),Nathan B. Doge(得克萨斯大学达拉斯分校),Derek Eager(沙斯卡曲湾大学),Ata Elahi(南康涅狄格州立大学),Ernest Ferguson(西南密苏里州立大学),Rhonda Kay Gaede(阿拉巴马大学),Etienne M. Gagnon(魁北克大学蒙特利尔分校),Costa Gerousis(克里斯托弗新港大学),Paul Gillard(纽芬兰纪念大学),Michael Goldweber(泽维尔大学),Georgia Grant(圣马特奥学院),Paul V. Gratz(得克萨斯农工大学),Merrill Hall(大师学院),Tyson Hall(南方耶稣复临大学),Ed Harcourt(圣劳伦斯大学),Justin E. Harlow(南佛罗里达大学),Paul F. Hemler(汉普顿-悉尼学院),Jayantha Herath(圣克劳德州立大学),Martin Herbordt(波士顿大学),Steve J. Hodges(卡布利洛学院),Kenneth Hopkinson(康奈尔大学),Bill Hsu(旧金山州立大学),Dalton Hunkins(圣波拿文都大学),Baback Izadi(纽约州立大学新帕尔兹分校),Reza Jafari,Abbas Javadtalab(康卡迪亚大学),Robert W. Johnson(科罗拉多理工大学),Bharat Joshi(北卡罗来纳大学夏洛特分校),Nagarajan Kandasamy(德雷塞尔大学),Rajiv Kapadia,Ryan Kastner(加州大学圣巴巴拉分校),E. J. Kim(得克萨斯农工大学),Jihong Kim(首尔大学),Jim Kirk(联合大学),Geoffrey S. Knauth(利康明学院),Manish M. Kochhal(韦恩州立大学),Suzan Koknar-Tezel(圣约瑟夫大学),Angkul Kongmunvattana(哥伦布州立大学),April Kontostathis(乌尔辛纳斯学院),Christos Kozyrakis(斯坦福大学),Danny Krizanc(维思大学),Ashok Kumar,S. Kumar(得克萨斯大学),Zachary Kurmas(大峡谷州立大学),Adrian Lauf(路易斯维尔大学),Robert N. Lea(休斯敦大学),Alvin Lebeck(杜克大学),Baoxin Li(亚利桑那州立大学),Li Liao(特拉华大学),Gary Livingston(马萨诸塞大学),Michael Lyle,Douglas W. Lynn(俄勒冈理工学院),Yashwant K. Malaiya(科罗拉多州立大学),Stephen Mann(滑铁卢大学),Bill Mark(得克萨斯大学奥斯汀分校),Ananda Mondal(克拉夫林大学),Euripedes Montagne(中佛罗里达大学),Tali Moreshet(波士顿大学),Alvin Moser(西雅图大学),Walid Najjar(加州大学河滨分校),Vijaykrishnan Narayanan(宾夕法尼亚州立大学),Danial J. Neebel(洛拉斯学院),Victor Nelson(奥本大学),John Nestor(拉斐特学院),Jae C. Oh(雪城大学),Joe Oldham(中心学院),Timour Paltashev,James Parkerson(阿肯色大学),Shaunak Pawagi(纽约州立大学石溪分校),Steve Pearce,Ted Pedersen(明尼苏达大学),Lu Peng(路易斯安那州立大学),Gregory D. Peterson(田纳西大学),William Pierce(护德学院),Milos Prvulovic(佐治亚理工学院),Partha Ranganathan(惠普实验室),Dejan Raskovic(阿拉斯加大学费尔班克斯分校),Brad Richards(皮吉声大学),Roman Rozanov,Louis Rubinfield(维拉诺瓦大学),Md Abdus Salam(南方大学),Augustine Samba(肯特州立大学),Robert Schaefer(丹尼尔韦伯斯特学院),Carolyn J. C. Schauble(科罗拉多州立大学),Keith Schubert(加州州立大学圣贝纳迪诺分校),William L. Schultz,Kelly Shaw(里士满大学),Shahram Shirani(麦克马斯特大学),Scott Sigman(杜瑞大学),Shai Simonson(史东希尔学院),Bruce Smith,David Smith,Jeff W. Smith(佐治亚大学雅典分校),Mark Smotherman(克莱姆森大学),Philip Snyder(约翰斯·霍普金斯大学),Alex Sprintson(得克萨斯农工大学),Timothy D. Stanley(杨百翰大学),Dean Stevens(莫宁赛德学院),Nozar Tabrizi(凯特林大学),Yuval Tamir(加州大学洛杉矶分校),Alexander Taubin(波士顿大学),Will Thacker(温斯洛普大学),Mithuna Thottethodi(普渡大学),Manghui Tu(南犹他大学),Dean Tullsen(加州大学圣地亚哥分校),Steve VanderLeest(凯尔文学院),Christopher Vickery(纽约市立大学皇后学院),Rama Viswanathan(贝洛伊特学院),Ken Vollmar(密苏里州立大学),Guoping Wang(印第安纳-普渡联合大学),Patricia Wenner(巴克内尔大学),Kent Wilken(加州大学戴维斯分校),David Wolfe(古斯塔夫阿道夫学院),David Wood(威斯康星大学麦迪逊分校),Ki Hwan Yum(得克萨斯大学圣安东尼奥分校),Mohamed Zahran(纽约市立学院),Amr Zaky(圣塔克拉拉大学),Gerald D. Zarnett(瑞尔森大学),Nian Zhang(南达科他矿业理工学院),Xiaoyu Zhang(加州州立大学圣马科斯分校),Jiling Zhong(特洛伊大学),Huiyang Zhou(北卡罗来纳州立大学),Weiyu Zhu(伊利诺伊卫斯理大学)。
特别感谢Mark Smotherman,他通过多次检查发现了技术和写作方面的问题,这显著提高了本书的质量。
我们还要感谢Morgan Kaufmann这个大家庭同意在Katey Birtcher、Steve Merken和Beth LoGiudice的带领下再次出版这本书,没有他们我当然不可能完成这项工作。还要感谢负责图书制作过程的Janish Paul以及负责封面设计的Patrick Ferguson。
最后,我欠着Yunsup Lee和Andrew Waterman莫大的人情,是他们在创业之余,利用业余时间将本书MIPS版改写成RISC-V版本。Eric Love也是如此,他在完成博士学位的同时编辑了RISC-V版本的练习。我们都很兴奋,想看看RISC-V在学术界和其他领域到底能做些什么。
以上共提到近150人,是他们帮助我们完成了新书,我希望这是迄今为止我们最好的一本书。谢谢各位!
David A. Patterson
[1] 参考数据卡见本书封面和封底的背面。——编辑注
[2] 关于本书教辅资源,只有使用本书作为教材的教师才可以申请,需要的教师请访问爱思唯尔的教材网站https://textbooks.elsevier.com/进行申请。——编辑注
[3] 也可访问出版商网站https://www.elsevier.com/books-and-journals/book-companion/9780128203316。——编辑注