计算机体系架构未来趋势(深度)
共 19020字,需浏览 39分钟
·
2021-11-08 14:01
将成为未来十年甚至更长时间,计算机体系结构的趋势。登纳德缩放定律结束、摩尔定律衰退,而阿姆达尔定律正当其时,这意味着低效性将每年的性能改进限制在几个百分点。获得更高的性能改进需要新的架构方法,就是DSA。
计算机架构的第二个机会是开放的 ISA(Instruction Set Architecture,指令集合架构),要创建处理器领域的Linux。
这让我想起了2021年7月27日OCP China Day的第二演播厅(详见视频:数据处理怎么能变更快?),接受IT大嘴巴(刘策)的采访时,因西部数据Bill 刘总的启发,得出:开放计算未来十年,除了在系统级(整机柜、机架服务器、边缘服务器等),组件级(OAI、NVMe SSD、NIC 3.0、DPU等),还将在芯片级(如RISC-V、英伟达NVDLA)大有作为。
借助电子计算机辅助设计(ECAD)工具,使得敏捷开发成为可能;这种更高水平的抽象增加了设计的重用性。从设计交付到返回芯片原来需要几个月时间,现在可能四周左右。
摩尔(Gordon Moore)在 1965 年的最初预测中,称晶体管密度会每年翻一番;1975 年,他又预计每两年翻一番。
罗伯特·登纳德(Robert Dennard)预测随着晶体管密度的增加,每个晶体管的能耗将降低,因此硅芯片上每平方毫米上的能耗几乎保持恒定。由于每平方毫米硅芯片的计算能力随着技术的迭代而不断增强,计算机将变得更加节能。然而,登纳德缩放定律从 2007 年开始大幅放缓,2012 年左右接近失效(见图 3)。
1986 年至 2002 年间,指令级并行(ILP)是提高性能的主要架构方法。而且随着晶体管速度的提高,其性能每年能提高 50% 左右。登纳德缩放定律的终结意味着工程师必须找到更加高效的并行化利用方法。
为了保持工作流程完整,需要预测分支,并根据推测将代码放入工作流程中以便执行。推测的使用是 ILP 高性能和芯片低能效的源头所在。如果分支预测完美,推测就能提高 ILP 性能,但能耗会增加一些——甚至可能节约能耗——但如果分支预测出现失误,处理器就必须抛弃错误的推测指令,其计算工作及所耗能量就会付之东流。处理器的内部状态也必须恢复到错误预测分支之前的状态,这将花费额外的时间和能量。
很少有通用程序能够如此准确地预测分支。架构师需要一种不同的方法来实现性能改进。于是多核时代就这样诞生了。
多核将识别并行性和决定如何利用并行性的责任转移给程序员和语言系统。多核并不能解决由登纳德缩放定律终结带来的能效计算挑战。每个活跃的核都会消耗能量,无论其对计算是否具有有效贡献。一个主要的障碍可以用阿姆达尔定律(Amdahl\'s Law)表述。
IBM360系列机的主要设计者阿姆达尔于1967年提出。
该定律指出:系统中对某一部件采用更快执行方式所能获得的系统性能改进程度,取决于这种执行方式被使用的频率,或所占总执行时间的比例。阿姆达尔定律实际上定义了采取增强(加速)某部分功能处理的措施后可获得的性能改进或执行时间的加速比。简单来说是通过更快的处理器来获得加速是由慢的系统组件所限制。
阿姆达尔曾致力于并行处理系统的研究。对于固定负载情况下描述并行处理效果的加速比s,阿姆达尔经过深入研究给出了如下公式:S=1/(1-a+a/n)
其中,a为并行计算部分所占比例,n为并行处理结点个数。这样,当1-a=0时,(即没有串行,只有并行)最大加速比s=n;当a=0时(即只有串行,没有并行),最小加速比s=1;当n→∞时,极限加速比s→ 1/(1-a),这也就是加速比的上限。例如,若串行代码占整个代码的25%,则并行处理的总体性能不可能超过4。
言归正传,下面是《计算机架构的新黄金时代,两位图灵奖得主最新力作》全文。
John Hennessy 和 David Patterson 是 2017 年图灵奖获得者,目前这两位学者都供职于谷歌,前者是谷歌母公司 Alphabet 的董事会主席,后者任谷歌杰出工程师,致力于研究机器学习和人工智能。他们更为人所知的就是共同完成的计算机系统结构学科「圣经」《计算机体系结构:量化研究方法》了。
本文《计算机架构的新黄金时代》是两人在 2019 年新发表的文章,完整介绍了计算机芯片的发展历程,以及所有架构的未来趋势,值得所有希望了解硬件架构的人阅读。
2018 年 6 月 4 日,我们回顾了自 20 世纪 60 年代以来计算机架构的发展,并以此开始了我们的图灵讲座(Turing Lecture)。除了那个回顾,我们还在讲座中介绍了当前的难题和未来机遇。我们还预测未来十年计算机架构领域将迎来下一个黄金时代,就像 20 世纪 80 年代那样——我们做的研究能为我们带来回报,能改善成本、能源、安全以及性能。
「不能铭记过去的人注定要重蹈覆辙。」 ——George Santayana,1905
软件与硬件的通信是通过指令集架构(ISA)进行的。在 1960 年代早期,IBM 有四个互不兼容的计算机产品线,每个都有自己的 ISA、软件堆栈、I/O 系统和利基市场(分别针对的是小型企业、大型企业、科研和实时应用)。包括 ACM 图灵奖获得者 Fred Brooks, Jr. 在内的 IBM 工程师都认为他们可以创造一种能有效统一所有这四种 ISA 基础的单个 ISA。
他们需要一种技术解决方案,让便宜的 8 位数据路径计算机与高速的 64 位数据路径计算机都能共用一个 ISA。这些数据路径是处理器的「身体」,它们在其中执行算术运算但相对而言较容易「变宽」或「变窄」。对于那时以及现在的计算机设计者来说,最大的难题是处理器的「大脑」——控制硬件。受软件编程的启发,计算先驱和图灵奖获得者 Maurice Wilkes 提出了简化控制的方法。控制可被描述为一个二维数组,他称之为「控制存储器(control store)」。这个数组的每一列都对应于一条控制线,每一行都是一个微指令(microinstruction),而编写微指令则被称为微编程(microprogramming)。一个控制存储器包含一个用微指令编写的 ISA 解释器,所以执行一个常规指令需要多个微指令。这种控制存储器是通过内存实现的,成本比逻辑门要低得多。
表 1 列出了 IBM 在 1964 年 4 月 7 日宣布的新 System/360 ISA 的 4 种型号。数据路径的变化范围有 8 倍,内存容量的变化范围有 16 倍,时钟频率是 4 倍,性能是 50 倍,成本接近 6 倍。成本最高的计算机的控制存储器最宽,因为更复杂的数据路径使用更多控制线。成本最低的计算机因为硬件更简单而有更窄的控制存储器,但因为它们需要更多时钟周期来执行一个 System/360 指令,所以需要更多微指令。
在微编程的推动下,IBM 将公司的未来押在了这款新 ISA 上,寄希望其能革新计算行业,为 IBM 赢得回报。IBM 成功主宰了这一市场,IBM 计算机家族的大型机后裔在推出 55 年后仍然每年创造着 100 亿美元的收入。
正如我们反复看到的那样,尽管市场并不能完美地判定各种技术问题,但鉴于架构和商业计算机之间联系紧密,市场才能最终决定架构创新是否成功,而这往往需要大量的工程开发投入。
当计算机开始使用集成电路时,摩尔定律意味着控制存储器可以变大很多。更大的内存反过来又意味着允许使用更复杂的 ISA。要知道,数字设备公司(Digital Equipment Corp.)在 1977 年推出的 VAX-11/780 的控制存储器为 5120 字×96 位,而其前一代仅有 256 字× 56 位。
某些制造商选择开放微编程功能,让选定的客户能添加定制功能,他们称之为「可写控制存储器(WCS)」。最有名的 WCS 计算机是 Alto,这是图灵奖得主 Chuck Thacker 和 Butler Lampson 及其同事于 1973 年一起为施乐(Xerox)帕洛阿托研究中心开发的。这实际上是第一款个人计算机(PC),配备有首款位映像显示器(bit-mapped display)和首个以太网局域网。用于这种全新显示器和网络的设备控制器是存储在一个 4096 字×32 位 WCS 中的微程序。
1970 年代的微处理器(比如英特尔的 8080)仍处于 8 位时代,主要依靠汇编语言编写程序。互相竞争的设计者会通过添加新的指令来赶超彼此,他们会通过汇编语言示例来展示自己的优势。
戈登·摩尔(Gordon Moore)相信英特尔的下一代 ISA 将会伴随英特尔的一生,因此他聘用了很多聪明的计算机科学博士,并将他们送到波特兰去发明出色的下一代 ISA。英特尔最早命名为 8800 的计算机架构项目雄心勃勃——对任何时代而言都是如此,显然也是 1980 年代最有野心的。它有基于 32 位的寻址能力、面向对象的架构、位长可变的指令以及用时新的编程语言 Ada 编写的自己的操作传统。
可惜这个雄心勃勃的项目晚了几年,迫使英特尔在圣克拉拉开始了一项紧急替换工作,在 1979 年推出了一款 16 位微处理器。英特尔给了新团队 52 周时间来开发新的「8086」ISA 以及设计和构建芯片。鉴于日程紧迫,这个团队实际上是把 8080 的 8 位寄存器和指令集扩展成了 16 位,最后只用 10 人次的 3 个常规工作周完成了这款 ISA 的设计。这个团队按时完成了 8086 的开发,但在发布时却没引起什么关注。
英特尔非常幸运,IBM 当时正在开发一款个人计算机来与 Apple II 竞争,并需要一款 16 位微处理器。IBM 之前感兴趣的是 Motorola 68000,其 ISA 与 IBM 360 类似,但却落后于 IBM 激进的计划。IBM 转而使用 8086 的 8 位总线版本。IBM 在 1981 年 8 月 12 日推出了这款 PC,希望到 1986 年时能售出 25 万台。而实际上该公司在全球售出了 1 亿台,为这款紧急代换的英特尔 ISA 铺垫了一个非常光明的未来。
英特尔原本的 8800 项目更名了为 iAPX-432,并最终在 1981 年推出,但它需要多块芯片并且存在严重的性能问题。该项目在 1986 年终止,这一年,英特尔在 80386 中对 16 位 8086 ISA 进行了扩展,将其寄存器从 16 位扩展到了 32 位。因此,摩尔的预测就是正确的了——下一代 ISA 确实会和英特尔一样长寿,但市场选择了紧急代换的 8086,而不是专门精心开发的 432。正如 Motorola 68000 和 iAPX-432 两者的设计师都学到的那样:市场往往缺乏耐心。
1980 年代早期,人们对更大型控制存储器中大型微程序使用的复杂指令集计算机(CISC)进行了一些研究。Unix 表明即使操作系统也可以使用高级语言编写,关键问题随之变成了「编译器会生成什么指令?」,而不是「编程者会使用什么汇编语言?」。硬件/软件接口的显著改进为架构创新带来了机会。
图灵奖得主 John Cocke 与其同事为小型计算机开发了更简单的 ISA 和编译器。作为实验,他们将自己研究的编译器的目标重新设定为:仅使用 IBM 360 ISA 中简单的 register-register 操作和 load-store 数据传输,避免更复杂的指令。他们发现使用这个简单的子集时,程序运行速度可快达三倍。Emer 和 Clark 发现 VAX 指令中 20% 的指令需要 60% 的微代码(microcode),但仅占据 0.2% 的执行时间。
David Patterson 把在 DEC 的一次学术休假投入到了研究减少 VAX 指令中的漏洞上。他认为,如果微处理器制造商遵循更大型计算机的 CISC ISA 设计,则它们需要一种修复微代码漏洞的方法。他为此写了一篇论文,但期刊《Computer》却拒绝接收。审稿人认为,使用如此复杂以至于需要修补的 ISA 开发微处理器是很糟糕的。这次拒稿让人们质疑 CISC ISA 在微处理器方面的价值。讽刺的是,现代 CISC 微处理器确实需要包含微代码修复机制,但他被拒稿的主要结果是启发他为微处理器开发更简单的 ISA——精简指令集计算机(RISC)。
这些观察和向高级语言的转移为 CISC 向 RISC 的过渡带来了机会。首先,RISC 指令是经过简化的,因此无需微代码解释器。RISC 指令通常和微指令一样简单,硬件可以直接执行。第二,之前用于 CISC ISA 的微代码解释器的快速内存被用作了 RISC 指令的缓存。(缓存是小而快的内存,临时缓冲近期执行过的指令,因为这样的指令很可能很快就要重新使用。)第三,基于 Gregory Chaitin 图着色方案的寄存器分配器使编译器可以更加容易地有效使用寄存器,这对这些 register-register ISA 是有利的。最后,摩尔定律意味着 1980 年代单块芯片中已有足以包含完整 32 位数据路径的晶体管以及相应的指令和数据缓存。
在今天的后 PC 时代,x86 的出货量从 2011 年的顶峰每年都会下降约 10%,而 RISC 处理器芯片出货量已经激增到了 200 亿。
例如图 1 展示了 RISC-I 和 MIPS 微处理器,它们分别由 UC 伯克利和斯坦福在 1982 与 1983 年开发,它们展示了 RISC 的优势。这些芯片最终都展示在了顶尖电路会议上,即 1984 年的 IEEE 国际固态电路会议。当时是非常瞩目的成果,因为伯克利和斯坦福的一些研究生能构建超越工业上能构建的微处理器。
这些学术界做出的芯片激励了许多公司构建 RISC 微处理器,也是那之后 15 年内最快的芯片。下面的公式解释了处理器的性能:
Time/Program = Instructions / Program x (Clock cycles) / Instruction x Time / (Clock cycle)
DEC 工程师后来表明,更复杂的 CISC ISA 每个程序执行的指令数是 RISC 每个程序的 75%(上式第一项),在使用类似的技术时,CISC 执行每个指令要多消耗 5 到 6 个时钟周期(第二项),使得 RISC 微处理器的速度大约快了 3 倍。
这样的公式在上世纪 80 年代的计算机架构书中还没有,后来我们在 1989 年发表了《计算机体系架构:量化研究方法》一书。子标题表明了该书的主题:使用测量方法和基准进行量化评估,而不是像从前那样依靠架构师的直觉与经验。我们使用的量化方法也受到了图灵奖得主 Donald Knuth 关于算法的书的启发。
下一个 ISA 创新应该是对 RISC 和 CISC 的继承。超长指令字(VLIW)及其「表亲」显式并行指令计算机(EPIC)使用了宽指令,其中在每条指令中捆绑了多个独立操作。VLIW 和 EPIC 的拥护者当时认为,单个指令如果可以指定六个独立的操作(两个数据传输、两个整型操作和两个浮点操作),并且编译器技术可以有效地将操作分配到六个指令槽,则硬件可以变得更简单。与 RISC 方法一样,VLIW 和 EPIC 将工作从硬件转移到编译器。
通过合作,英特尔和惠普公司设计了一款基于 EPIC 理念的 64 位处理器来取代 32 位 x86。英特尔和惠普公司对第一款 EPIC 处理器(Itanium)的期望很高,但实际情况与开发商的早期声明并不相符。虽然 EPIC 方法适用于高度结构化的浮点程序,但它很难实现具有较少可预测的缓存丢失或较不可预测分支的整型程序的高性能。正如 Donald Knuth 后来指出:「Itanium 方法...... 原被认为非常赞,直到事实证明所希望的编译器基本上不可能写出来。」专家们注意到 Itanium 的延迟和表现不佳,并借鉴泰坦尼克号事件重新将其命名为「Itanic」。市场再次失去了耐心,导致 64 位版本的 x86 成为 32 位 x86 的继承者,而不是 Itanium。
好消息是 VLIW 仍然适用于较窄范围的应用程序、小程序、更简单的分支和省略缓存,包括数字信号处理。
AMD 和英特尔使用了 500 人的设计团队和顶尖半导体技术来减少 x86 和 RISC 的性能差距。再次受到简单流水线 vs 复杂指令性能优势的启发,指令解码器在运行中将复杂的 x86 指令转换为类似 RSIC 的内部微指令。然后 AMD 和英特尔将 RISC 微指令的执行流水线化。RISC 设计师关于性能分离指令、数据缓存、芯片二级缓存、深度流水线,以及同时获取和执行多个指令的任何想法,都可以用在 x86 的设计上。AMD 和英特尔在 2011 年 PC 时代的巅峰期出了大约 3 亿 5 千万个微处理器。PC 行业的高产量和低利润同样意味着比 RISC 计算机更低的价格。
鉴于每年全球销售的数亿台 PC,PC 软件成为一个巨大的市场。虽然 Unix 市场的软件提供商会为不同的商业 RISC ISA-Alpha、HP-PA、MIPS、Power 和 SPARC 提供不同的软件版本,但 PC 市场却享有单一的 ISA,因此软件开发商提供了「收缩包装」软件,只与 x86 ISA 二进制兼容。2000 年,更大的软件基础、类似的性能和更低的价格使 x86 在台式机和小型服务器市场中占据主导地位。
苹果公司在 2007 年帮助推动了后 PC 时代。智能手机公司不再购买微处理器,而是采用其他公司的设计(包括 ARM 的 RISC 处理器)构建自己的芯片系统(SoC)。移动设备设计人员对芯片面积和能效以及性能进行评估,表明 CISC ISA 设计的不足之处。此外,物联网的到来大大促进了处理器的数量以及芯片尺寸、功率、成本和性能所需的权衡。这种趋势增加了设计时间和成本的重要性,进一步使 CISC 处理器处于不利地位。在今天的后 PC 时代,x86 出货量自 2011 年达到峰值以来每年下降近 10%,而采用 RISC 处理器的芯片则飙升至 200 亿。如今,99%的 32 位和 64 位处理器都是 RISC。
结束这一历史回顾,我们可以说市场已经解决了 RISC-CISC 的争论。CISC 赢得了 PC 时代的后期阶段,但 RISC 正在后 PC 时代占据主导。几十年来,都没有出现新的 CISC ISA。令我们惊讶的是,在推出 35 年后,今天对于通用处理器来说,最佳的 ISA 仍然是 RISC。
「如果一个问题无解,那它可能都不成问题,而是一个事实;我们不需要解决,而是随着时间的推移来处理。」—Shimon Peres
虽然前面的部分聚焦在指令集架构(ISA)设计上,大部分计算机架构师并不设计新的 ISA,而是在现有的实现技术中实现现有的 ISA。自 20 世纪 70 年代后期以来,选择的技术一直是基于金属氧化物半导体(MOS)的集成电路,首先是 n 型金属氧化物半导体(nMOS),然后是互补金属氧化物半导体(CMOS)。摩尔的预测中捕捉到的 MOS 技术惊人的进步率一直促使架构师设计更积极的方法来为给定的 ISP 实现更好的性能。在 1965 年的最初预测中,摩尔称晶体管密度会每年翻一番;1975 年,他又预计每两年翻一番。该预测最终被称为摩尔定律。因为晶体管密度呈二次增长,而增长率呈线性增长,架构师使用更多晶体管来提高性能。
尽管摩尔定律已经持续了几十年(见图 2),但在 2000 年左右开始放缓。到了 2018 年,根据摩尔定律得出的预测与当下实际能力差了 15 倍。根据当前预测,这一差距将持续拉大,因为 CMOS 技术方法已经接近极限。
伴随摩尔定律是由罗伯特·登纳德(Robert Dennard)预测的登纳德缩放定律(Dennard scaling)。他指出,随着晶体管密度的增加,每个晶体管的能耗将降低,因此硅芯片上每平方毫米上的能耗几乎保持恒定。由于每平方毫米硅芯片的计算能力随着技术的迭代而不断增强,计算机将变得更加节能。登纳德缩放定律从 2007 年开始大幅放缓,2012 年左右接近失效(见图 3)。
1986 年至 2002 年间,指令级并行(ILP)是提高性能的主要架构方法。而且随着晶体管速度的提高,其性能每年能提高 50% 左右。登纳德缩放定律的终结意味着工程师必须找到更加高效的并行化利用方法。
要理解为什么 ILP 的增加会导致芯片能效大大降低,可以看一看 ARM、英特尔、AMD 当前推出的处理器核。假设该芯片有一个 15 步的工作流程,每个时钟周期可以发送 4 条指令。那么在任意一个时刻,整个工作流程中至多有 60 条指令,包括大约 15 个分支,因为它们代表了大约 25% 的执行指令。为了保持工作流程完整,需要预测分支,并根据推测将代码放入工作流程中以便执行。推测的使用是 ILP 高性能和芯片低能效的源头所在。如果分支预测完美,推测就能提高 ILP 性能,但能耗会增加一些——甚至可能节约能耗——但如果分支预测出现失误,处理器就必须抛弃错误的推测指令,其计算工作及所耗能量就会付之东流。处理器的内部状态也必须恢复到错误预测分支之前的状态,这将花费额外的时间和能量。
要理解这种设计的挑战性有多高,可以考虑一下正确预测 15 个分支结果的难度。如果处理器要将做无用功的时间限制在 10%,那么它必须在 99.3% 的时间里正确预测每个分支。很少有通用程序能够如此准确地预测分支。
要理解这些无用功叠加起来是什么结果,可以参见图 4 中的数据。图 4 显示了有效执行的部分指令,这部分指令由于处理器推测错误而变得无用。在英特尔酷睿 i7 基准测试上,19% 的指令都被浪费了,但能耗的浪费情况更加严重,因为处理器必须利用额外的能量才能在推测失误时恢复原来的状态。这样的度量导致许多人得出结论,架构师需要一种不同的方法来实现性能改进。于是多核时代就这样诞生了。
多核将识别并行性和决定如何利用并行性的责任转移给程序员和语言系统。多核并不能解决由登纳德缩放定律终结带来的能效计算挑战。每个活跃的核都会消耗能量,无论其对计算是否具有有效贡献。一个主要的障碍可以用阿姆达尔定律(Amdahl\'s Law)表述,该定理认为,并行计算机的加速受限于序列计算的部分。这一定律的重要性参见图 5。图中显示,假设串行执行的不同部分只有一个处理器处于活跃状态,那么与单个内核相比,最多 64 个内核的应用程序运行速度要快得多。例如,如果只有 1% 的时间是串行的,那么 64 核配置可加速大约 35 倍,所需能量与 64 个处理器成正比,因此大约有 45% 的能量被浪费了。
备注:从上图也可以看出,如果有 8% 的时间是串行的,那么 64 核配置仅可加速 10倍多一点。想详细理解这部分可结合文章开头 阿姆达尔定律公式S=1/(1-a+a/n) :1%的串行时间,意味着a=0.99;n是并行数
真实的程序结构当然会更加复杂,部分组件允许在给定时刻使用不同数量的处理器。然而,周期性通信和同步的需求意味着大部分应用具备仅可高效使用一部分处理器的组件。尽管阿姆达尔定律已经出现 50 多年了,它仍然是一个很大的障碍。
随着登纳德缩放定律的终结,芯片内核数量的增加意味着能耗也随之增加。然而,进入处理器的电能肯定有一部分会转化为热能。因此多核处理器受限于热耗散功率(TDP),即封装和冷却系统可以移除的平均功率。尽管一些高端数据中心可能使用更先进的封装和冷却技术,但没有一个计算机用户想要在自己桌子上放置小型热交换器,或者背着散热器来冷却手机。TDP 的局限性直接导致了「暗硅」(dark silicon)时代,处理器降低时钟速率、关闭空闲内核来防止过热。这种方法的另一种解释是:一些芯片可以重新分配其珍贵功耗,将其从空闲内核转移到活跃内核。
登纳德缩放定律结束、摩尔定律衰退,而阿姆达尔定律正当其时,这意味着低效性将每年的性能改进限制在几个百分点(见图 6)。获得更高的性能改进(像 20 世纪八九十年代那样)需要新的架构方法,新方法应能更加高效地利用集成电路。接下来我们将讨论现代计算机的另一个主要缺陷——计算机安全问题,之后我们会回来探讨有效的新方法。
20 世纪 70 年代,处理器架构师主要专注于计算机安全,涉及保护环、容量等概念。这些架构师深刻了解到,大部分 bug 存在于软件中,但他们认为架构支持会有所帮助。操作系统大部分未使用这些功能,操作系统专注于良性环境(如个人电脑),因此具备较大开销的功能未被使用。在软件社区中,很多人认为微内核(microkernel)等正式验证技术会为构建高度安全的软件提供有效保障。但不幸的是,我们的软件系统规模和性能驱动器意味着此类技术无法跟上处理器性能。结果就是大型软件系统仍然有很多安全漏洞,且由于海量在线个人信息和云计算的使用,其影响被放大。
登纳德缩放定律的终结意味着架构师必须找到利用并行化的更高效方式。
尽管计算机架构师等很晚才意识到安全的重要性,但他们已经开始对虚拟机和加密提供硬件支持。不幸的是,推测给许多处理器带来了一个未知但重要的安全缺陷。具体来看,Meltdown 和 Spectre 安全漏洞给微架构带来了新的缺陷,使受保护信息遭到泄露。这两种漏洞都使用了旁路攻击。2018 年,研究者展示了在攻击者不将代码加载到目标处理器的情况下,如何利用 Spectre 变体导致网络信息泄露。尽管这次名为 NetSpectre 的攻击泄露信息速度较慢,但它使同一局域网中的所有机器都受到攻击,这造成了很多新的难题。虚拟机架构还有两个漏洞。一个是 Foreshadow,会影响专门保护高风险数据(如加密密钥)的英特尔 SGX 安全机制。每个月都会发现新的漏洞。
旁路攻击并非新鲜事,但是在最早期的案例中,促使旁路攻击成功的是软件缺陷。而在 Meltdown、Spectre 等攻击中,硬件实现中的缺陷导致受保护信息泄露。这是处理器架构师定义什么是 ISA 正确实现的一个基本难题,因为标准定义中并未提及执行指令序列的性能影响,而仅仅涉及 ISA-visible 执行架构状态。架构师需要重新思考对 ISA 正确实现的定义,以避免此类安全漏洞。同时,他们还应该重新思考对计算机安全的侧重点,以及架构师如何与软件设计师一道实现更加安全的系统。架构师(以及每个人)都过于依赖信息系统,以至于对安全的重视程度不如对一流设计的关注。
「我们的机遇就在那些『无解问题』之中。」——John Gardner, 1965
通用处理器固有的低效性,以及登纳德缩放定律和摩尔定律的终结,使得处理器架构师和设计师很可能无法维持通用处理器中的显著性能改进。鉴于改进性能对新的软件能力的重要性,我们必须问:有没有其他的有效方法?
现在有两个很明确的机会,把二者结合起来则是第三个机会。首先,现有的软件构建技术广泛使用具备动态类型和存储管理的高级语言。但是,此类语言的解释和执行通常非常低效。Leiserson 等人使用一个小例子(执行矩阵相乘)说明了这种低效性。如图 7 所示,简单地将 Python 语言代码重写为 C 代码就可以将性能提升 46 倍(Python 是典型的高级、动态类型语言)。
在多核上运行并行循环(parallel loops)又将性能提升接近 7 倍。优化内存配置又将性能提升了近 19 倍,而通过单指令多数据(SIMD)并行化操作(一个指令执行 16 个 32-bit 运算)的硬件扩展,性能又提升了 8 倍多。也就是说,最终的高度优化版本在多核英特尔处理器上的运行速度是初始 Python 版本的 62,000 多倍。这当然只是一个很小的例子,但我们会期望程序员使用优化库。尽管这夸大了常见的性能差距,但很多程序的性能差距可能达到 100 到 1000 倍。
一个有趣的研究方向有关是否可以使用新的编译器技术来缩短性能差距(可以辅以体系架构增强)。尽管高效编译和实现 Python 这样的高级脚本语言比较困难,但潜在的收益是巨大的。即使实现 25% 的提升潜力,也能让 Python 程序的运行速度提升百倍。这个简单的例子展示了现代语言中,程序员强调生产力和传统方法强调性能之间的巨大差距。
特定领域的体系结构(备注:Domain-specific architectures,缩写为DSA)。
一种更加以硬件为中心的设计思路是设计针对特定问题和领域的架构,并给与它们强大(且高效)的性能,因此它们是「特定领域的体系结构(DSA)」,这是一种特定领域的可编程处理器,通常是图灵完备的,但针对特定类别的应用进行了定制。从这个意义上来说,它们与专用集成电路(ASIC)不同,后者仅适用于单一功能,代码很少有变化。DSA 通常被称为加速器,因为与在通用 CPU 上执行整个应用程序相比,它们可以加速某些应用程序。此外,DSA 可以实现更好的性能,因为它们更贴近应用的实际需求;DSA 的例子包括图形加速单元(即 GPU),用于深度学习的神经网络处理器,以及软件定义处理器(SDN)。DSA 效率更高,能耗更低是因为以下四个原因:
第一,DSA 为特定领域的计算使用了更加有效的并行形式。例如单指令多数据并行(SIMD)比多指令多数据(MIMD)更有效,因为它在一个时钟步长内只需处理一个指令流和处理单元。尽管 SIMD 相比 MIMD 没那么灵活,但前者适用于很多 DSA。DSA 也可以使用 VLIW 方法来实现 ILP,而不是推测性的无序机制。如前文所述,VLIW 处理器与通用性代码不匹配,但对于有限领域更加有效,因为它的控制机制更加简单。特别是大多数高端通用处理器都是超标量的,需要复杂的控制逻辑来启动和完成指令。与之相对的是,VLIW 在编译时执行必要的分析和调度,这对于显式并行程序来说可以很好地工作。
第二,DSA 可以更有效地利用内存层次结构。如 Horowitz 所述,内存访问要比算数计算的成本高出很多。例如,访问 32 千字节缓存需要的能量相当于做 32 位加法的大约 200 倍。这种巨大的差异使得优化存储器访问对于实现高能效来说至关重要。通用处理器的运行代码,其中的存储器访问通常表现出空间和时间局部性,但在编译时不是非常可预测的。因此,CPU 使用多级高速缓存来增加带宽,并隐藏相对较慢的芯片外 DRAM 延迟。这些多级高速缓存通常消耗大约一半的处理器能量,但几乎忽略了所有片外 DRAM 访问,这些访问需要大约 10 倍于最后一级高速缓存访问的能量。
缓存有两大缺点:
当数据集非常大的时候,时间空间位置较低时缓存的工作效率很低; 当缓存工作效率高的时候,位置非常高,这意味着同时根据定义,大多数缓存在大多数时间都处于空闲状态。
在那些编译时可以很好地定义和发现内存访问模式的应用程序中——这对于典型的 DSL(Domain-Specific Languages,特定领域的语言)来说是常见的——程序员和编译器可以比动态分配的缓存更好地优化内存的使用。因此,DSA 通常使用由软件明确控制运动的存储器层次,类似于矢量处理器的操作。对于合适的应用,用户控制的存储器可以比高速缓存使用更少的能量。
第三,DSA 在可接受时可以使用较低的精度。适用于通用任务的 CPU 通常支持 32 和 64 位整型数和浮点数数据。对于很多机器学习和图像应用来说,这种准确率有点浪费了。例如在深度神经网络中(DNN),推理通常使用 4、8 或 16 位整型数,从而提高数据和计算吞吐量。同样,对于 DNN 训练程序,浮点数很有意义,但 32 位就够了,16 为经常也能用。
最后,DSA 受益于以特定领域语言(DSL)编写的目标程序,这些程序可以实现更高的并行性,更好的内存结构访问和表示,并使应用程序更有效地映射到特定域的处理器。
DSA 要求将高级运算定位到体系架构中,但一般尝试从 Python、Java、C 或 Fortran 等通用语言抽取结构和信息实在太难了。因此特定领域的语言(DSL)特别支持这一过程,并尽可能高效地编程 DSA。例如 DSL 可以令向量、密集型矩阵和稀疏性矩阵运算变得显式化,并允许 DSL 编译器高效地将运算映射到处理器中。DSL 有很多常见的例子,例如专注矩阵运算的语言 Matlab、专注 DNN 编程的数据流语言 TensorFlow,以及专注编程 SDN 的语言 P4 和专注图像处理中高级转换的 Halide 等。
使用 DSL 的挑战是如何保证足够的架构独立性,使得 DSL 中编写的的软件可以移植到不同的架构,同时软件映射到底层 DSA 的效率还要非常高。例如 XLA 系统将 TensorFLow 代码转化为能使用 GPU 或 TPU 等异构处理器的计算图。DSA 之间的平衡可移植性以及效率是编程语言设计者、编译器设计者和 DSA 架构师都感兴趣的研究领域。
作为 DSA 的示例,我们可以考虑谷歌 TPU 1 的设计,它旨在加速神经网络的推断过程。TPU 自 2015 年投入生产,它从搜索引擎到语言翻译和图像识别支持着谷歌各种各样的业务,同时也支持着 AlphaGo 和 AlphaZero 等 DeepMind 前沿研究。
TPU 的目标是提升深度神经网络推断过程的性能与能源效率 10 倍。
如下图 8 所示,TPU 的组织架构与通用处理器完全不同。它的主计算单元是矩阵单元,即每个时钟周期提供提供 256×256 乘加运算的脉动阵列(systolic array)。TPU 还结合了 8-bit 精度、高效脉动架构(systolic structure)和 SIMD 控制特性,这意味着每个时钟周期所能执行的乘加(multiply-accumulates)数是一般通用单核 CPU 的 100 倍。
TPU 使用 24MB 的本地内存以代替高速缓存,大约是 2015 年相同功耗 CPU 的两倍。最后,激活值内存和权重内存(包括储存权重的 FIFO 结构)可以通过用户控制的高带宽内存通道连接。使用谷歌数据中心常见的 6 个推断问题的加权算术均值作为度量,TPU 比一般 CPU 要快 29 倍。因为 TPU 要求的能源少了一半,它的能源效率在这样的工作负载中是一般 CPU 的 80 倍。
我们考虑了两种不同的通过提升硬件技术效率来提升编程性能的方法:首先,通过提升现代高级语言的性能;其次,通过构建领域特定的相比通用 CPU 能显著提升性能和效率的架构。DSL 是另一个如何改进支持 DSA 等架构创新的硬件/软件接口的例子。要通过这些方法获得显著收益将需要一个垂直集成的设计团队,该团队了解应用程序、领域特定的语言和相关的编译器技术、计算机体系结构、组织以及底层实现技术。在行业横向结构化之前,需要在跨抽象层次上垂直集成并做出设计决策,这是计算机技术研发早期的主要特征。在这个新时代,垂直整合变得更加重要,能够检查和进行复杂权衡以及优化的团队将会受益。
GPU:英伟达 GPU 使用了很多核心,每个核心都有大型寄存器文件、很多硬件线程和缓存; TPU:谷歌 TPU 依赖于大型二维收缩乘法器和板载内存的硬件控制; FPGA:微软在其数据中心里部署了现场可编程门阵列器件(FPGA),专用于神经网络应用; CPU:英特尔提供通过大型高级缓存和一维 SIMD 指令增强的带有很多核心的 CPU,微软使用的 FPGA,以及一种新型的神经网络处理器,这种处理器相比 CPU 更加接近 TPU。
除了这些大企业外,还有数十家创业公司正在推行自己的方案。为了满足不断增长的需求,架构工程师正在将数百到数千个此类芯片互连以形成神经网络超级计算机。
DNN 架构的雪崩式涌现使计算机架构领域进入了一个有趣的时代。在 2019 年很难预测这些方向中哪些(或者即使有)会赢,但市场肯定会像在解决过去的架构争论一样解决竞争问题。
受开源软件成功的启发,计算机架构的第二个机会是开放的 ISA(Instruction Set Architecture,指令集合架构)。要创建处理器中的「Linux」,该领域需要行业标准的开放式 ISA,除了拥有专利技术的个别公司以外,社区可以创建开源核心。如果许多组织使用相同的 ISA 设计处理器,那么更大的竞争可能会推动更快的创新。目标是为芯片提供处理器,成本从几美分到 100 美元不等。
第一个例子是 RISC-V(称为「RISC Five」),这是加州大学伯克利分校开发的第五个 RISC 架构。RISC-V 有一个社区,在 RISC-V 基金会的管理下维护架构。开放性允许 ISA 在公开环境中演变,硬件和软件专家在决策最终确定之前进行协作。开放式基金的另一个好处是 ISA 不太可能主要出于营销原因而扩展,这有时是专有指令集扩展的唯一原因。
RISC-V 是一个模块化指令集。一小部分指令运行完整的开源软件堆栈,然后是可选的标准扩展,设计人员可以根据需要包含或省略。该基础包括 32 位地址和 64 位地址版本。RISC-V 只能通过可选扩展来增长;即使架构师不接受新的扩展,软件堆栈仍然运行良好。专有架构通常需要向上的二进制兼容性,这意味着当处理器公司添加新功能时,所有未来的处理器也必须包含它。对于 RISC-V,情况并非如此,所有增强功能都是可选的,如果应用程序不需要,可以删除。以下是目前为止的标准扩展,使用代表其全名的缩写:
M. 整型数乘法/除法; A. 原子内存操作; F/D. 单/双精度浮点数; C. 压缩指令。
更少指令。RISC-V 的指令少得多。base 中有 50 个指令,与原始 RISC-I 相近。剩余的标准扩展(M、A、F 和 D)增加了 53 条指令,再加上 C 又增加了 34 条,共计 137 条。ARMv8 有超过 500 条指令。
更少的指令格式。RISC-V 的指令格式非常少,只有六种,而 ARMv8 至少有 14 种。
简单性减少了设计处理器和验证硬件正确性的工作量。由于 RISC-V 的目标范围覆盖了数据中心芯片到物联网设备,因此设计验证可能是开发成本的重要组成部分。
RISC-V 是一种简洁的设计,诞生 25 年后,它的设计师从其前辈的错误中吸取了教训。与第一代 RISC 架构不同,它避免了微架构或技术依赖的功能(例如延迟分支和延迟加载)或创新(例如寄存器窗口),这些功能被编译器技术的进步所取代。
最后,RISC-V 通过为自定义加速器保留大量操作码空间来支持 DSA。
安全专家不相信不可见的安全性,因此开放式实现很有吸引力,开放式实现需要开放式架构。
除 RISC-V 外,英伟达 2017 年还宣布一个免费开放的架构,称之为英伟达深度学习加速器(NVDLA),这是一种可扩展的可配置 DSA,用于机器学习推理。配置选项包括数据类型(int8、int16 或 fp16)和二维乘法矩阵的大小。模具尺寸从 0.5 mm^2 到 3 mm^2,功率从 20 毫瓦到 300 毫瓦。ISA、软件堆栈和实现都是开放的。
开放的简单架构与安全性具有协同作用。首先,安全专家不相信安全性,因此开放式实现很有吸引力,而开放式实现需要开放式架构。同样重要的是增加可以围绕安全架构进行创新的人员和组织的数量。专有架构限制了员工的参与,但开放式架构允许学术界和工业界的所有最佳人才帮助提高安全性。最后,RISC-V 的简单性使其实现更容易检查。此外,开放式架构、实现、软件堆栈以及 FPGA 的可塑性意味着架构师可以在线部署和评估新颖的解决方案,并每周而不是每年迭代它们。虽然 FPGA 比定制芯片慢 10 倍,但这种性能仍然足以支持在线用户,同时带来安全创新,解决真正的攻击。我们希望开放式架构成为架构师和安全专家进行硬件/软件协同设计的典范。
Beck 等人 2001 年提出的《敏捷软件开发宣言》(The Manifesto for Agile Software Development)彻底改变了软件开发方式,克服了瀑布式开发中传统精细规划和文档的频繁失败。小型编程团队很快开发了有用但不完整的原型,并在进行下一次迭代之前获得了顾客的反馈。敏捷开发的 scrum 版本集合了 5 到 10 名程序员组成的团队,每次迭代进行 2 到 4 周的冲刺。
再次受到软件开发成功的启发,第三次机会是敏捷硬件开发。对架构师来说的一个好消息是,当代电子计算机辅助设计(ECAD)工具提高了抽象水平,使得敏捷开发成为可能,而且这种更高水平的抽象增加了设计的重用性。
考虑到从设计交付到返回芯片所需的几个月时间,称硬件只需四周的冲刺时间似乎有些不太可信。图 9 概述了敏捷开发方法是如何通过在适当的层上改变原型起作用的。最内层是软件模拟器,如果模拟器能够满足迭代需求,这是进行更改的最方便快捷的地方。第二层是 FPGA,其运行速度是具体软件模拟器的数百倍。FPGA 可以运行操作系统和完整的基准测试(像那些来自标准性能评估公司的测试),允许对原型进行更精确的评估。亚马逊在云端提供了 FPGA,所以架构师们可以使用 FPGA,而无需购买硬件和建立实验室。为了记录芯片面积和功率的数字,第三层使用 ECAD 工具生成芯片布局。即使在工具运行之后,在准备制造新的处理器之前,也需要进行一些手动步骤来完善结果。处理器设计者将第四层称为「tape in」。前四个层都支持四周冲刺。
出于研究目的,我们可以在 tape in 上停下来,因为面积、能量和性能估计非常准确。但这就像是在长跑比赛中在离终点约 100 米的地方停下来一样,因为跑步者可以准确预测最后时间。虽然在准备比赛方面下足了功夫,跑步者仍会错过穿过终点线的兴奋和满足感。硬件工程师相较于软件工程师的一个优势是,他们搭建的是实物。测量芯片,运行真正的程序,然后向朋友家人展示,这是硬件设计的一大乐趣。
很多研究者觉得必须停下来,因为制造芯片的成本太过高昂。当设计作品很小时,它们出奇地便宜。架构师只要花 14,000 美元就可以订购 100 个大小为 1 平方毫米的芯片。在 28 纳米制程上,1 平方毫米的芯片可以容纳数百万晶体管,这对 RISC-V 处理器和 NVLDA 处理器来说足够大了。如果设计者的目标是设计一个较大的芯片,那最外层的成本将非常高,体系架构设计者可以用很多小芯片来阐述很多新想法。
「最黑暗的时刻,是黎明来临之前。」——Thomas Fuller, 1650
要从历史教训中获益,架构设计者们必须意识到软件创新也能激励架构发展,而提高硬件/软件界面的抽象水平会带来创新的机会,市场最终会解决计算机架构的争论。iAPX-432 和 Itanium 说明了架构投入如何超过回报,而 S/360、8086 和 ARM 则连续数十年带来很高的回报,而且将继续下去。
登纳德缩放定律和摩尔定律的终结,以及标准微处理器性能提升的减速并非必须解决的问题,而是公认的事实。这一事实也提供了惊人的机会。高级、特定领域的语言和架构将架构师从专有指令集的链条中释放出来,公众也提高了对安全性的需求,所有这些将为计算机架构师带来一个新的黄金时代。借助开源生态系统,敏捷开发的芯片将展示其进步,从而加速商业应用。这些芯片中通用处理器的 ISA 理念很可能是 RISC,后者经受住了时间的考验。我们期待着这次能与上一个黄金时代一样快速改善,不过这次是在成本、能源、安全以及性能方面的改善。
未来十年,将会有一场新计算机架构的寒武纪爆炸,这对业界和学界的架构师们来说将是激动人心的时刻。
参考原文:
https://cacm.acm.org/magazines/2019/2/234352-a-new-golden-age-for-computer-architecture/fulltext
推荐阅读:
不是你需要中台,而是一名合格的架构师(附各大厂中台建设PPT)