雷锋网按:近几年来,不论是普通消费者还是科研人员们都可以感受到两种浪潮,一种是CPU速度的提升越来越不显著了,我们说CPU制造商又在“挤牙膏”;另一方面,在深度学习的刺激下,各个半导体巨头和一群 AI 初创企业都开始宣传自己的 AI 芯片。我们仿佛看到一类芯片逐渐走向慢车道,另一类芯片则准备搭台唱戏、跃跃欲试。
这种柳暗花明的背后,显示的正是计算机计算架构的时代变革;新的方法、新的思维、新的目标引领了新的浪潮。2017 年图灵奖的两位得主 John L. Hennessy 和 David A. Patterson 就是这个新浪潮的见证者和引领者。近日他们在ACM 通讯(Communications of the ACM)发表了一篇长报告《A New Golden Age for Computer Architecture》,详细描述了引发计算机架构新时代到来的种种变化,他们也展望未来的十年将是计算机体系架构领域的“新的黄金十年”。
雷锋网把这篇文章全文编译如下,本篇为上篇,下篇参见这里。
另外二位还有过一次轻松的访谈,可以参见这里。
ISCA 2018 ,2017 图灵奖颁奖现场,John L. Hennessy(左) 和 David A. Patterson(右)与 Alan Turing 的半身像合影
2018年6月4日,我们回顾了自20世纪60年代以来计算机架构的发展,并以此开始了我们的图灵讲座。除了那个回顾,我们还在讲座中介绍了当前的难题和未来机遇。计算机体系结构领域将迎来又一个黄金十年,就像20世纪80年代我们做研究那时一样,新的架构设计将会带来更低的成本,更优的能耗、安全和性能。
“不能铭记过去的人注定要重蹈覆辙”
——George Santayana,1905
软件与硬件的对话,是通过一种称为指令集的体系结构进行来的。在20世纪60年代初,IBM拥有四条互不兼容的计算机系列,分别针对小型企业,大型企业,科研单位和即时运算,每个系列都有自己的指令集、软件栈和I/O系统。
IBM的工程师们,也包括ACM图灵奖获奖者Fred Brooks在内,希望能够创建一套新的ISA,将这四套指令集有效统一起来,为此他们需要一种可以让低端的8位计算机和高端的64位计算机共享一套指令集的解决方案。
实际上,数据通路的加宽和缩小相对是比较容易的,当时的工程师们面临的最大挑战是处理器中的控制器部分。受软件编程的启发,计算机先驱人物、图灵奖获得者Maurice Wilkes提出了简化控制流程的思路,即将控制器部分定义为一个被称为“控制存储器”的二维数组,可通过内存实现,比使用逻辑门的成本要低得多。数组的每一列对应一条控制线,每一行对应一条微指令,写微指令的操作称为微编程,控制存储器包含使用微指令编写的指令集解释器,因此执行一条传统指令需要多个微指令完成。
下图列出了IBM在1964年4月7日发布的新System/360系列计算机的指令集,四种型号之间的数据通路宽度相差8倍,内存容量相差16倍,频率相差近4倍,最终性能相差50倍。其中M65机型的控制存储器容量最大,成本和售价也最昂贵,而最低端M30机型的控制存储器容量最小,因此也需要有更多的微指令来执行System/360的指令。
IBM将公司的未来押在了这套新指令集上,寄希望其能革新计算行业,赢得未来。而最终IBM也如愿以偿,成功主宰了这一市场,并将其影响力延续至今,这些55年前机型的后代产品现在仍能为IBM带来每年100亿美元的收入。
现在看来,尽管市场对技术问题做出的评判还不够完善,但由于硬件系统架构与商用计算机之间的密切联系,市场最终成为计算机架构创新的是否成功的关键性因素,这些创新往往需要工程人员方面的大量投入。
集成电路,CISC,432,8086,IBM PC
当计算机进入集成电路时代,摩尔定律的力量可以使控制存储器被设计的更大,而这反过来又催生了更复杂的指令集,如Digital Equipment公司于1977年发布的VAX-11/780机型,其控制存储器容量就达到了5120指令字*96bit,而其前代型号仅为256指令字*56bit。
于此同时,一些制造商开始设计可记录控制存储器(WCS),放开微编程功能以使客户可以自行定制功能,其中最有名的机型是图灵奖得主Chuck Thacker和Butler Lampson 和他的同事在1973年为施乐公司Palo Alto研究中心开发的Alto计算机。这是第一台个人计算机,配备有首款点阵显示器和首个以太网局域网,其控制器存储在一个容量为4096指令字*32bit的WCS中。
另一边,20世纪70年代的微处理器仍处于8位时代(如Intel的8080处理器),主要采用汇编语言编程,各家公司的设计师会不断加入新的指令来超越竞争对手,并通过汇编语言展示他们的优势。
戈登·摩尔认为,Intel的下一代指令集将会伴随Intel的一生,他聘请了大批聪明的计算机科学博士,并将他们送到波特兰的一个新工厂,以打造下一个伟大的指令集架构。这个被Intel最初命名为8800的计算机架构项目雄心勃勃,它具有32位寻址能力、面向对象的体系结构,可变位长的指令以及用当时最新编程语言Ada编写的操作系统,是20世纪80年代最具挑战性的一个项目。
可惜天不遂愿,这个项目在几年间再三延期,迫使Intel在圣克拉拉启动了一项紧急更换计划,要在1979年推出一款16位处理器,也就是后来的8086。Intel给了新团队52周时间来开发新的指令集以及设计和构建芯片。由于时间紧迫,这个团队实际上是把 8080 的 8 位寄存器和指令集扩展成了 16 位,设计ISA部分仅仅花了10个人3周时间。最终8086如期完成,但在发布时却没引起什么关注。
这一次Intel很走运,当时IBM正在开发一款对位Apple II的个人计算机,正需要16位处理器。IBM一度对Motorola 68000处理器很感兴趣,它拥有类似于IBM 360的指令集,但性能表现却无法满足IBM激进的需求,故转而使用Intel 8086的8位总线版。IBM于1981年8月12日宣布推出该机型,全球销量高达1亿台,为Intel这套指令集铺垫了一个非常光明的未来。
Intel原本的8800项目更名了为iAPX-432,并最终在1981年推出,但它需要多块芯片并且存在严重的性能问题,最终于1986年终止。同样在这一年,Intel推出了80386处理器,将8086指令集的寄存器从16位扩展到了32位。戈登•摩尔的预言成为了现实,Intel的下一代指令集确实一直存续下来,但市场做出的选择是临危上马的8086,而不是被寄予厚望的iAPX-432,这对摩托罗拉68000和iAPX-432的架构师来讲,都是个现实的教训,市场永远是没有耐心的。
从CISC到RISC
20世纪80年代初,人们开始研究CISC(复杂指令集计算机)控制存储器中的大型微程序,而Unix系统的诞生则证明了可以使用高级语言来编写操作系统,因此随后问题的关键从“编程者会使用什么汇编语言”变成了“编译器会生成什么指令”,软硬件接口的显著改进为架构创新带来了机会。
图灵奖得主John Cocke和他的同事为小型计算机开发了更简单的指令集和编译器,并将编译器的目标设定为“仅使用 IBM 360指令集中简单的寄存器到寄存器操作,只以简单的Load和Store操作访问内存”。他们发现,这样简化的流程可以让程序运行速度快上3倍。Emer和Clark发现,VAX指令中有20%的常用指令需要60%的微代码(microcode),但仅占据0.2%的执行时间。
David Patterson把在DEC一次学术休假投入到了研究减少VAX指令中的漏洞上。他认为,如果处理器制造商想要设计更庞大的复杂指令集,就免不了需要一种修复微代码漏洞的方法。Patterson就此问题写了一篇论文,但《Computer》期刊却拒绝刊登,审稿人认为,使用如此复杂以至于需要修补的指令集来设计处理器是很糟糕的。
虽然现在来看,现代的CISC处理器确实包含微代码修复机制,但当时的这次拒稿却让人们怀疑复杂指令集在处理器方面的价值,这也启发了他去开发更简单的精简指令集,以及RISC(精简指令集计算机)。
这些观点的产生,以及由汇编语言向高级语言的转变,为CISC向RISC的过渡创造了条件。首先,精简指令集是经过简化的,其指令通常和微指令一样简单,硬件可以直接执行,因此无需微代码解释器;第二,之前用于微代码解释器的快速存储器被用作了RISC的指令缓存;第三,基于Gregory Chaitin图染色法的寄存器分配器,使编译器能够更简易、高效地使用寄存器,这指令集中那些寄存器到寄存器的操作有很大好处;最后,集成电路规模的发展,使20世纪80年代的单块芯片足以包含完整的32位数据路径以及相应的指令和数据缓存。
下图是加州大学伯克利分校1982年研发的RISC-I处理器和斯坦福大学1983年研发的MIPS处理器,两颗芯片充分展示了RISC的优势,并最终发表在1984年IEEE国际固态电路会议上。加州大学和斯坦福大小的研究生研发出了比行业内现有产品更优秀处理器,这是非常了不起的时刻。
这些由学术机构开发的芯片,激励了许多企业开始发力RISC处理器,并成为此后15年中发展最快的领域。其原因是处理器的性能公式:
时间/程序=操作数/程序*(时钟周期)/指令*时间/(时钟周期)
DEC公司的工程师后来表明,CISC处理器执行每个程序的操作数大约为RISC处理器的75%(上式第一项),在使用类似的技术时,CISC处理器执行每个指令要多消耗5到6个时钟周期(上式第二项),使得RISC处理器的速度大约快了3倍。
这样的公式在20世纪80年代还没有进入计算机体系结构的书中,所以我们在1989年编写了《Computer Architecture: A Quantitative Approach》一书,使用测量和基准测试来对计算机架构进行量化评估,而不是更多地依赖于架构师的直觉和经验,使用的量化方法也受到了图灵奖得主Donald Knuth关于算法的书的启发。
VLIW、EPIC、Itanium
指令集架构的下一次创新试图同时惠及RISC和CISC,即超长指令字(VLIW)和显式并行指令计算机(EPIC)的诞生。这两项发明由Intel和惠普共同命名,在每条指令中使用捆绑在一起的多个独立操作的宽指令。与RISC一样,VLIW和EPIC的目的是将工作负载从硬件转移到编译器上,它们的拥护者认为,如果用一条指令可以指定六个独立的操作(两次数据传输,两次整数操作和两次浮点操作),并且编译器技术可以有效地将操作分配到六个指令槽,则硬件可以变得更简单。
Intel和惠普合作设计了一款基于EPIC理念的64位处理器Itanium(安腾),想用其取代32位x86处理器。Intel和惠普对Itanium抱有很高的期望,但实际情况却与他们的预期并不相符,EPIC虽然适用于高度结构化的浮点程序,但却很难在可预测性较低的缓存丢失或难以预测分支的整型程序上实现高性能。
Donald Knuth后来指出,Itanium的设想非常棒,但事实证明满足这种设想的编译器基本上不可能写出来。开发人员注意到Itanium的延迟和性能表现不佳,并借鉴泰坦尼克号事件重新将其命名为“Itanic”。不过正如前面所提到的,市场永远是没有耐心的,最终64位的x86-64成为了继承者,没有轮到Itanium。
不过一个好消息是,VLIW仍然小范围应用于数字信号处理等对分支预测和缓存要求不高的领域。
RISC vs. CISC,PC和后PC时代的宿命对决
Intel和AMD依靠500人的设计团队和卓越的半导体技术来缩小x86和RISC之间的性能差距,而受到精简指令相对于复杂指令性能优势的启发,Intel和AMD将RISC微指令的执行流程化,使指令解码器在运行中将复杂的x86指令转换成类似RISC的内部微指令,从而让x86处理器可以吸收RISC在性能分离指令、数据缓存、芯片二级缓存、深度流水线以及同时获取和执行多个指令等许多优秀的设计。在2011年PC时代的巅峰时期,Intel和AMD每年大约出货3.5亿颗x86处理器。PC行业的高产量和低利润率也意味着价格低于RISC计算机。
在Unix市场中,软件供应商会为不同的复杂指令集(Alpha、HP-PA、MIPS、Power和SPARC)提供不同的软件版本,而PC市场上绝对主流的指令集只有一套,软件开发人员只需兼容x86指令集即可。全球每年出货数亿台PC,软件就成为了一个巨大的市场。更大的软件基础、相似的性能和更低的价格使得x86处理器在2000年之前同时统治了台式机和小型服务器市场。
苹果公司在2007年推出了iPhone,开创了后PC时代。智能手机公司不再购买处理器,而是使用其他公司的设计来构建自己的SoC。移动设备设计人员需要对芯片面积和能效以及性能进行综合评估,CISC处理器在这一点上处于劣势。此外,物联网的到来需要海量的处理器,更加需要在芯片尺寸、功率、成本和性能上做权衡。这种趋势增加了设计时间和成本的重要性,进一步使CISC处理器处于不利地位。在今天这个“后PC时代”,x86处理器的出货量自2011年达到峰值以来,每年下降近10%,而RISC处理器的出货量则飙升至200亿。如今,99%的32位和64位处理器都是RISC处理器。
总结这些历史,可以说市场已经解决了RISC和CISC宿命之争。CISC赢得了PC时代的后期阶段,但RISC正在后PC时代占据主导。复杂指令集领域已经几十年没有新的指令集出现了,对于今天的通用处理器来说,最佳的选择仍然是精简指令集。
处理器架构当前面临的挑战
“如果一个问题无解,那它可能不是一个问题,而是一个事实,我们不需要解决,而是随着时间的推移来处理。”
——Shimon Peres
虽然前面的部分聚焦在指令集架构的设计上,但大部分计算机架构师并不设计新的指令集,而是利用当前的实现技术来实现现有的ISA。自20世纪70年代后期以来,选择的技术一直是基于MOS(金属氧化物半导体)的集成电路,首先是 nMOS(n型金属氧化物半导体),然后是CMOS(互补金属氧化物半导体)。
戈登·摩尔在1965年预测,集成电路的晶体管密度会每年翻一番,1975年又改为每两年翻一番,这一预测最终被称为摩尔定律。在这一预测中,晶体管密度呈二次增长,惊人的进化速度使架构师可以用更多晶体管来提高性能。
摩尔定律和登纳德缩放定律的失效
如图2所示,摩尔定律已经持续了几十年,但它在2000年左右开始放缓,到了 2018 年,实际结果与摩尔定律的预测相差了15倍,但摩尔在2003年做的判断已不可避免(可参考GE Moore 的《No exponential is forever: But 'forever' can be delayed!》论文)。基于当前的情况,这一差距还将持续增大,因为CMOS已经接近极限。
图2 单个英特尔微处理器上的晶体管数量 vs. 摩尔定律
与摩尔定律相伴的是由罗伯特·登纳德(Robert Dennard)预测的登纳德缩放定律(Dennard scaling;又称作MOSFET缩放定律)。Robert Dennard 在 1974 年提出,晶体管不断变小,但芯片的功率密度不变。随着晶体管密度的增加,每个晶体管的能耗将降低,因此硅芯片上每平方毫米上的能耗几乎保持恒定。由于每平方毫米硅芯片的计算能力随着技术的迭代而不断增强,计算机将变得更加节能。不过,登纳德缩放定律从 2007 年开始大幅放缓,大概在2012 年接近失效(见图 3)。
图3每个芯片上的晶体管及每平方毫米的功率
1986 年至 2002 年间,利用指令级并行(ILP)是提高架构性能的主要方法,伴随着晶体管速度的提高,其性能每年能提高约50%。登纳德缩放定律的终结意味着架构师必须找到更有高效的方法利用并行性。
要理解增加ILP 所带来高效率,可以看一看当前的处理器核心比如ARM、英特尔、AMD。假设该芯片有15级流水线(管线),每个时钟周期可以发送 4 条指令,那么它在任何时刻都有多达60条指令,包括大约15个分支,它们占执行指令的大约25%。为了能够充分利用流水线,需要预测分支,并根据推测将代码放入流水线以便执行。推测的使用同时是 ILP高性能和低能效的源头。如果分支预测达到完美,推测就能提高 ILP 性能,但能耗会增加一些(也可能节约能耗),但如果分支预测出现失误,处理器就必须放弃错误的推测指令,计算所耗能量就会被浪费。处理器的内部状态也必须恢复到错误预测分支之前的状态,这将消耗额外的能量和时间。
要理解这种设计的挑战性,想一想正确预测15个分支就可知道其中的难度。如果处理器架构想把性能的浪费控制在10%以内,那么它必须在 99.3%的时间里正确预测每个分支。很少有通用程序能够如此准确地预测。
要理解性能浪费叠加的结果,可以参见图4中,图中显示了有效执行的指令,但由于处理器推测错误而被浪费。对英特尔酷睿 i7 基准测试上,19%的指令都被浪费了,但能量的浪费情况更加严重,因为处理器必须使用额外的能量才能恢复到推测失误前的状态。这样的测试导致许多人得出结论,架构师需要一种不同的方法来实现性能改进。于是迎来了多核时代的诞生。
图4 不同的SPEC整型数基准测试,英特尔酷睿 i7 浪费的指令占完成指令总数的百分比
多核将识别并行性和决定如何利用并行性的任务转移给程序员和编程语言。多核并未解决节能的挑战,而这种挑战因登纳德缩放定律终结更加严峻。每个活跃的核都会消耗能量,无论其对计算是否有有效贡献。一个主要的障碍可以用阿姆达尔定律(Amdahl's Law)表述,该定理认为,在并行计算中用多处理器的应用加速受限于程序所需的串行时间百分比。这一定律的重要性参见图5,与单核相比,多达64个核执行应用程序速度的差别,假设串行执行的不同部分只有一个处理器处于活动状态。例如,如果只有1%的时间是串行的,那么 64核的配置可加速大约35倍,当然能量也与64个处理器成正比,大约有45% 的能量被浪费。
图5 阿姆达尔定律对程序加速的影响
真实的程序当然会更加复杂,部分组件允许在给定时刻使用不同数量的处理器。然而,需要定期性通信和同步意味着大部分应用仅可高效使用一部分处理器。尽管阿姆达尔定律已经出现 50 多年了,这仍然是一个很大的困难。
随着登纳德缩放定律的终结,芯片内核数量的增加意味着能耗也随之增加。不幸的是,进入处理器的电能有一部分会转化为热能,因此多核处理器受限于热耗散功率(TDP),即封装和冷却系统在最大负载时的驱散热量的最大限度。尽管一些高端数据中心可能使用更先进的封装和冷却技术,但没有一个计算机用户想要在自己桌子上放置小型热交换器,或者为手机增加散热器。TDP 的限制性直接导致了暗硅时代,也就是处理器通过降低时钟频率或关闭空闲内核来防止处理器过热。这种方法的另一种解释是:一些芯片可将其宝贵的能量从空闲内核转移到活跃内核。
登纳德缩放定律的结束,摩尔定律放缓以及阿姆达尔定律正当其时,意味着低效性将每年的性能改进限制在几个百分点(如6所示)。想获得高的性能改进(像 20 世纪八九十年代那样)需要新的架构方法,新方法应能更加高效地利用集成电路。接下来我们将讨论现代计算机的另一个主要缺陷——计算机安全的支持以及缺乏,之后再继续探讨有效利用集成电路的新方法。
图6 计算机性能的提升(SPECintCPU)
被忽略的计算机安全
20 世纪 70 年代,处理器架构师主要专注于计算机安全,涉及保护环和功能安全。架构师们意识到,大部分漏洞都存在于软件中,但他们认为架构能会有所帮助。这些功能大部分未被操作系统使用,这些操作系统有意专注于所谓的良性环境(如个人电脑),并且这些功能涉及大量消耗,因此被淘汰。在软件社区中,很多人认为正式验证技术如微内核等技术会为构建高度安全的软件提供有效保障。不幸的是,我们的软件系统规模和性能驱动器意味着此类技术无法跟上处理器性能。结果就是大型软件系统仍然有很多安全漏洞,且由于海量在线个人信息和云计算的使用,其影响被放大。
登纳德缩放定律的终结意味着架构师必须找到利用并行化的更高效方式。
架构师们和其他人很晚才意识到安全的重要性,但他们已经开始对虚拟机和加密提供硬件支持。不幸的是,推测给许多处理器带来了未知但明显的安全缺陷。特别是,Meltdown和Spectre安全漏洞导致新漏洞利用位体系结构中的漏洞,使受保护信息较快地遭到泄露,这两种漏洞都使用了旁路攻击。2018 年,研究者展示了在攻击者不将代码加载到目标处理器的情况下,如何利用 Spectre 变体导致网络信息泄露。尽管这次名为NetSpectre的攻击泄露信息速度较慢,但它会使同一局域网(或云中同一集群)中的所有机器都受到攻击,这会产生许多新的漏洞。还有两个被报告的漏洞存在于虚拟机架构,其中一个叫Foreshadow,会影响专门保护高风险数据(如加密密钥)的英特尔SGX 安全机制。现在,每个月都会发现新的漏洞。
旁路攻击并非新鲜事,但在最早期的大多数情况,软件漏洞是攻击成功的关键。但在Meltdown、Spectre 等攻击中,硬件的缺陷导致受保护信息泄露。处理器架构师如何定义什么是正确的ISA是一个源头的难题,因为标准中并未说明执行指令序列的性能影响,而仅仅涉及 ISA-visible 执行架构状态。架构师需要重新思考ISA正确实现的定义,以避免类似的安全漏洞。与此同时,他们还应该重新思考对计算机安全关注的侧重点,以及架构师如何与软件设计师一起实现更加安全的系统。架构师(以及所有人)都过于依赖信息系统,以至于对安全的重视程度不如对一流设计的关注。
雷锋网(公众号:雷锋网)编译,via 本文编译自 A New Golden Age for Computer Architecture,by John L. Hennessy, David A. Patterson 雷锋网
相关文章:
图灵奖得主John Hennessy、David Patterson访谈:未来小学生都能做机器学习
独家 | 计算机体系结构顶级会议ISCA,2017图灵奖得主展望黄金时代