两位图灵奖得主万字长文:新计算机架构将进入爆发期
John Hennessy(左) 和David Patterson 拿着他们合著的《计算机体系架构:量化研究方法》,照片的拍摄时间大约是1991年。来源:ACM
当时,由GPU推动的深度学习浪潮已然兴起,谷歌推出了TPU,AI芯片创业公司林立,芯片市场群雄并起,连做软件的人都能感到从硬件行业迸发出的热气。 很快,一年后,已经出任谷歌母公司Alphabet董事长的Hennessy和已经加入谷歌TPU团队的Patterson又站在了一起,这次是为了纪念他们共同荣获2017年的图灵奖。 “计算机体系结构领域将迎来又一个黄金十年,就像20世纪80年代我们做研究那时一样,新的架构设计将会带来更低的成本,更优的能耗、安全和性能。” 通过微程序设计,IBM认为新的ISA将能够彻底改变计算行业,赢得未来。 IBM统治了当时的计算机市场,55年前诞生的IBM大型机,其后代产品现在每年仍能为IBM带来100亿美元的收入。 现在看来,尽管市场对技术问题做出的评判还不够完善,但由于硬件系统架构与商用计算机之间的密切联系,市场最终成为计算机架构创新的是否成功的关键性因素,这些创新往往需要工程人员方面的大量投入。 微处理器在20世纪70年代仍处于8位时代(如英特尔的8080处理器),主要采用汇编语言编程。各家企业的设计师会不断加入新的指令来超越竞争对手,通过汇编语言展示他们的优势。 图1 IBM 360系列机型的参数,IPS意为“每秒操作数” 这个雄心勃勃的项目迟迟不能退出,这迫使英特尔紧急改变计划,于1979年推出一款16位微处理器。英特尔为新团队提供了52周的时间来开发新的“8086”指令集,并设计和构建芯片。由于时间紧迫,设计ISA部分仅仅花了3周时间,主要是将8位寄存器和8080的指令集扩展到了16位。团队最终按计划完成了8086的设计,但产品发布后几乎没有大张旗鼓的宣传。 英特尔很走运,当时IBM正在开发一款旨在与Apple II竞争的个人计算机,正需要16位微处理器。 IBM一度对摩托罗拉的68000型感兴趣,它拥有类似于IBM 360的指令集架构,但与IBM激进的方案相比显得落后。IBM转而使用英特尔8086的8位总线版本处理器。IBM于1981年8月12日宣布推出该机型,预计到1986年能够卖出25万台,结果最终在全球卖出了1亿台,未来前景一片光明。 摩尔的预测是正确的,这个指令集确实和英特尔一直存续下来,但市场却选择了紧急赶工的产品8086,而不是英特尔寄予厚望的iAPX-432,这对摩托罗拉68000和iAPX-432的架构师来讲,都是个现实的教训,市场永远是没有耐心的。 从复杂指令集计算机到精简指令集计算机。 20世纪80年代初期,对使用大型控制存储中的大型微程序的复杂指令集计算机(CISC)的相关问题进行过几项调查。Unix的广泛应用,证明连操作系统都可以使用高级语言,所以关键问题就是:“编译器会产生什么指令?”而不是“程序员使用什么汇编语言?”软硬件交互手段的显著进步,为架构创新创造了机会。 Patterson就此问题写了一篇论文,但被《计算机》期刊拒稿。审稿人认为,构建具有ISA的微处理器是一个糟糕的想法,因为这需要在现场进行修复。这让人怀疑,CISC 指令集对微处理器的价值究竟有多大。 具有讽刺意味的是,现代CISC微处理器确实包含微代码修复机制,但这篇论文被拒的主要结果是,激励了他开始研究面向微处理器的精简指令集,即复杂度较低的指令集架构,以及使用精简指令集的计算机(RISC)。 这些观点的产生,以及由汇编语言向高级语言的转变,为CISC向RISC的过渡创造了条件。首先,RISC指令经过简化,因此不再需要微代码解释器。 RISC指令通常与微指令一样简单,硬件能够直接执行。 其次,以前用于CISC 指令集的微代码解释器的快速存储器被重新用作RISC指令的高速缓存。(缓存是一个小而快速的内存,用于缓冲最近执行的指令,因为这类指令很快就会被再次调用。) 第三,基于Gregory Chaitin的图着色方案的寄存器分配器,使编译器能够更简易、高效地使用寄存器,最后,摩尔定律意味着在20世纪80年代能够诞生有足够数量的晶体管的芯片,可以容纳一个完整的32位数据路径、指令集和数据高速缓存。 在今天的“后PC时代”,x86芯片的出货量自2011年达到峰值以来,每年下降近10%,而采用RISC处理器的芯片出货量则飙升至200亿。 图2 由加州大学伯克利分校开发的RISC-I8和斯坦福大学开发的MIPS12微处理器 这些由学术机构开发的芯片,激励了许多企业开始发力RISC微处理器,并成为此后15年中发展最快的领域。其原因是处理器的性能公式: 时间/程序=操作数/程序x(时钟周期)/指令x时间/(时钟周期) DEC公司的工程师后来表明,更复杂的CISC指令集每个程序执行的操作数大约为RISC的75%执行大约75%,不过在类似的技术下,CISC每个指令执行时间约为五到六个时钟周期,使RISC微处理器的运算速度是CISC的大约4倍。 20世纪80年代时,这些内容还没有进入计算机体系结构的书中,所以我们在1989年编写《计算机架构:定量方法》( Computer Architecture: AQuantitative Approach)一书。本书的主题是使用测量和基准测试来对计算机架构进行量化评估,而不是更多地依赖于架构师的直觉和经验,就像过去一样。我们使用的定量方法也得益于图灵奖得主高德纳(Donald Knuth)关于算法的著作内容的启发。 VLIW和EPIC的拥护者认为,如果用一条指令可以指定六个独立的操作——两次数据传输,两次整数操作和两次浮点操作,编译器技术可以有效地将这些操作分配到六个指令槽中,硬件架构就可以变得更简单。与RISC方法一样,VLIW和EPIC的目的是将工作负载从硬件转移到编译器上。 正如高德纳后来所指出的那样:“Itanium的设想非常棒,但事实证明满足这种设想的编译器基本上不可能写出来。” 开发人员注意到Itanium的迟钝和性能不佳,将用命途多舛的游轮“Titanic”其重命名为“Itanic”。不过,市场再次失去了耐心,最终64位版本的x86成为32位x86的继承者,没有轮到Itanium。 不过一个好消息是,VLIW在较窄的应用程序与小程序上,包括数字信号处理任务中留有一席之地。 AMD和英特尔利用500人的设计团队和先进的半导体技术,缩小了x86和RISC之间的性能差距。同样,受到流水线化简单指令vs.复杂指令的性能优势的启发,指令解码器在运行中将复杂的x86指令转换成类似RISC的内部微指令。 AMD和英特尔随后将RISC微指令的执行流程化。RISC的设计人员为了性能所提出的任何想法,例如隔离指令和数据缓存、片上二级缓存、deep pipelines以及同时获取和执行多条指令等,都可以集成到x86中。在2011年PC时代的巅峰时期,AMD和英特尔每年大约出货3.5亿台x86微处理器。PC行业的高产量和低利润率也意味着价格低于RISC计算机。 虽然上一节的重点是指令集体系结构(ISA)的设计,但大多数计算机架构师并不设计新的ISA,而是在当前的实现技术中实现现有的ISA。自20世纪70年代末以来,技术的选择一直是基于金属氧化物半导体(MOS)的集成电路,首先是n型金属氧化物半导体(nMOS),然后是互补金属氧化物半导体(CMOS)。 MOS技术惊人的改进速度(Gordon Moore的预测中已经提到这一点)已经成为驱动因素,使架构师能够设计更积极的方法来实现给定ISA的性能。摩尔在1965年26年的最初预测要求晶体管密度每年翻一番;1975年,他对其进行了修订,预计每两年翻一番。这最终被称为摩尔定律。由于晶体管密度呈二次增长,而速度呈线性增长,架构师们使用了更多的晶体管来提高性能。 尽管摩尔定律已经存在了几十年(见图2),但它在2000年左右开始放缓,到2018年,摩尔的预测与目前的能力之间的差距大约是15倍。目前的预期是,随着CMOS技术接近基本极限,差距将继续扩大。 与摩尔定律相伴而来的是罗伯特·登纳德(Robert Dennard)的预测,称为“登纳德缩放比例”(Dennard Scaling)。该定律指出,随着晶体管密度的增加,每个晶体管的功耗会下降,因此每平方毫米硅的功耗几乎是恒定的。由于硅的计算能力随着每一代新技术的发展而提高,计算机将变得更加节能。Dennard Scaling在2007年开始显著放缓,到2012年几乎变为零(见图3)。 图3:Transistors per chip and power per mm2. 在1986年到2002年之间,指令级并行(ILP)的开发是提高性能的主要架构方法,并且随着晶体管速度的提高,每年的性能增长大约50%。Dennard Scaling的结束意味着架构师必须找到更有效的方法来利用并行性。 为了理解这些浪费的工作是如何累加起来的,请考虑下图中的数据,其中显示了有效执行但由于处理器的错误推测而被浪费的指令的部分。在Intel Core i7上,这些基准测试平均浪费了19%的指令。 但是,浪费的能量更大,因为处理器在推测错误时必须使用额外的能量来恢复状态。这样的度量导致许多人得出结论,架构师需要一种不同的方法来实现性能改进。多核时代就这样诞生了。 多核将识别并行性和决定如何利用并行性的责任转移给程序员和语言系统。多核并不能解决由于登纳德缩放比例定律结束而加剧的节能计算的挑战。无论有源堆芯对计算的贡献是否有效,有源堆芯都会消耗能量。 当然,真正的程序有更复杂的结构,其中部分允许在任何给定的时间点使用不同数量的处理器。尽管如此,定期通信和同步的需求意味着大多数应用程序的某些部分只能有效地使用一部分处理器。尽管Amdahl定律已有50多年的历史,但它仍然是一个困难的障碍。 20世纪70年代,处理器架构师将重点放在通过保护环等概念来增强计算机安全性上。这些架构师充分认识到大多数错误将出现在软件中,但是他们相信架构支持可以提供帮助。这些特性在很大程度上没有被操作系统所采用,这些操作系统被有意地集中在所谓的良性环境中(比如个人电脑),并且成本很高,所以很快被放弃了。 在软件社区中,许多人认为正式验证机制和微内核这样的技术,将为构建高度安全的软件提供有效的机制。遗憾的是,规模化软件系统和对性能的追求,使得这些技术无法跟上处理器的性能。其结果是,大型软件系统仍然存在许多安全缺陷,由于在线个人信息的大量增加,以及云计算的大规模应用,这种缺陷的影响被进一步放大了。 尽管计算机架构师们安全性的重要意识方面进展缓慢,但他们也已经开始为虚拟机和加密硬件提供安全支持。遗憾的是,这也可能为不少处理器带来了一个未知、但重要的安全缺陷。尤其是,Meltdown和Spectre安全缺陷导致了新的漏洞,这些漏洞会利用微架构中的漏洞,使得本来受保护的信息迅速泄露。Meltdown和Spectre使用所谓的侧通道攻击(Side-channel attacks),通过观察任务所需时间,将ISA级别上不可见的信息转换为时间上可见的属性,从而泄露信息。 随后有报告称发现了虚拟机体系结构中的另外两个漏洞。其中一种被称为“预见”(hadow),可以渗透英特尔旨在保护高风险数据(如加密密钥)的安全机制。此后每月都有新的漏洞被发现。 “我们面前的一些令人叹为观止的机会被伪装成不可解决的问题。” ——John Gardner,1965年 一个有趣的研究方向是关于是否可以使用新的编译器技术来缩小某些性能差距,这可能有助于体系结构的增强。尽管高效编译和实现Python等高级脚本语言的难度很大,但潜在的收益也是巨大的。哪怕编译性能提升25%的潜在收益都可能使Python程序运行速度提高数十乃至数百倍。这个简单的例子说明了在注重程序员效率的现代语言与传统方法之间有多大的差距。 最后,DSA受益于以领域特定语言(DSL)编写的目标程序,这些程序可以利用更多的并行性,改进内存访问的结构和表示,并使应用程序更有效地映射到特定领域处理器。 DSA要求将高级运算融入到体系结构里,但尝试从Python,Java,C或Fortran等通用语言中提取此类结构和信息实在太难了。领域特定语言(DSL)支持这一过程,并能有效地对DSA进行编程。例如,DSL可以使向量、密集矩阵和稀疏矩阵运算显式化,使DSL编译器能够有效地将将运算映射到处理器。 常见的DSL包括矩阵运算语言Matlab,编程DNN的数据流语言TensorFlow,编程SDN的语言P4,以及用于指定高级变换的图像处理语言Halide。 我们考虑了两种不同的方法,通过提高硬件技术的使用效率来提高程序运行性能:首先,通过提高现代高级语言的编译性能;其次,通过构建领域特定体系结构,可以大大提高性能和效率。 DSL是另一个如何改进支持DSA等架构创新的硬件/软件接口的例子。通过这些方法获得显著性能提升。在行业横向结构化之前,需要在跨抽象层次上垂直集成并做出设计决策,这是计算机早期工作的主要特征。在这个新时代,垂直整合变得更加重要,能够核查和进行复杂权衡及优化的团队将会受益。 这个机会已经引发了架构创新的激增,吸引了许多竞争性的架构理念: 除了这些大型企业外,还有数十家创业公司正在寻求自己的路径。为了满足不断增长的需求,体系结构设计师正在将数百到数千个此类芯片互连,形成神经网络超级计算机。 DNN架构的这种雪崩使计算机架构变得有趣。在2019年很难预测这些方向中哪些(或者即使有)会赢,但市场肯定会最终解决技术以及架构争议。 受开源软件成功的启发,计算机体系结构中的第二个机遇是开源的ISA。要创建一个“面向处理器的Linux”,该领域需要行业标准的开源ISA,这样社区就可以创建开源内核(除了拥有专有内核的个别公司之外)。如果许多组织使用相同的ISA设计处理器,那么更大的竞争可能会推动更快的创新。目标是为芯片提供处理器,成本从几美分到100美元不等。 RISC-V的第三个显著特征是ISA的简单性。虽然难以量化,但这里有两个与ARM公司同期开发的ARMv8架构的比较: 简单性减少了设计处理器和验证硬件正确性的工作量。 由于RISC-V的目标范围从数据中心芯片到物联网设备,因此设计验证可能是开发成本的重要组成部分。 第四,RISC-V是一个全新的设计。与第一代RISC架构不同,它避免了微架构或依赖技术的特性(如延迟分支和延迟加载),也避免了被编译器技术的进步所取代的创新(如注册窗口)。 最后,RISC-V通过为自定义加速器保留大量的操作码空间来支持DSA。 首先,安全专家不相信通过“隐藏”实现的安全性,因此实现开源很有吸引力,而开源的实现需要开放的体系结构。 同样重要的是,增加能够围绕安全架构进行创新的人员和组织的数量。专有架构限制了员工的参与,但是开放架构允许学术界和业界所有最优秀的“头脑”来帮助共同实现安全性。 此外,开放的架构、实现和软件栈,加上FPGA的可塑性,意味着架构师可以在线部署和评估新的解决方案,并每周迭代它们,而不是每年迭代一次。虽然FPGA比定制芯片慢10倍,但这种性能仍然足以支持在线用户。 我们希望开放式架构成为架构师和安全专家进行硬件/软件协同设计的典范。 由Beck等人撰写的《轻量级软件开发》(The Manifesto for Agile Software Development,2011)彻底改变了软件开发方式,克服了瀑布式开发中传统的详细计划和文档的频繁失败。小型编程团队在开始下一次迭代之前快速开发工作原型(但不完整)并获得了客户反馈。轻量级开发的scrum版本汇集了5到10个程序员的团队,每次迭代执行需两到四周的冲刺。 再次受到软件成功的启发,第三个机遇是轻量级硬件开发。对于架构师来说,好消息是现代电子计算机辅助设计(ECAD)工具提高了抽象级别,从而支持轻量级开发,而这种更高的抽象级别增加了设计之间的重用。 但从设计芯片到得到用户反馈的几个月之间,像轻量级软件开发那样申请“硬件四周的冲刺”似乎是不合理的。 下图概述了轻量级开发方法如何通过在适当的级别上更改原型来工作。 “黎明前最黑暗。” 登纳德缩放比例定律和摩尔定律的终结,以及标准微处理器性能增长的减速,这些都不是必须解决的问题,而是公认的事实,并且提供了让人惊叹的机遇。 高级、特定于领域的语言和体系结构,将架构师从专有指令集的链中解放出来,以及公众对改进安全性的需求,将为计算机架构师带来一个新的黄金时代。PC和后PC时代的RISC vs. CISC
处理器架构当前的挑战
摩尔定律和 Dennard Scaling的终结
被忽视的安全问题
计算机体系结构新机遇
领域特定语言
总结
开放式架构
轻量级硬件开发
总结