『译』计算机体系结构发展史(三)

c19ba630d07d2e8d8c8869036278bde0.png

系列文章第三篇(对应M.4)


往期文章

『译』计算机体系结构发展史(一)

『译』计算机体系结构发展史(二)


M.4 The Evolution of Instruction Sets (Appendices A, J, and K)


One’s eyebrows should rise whenever a future architecture is developed with a stack- or register-oriented instruction set.

Meyers [1978, p. 20]

最早的计算机,包括UNIVAC I,EDSAC和IAS计算机,都是基于累加器的架构。由于当时硬件资源非常紧张,选择这种非常简单的架构是很自然的。第一台基于寄存器的通用计算机是由Ferranti,Ltd.于1956年制造的Pegasus。Pegasus具有八个通用寄存器,R0始终为零。该计算机的块传输功能可以从感光鼓存储器(drum memory)中加载八个寄存器。

Stack Architectures

1963年,Burroughs交付了B5000。B5000可能是第一台认真思考过软件开发问题,并使用了软硬件折衷方案的计算机。Barton和其他Burroughs的设计师在B5000中使用了堆栈架构(stack architecture)(如Barton [1961]中所述)。这种体系结构旨在支持诸如ALGOL之类的高级语言,它使用以高级语言编写的操作系统(MCP)。B5000也是美国制造商提供的第一台支持虚拟内存的计算机。B6500于1968年推出(在Hauck and Dent [1968]中进行了讨论),添加了硬件管理的活动记录(activation records)。在B5000和B6500中,堆栈的顶部两个元素都保留在处理器中,而其余部分则保留在内存中。堆栈架构可以实现良好的代码密度(code density),问题是仅有两个数据使用了高速存储(寄存器)。原始IBM 360论文[Amdahl,Blaauw and Brooks 1964]和原始PDP-11论文[Bell  et al. 1970]反对这种架构。他们的论证中提到了三个主要观点:

  • 处理器的性能源自高速访问的寄存器,而不是其使用方式。

  • 堆栈架构过于局限,需要进行许多交换(swap)和复制(copy)操作。

  • 堆栈有底部,而将其放在较慢的内存中会降低性能。

基于堆栈架构的硬件在1970年代末期不再受欢迎,除了在Intel 80x86浮点架构中使用外,它基本上消失了。除了80x86外,SPEC测试报告中列出的所有计算机均不使用堆栈架构。

然而,在1990年代,随着Java虚拟机(JVM)的成功,堆栈架构又火了一把。JVM是Java编译器产生的一种中间语言的软件解释器,这种中间语言称为Java字节码(Java bytecodes)[Lindholm and Yellin 1999]。解释器的目的是在不同平台之间提供软件兼容性,以实现“编程一次,即可在任何地方运行”。尽管由于采用解释的方式,运行速度下降了大约10倍,但很多时候兼容性比性能更重要,例如,将Java“小程序”下载到浏览器的时候。

尽管少数人提出了直接执行JVM指令的硬件(McGhan and O’Connor [1998]),但到目前为止,这些方案并没有太多商业上的意义。人们更希望Java的即时编译器(just-in-time Java compiler)(在运行时将Java程序编译为运行该程序的计算机自身的指令集)能够克服解释模式的性能损失。Java的流行导致各种编译器的出现,它们可以直接把Java程序编译为本机指令,从而绕开了Java字节码。

Computer Architecture Defined

IBM在1960年代初创造了computer architecture一词。Amdahl,Blaauw,and Brooks [1964]使用该术语指代IBM 360指令集中程序员可见部分。他们认为,具有相同体系结构的计算机系列应该能够运行相同的软件。尽管这个想法在今天对我们来说显而易见,但在当时还是非常新颖的。尽管IBM是该行业的领先公司,但在360之前有五种不同的体系结构。因此,公司标准化单一体系结构的想法在当时是相当激进的。360的设计师们希望,定义一个通用的体系结构可以将IBM的六个部门合并在一起。他们对体系结构的定义如下:

… the structure of a computer that a machine language programmer must understand to write a correct (timing independent) program for that machine.

machine language programmer”的提法意味着,即使在机器语言层面,也应当保持兼容性。而“timing independent”则意味着相同的指令集可以有不同的硬件实现。这种体系结构的定义为二进制兼容性开辟了道路,后来其它计算机也遵循了这种兼容性。

IBM 360是第一台大量销售的计算机,它使用了8比特字节实现字节寻址和通用寄存器。360还具有寄存器-内存(register-memory)指令和有限的内存-内存(memory-memory)指令。附录K总结了该指令集。

1964年,Control Data公司交付了第一台超级计算机CDC6600。正如Thornton [1964]中所介绍的,Thornton自己,Cray和其他的6600设计师是最早深入探索流水线技术的人。6600是第一台通用的,载入-存储(load-store)计算机。60年代,6600的设计师意识到,为让流水线工作更有效,应当简化体系结构。70年代,微处理器和小型计算机设计人员很大程度上忽略了体系结构的简单性与硬件实现之间的这种相互作用。但到了80年代,这种趋势又回来了。

High-Level Language Computer Architecture

在60年代末和70年代初,人们意识到软件成本的增长速度快于硬件成本。McKeeman [1967]认为编译器和操作系统变得过于庞大和复杂,开发时间太长。由于编译器能力和计算机内存的限制,当时大多数系统程序仍是用汇编语言编写的。许多研究人员建议,设计功能更强大,面向软件的体系结构来缓解软件危机。Tanenbaum [1978]研究了高级语言的属性。像其他研究人员一样,他发现实际上大多数程序并不复杂。他认为架构设计时应考虑到这一点,并应针对程序代码大小和易于编译进行优化。Tanenbaum提出了一种根据指令使用频率来进行指令编码(frequency-encoded)的堆栈计算机来实现这些目标。但是,正如我们所观察到的那样,代码大小的优化并不能直接转化为成本效益,堆栈计算机在完成这项工作后不久就淡出了。

Strecker的文章[1978]讨论了他和DEC的其他架构师如何通过设计VAX架构来解决前面描述的问题。VAX旨在简化高级语言的编译。编译器的设计者抱怨PDP-11的指令集缺乏完全的正交性(complete orthogonality)。VAX体系结构被设计为高度正交,并允许将高级语言语句映射到单个VAX指令中。此外,由于已编译后的程序相对于可用的内存通常过大,因此VAX设计人员试图优化代码大小。附录K总结了此指令集。

VAX-11/780是VAX系列中的第一台计算机。它是有史以来最成功,研究最多的计算机之一。DEC战略的基础是在单一体系结构VAX上运行单一操作系统VMS。此策略在之后的10年中运作良好。这期间出现大量关于VAX的指令组合,实现的评测和分析的论文,这使其成为理想的研究案例 [Clark and Levy 1982; Wiecek 1982]。Bhandarkar and Clark [1991]对VAX与RISC计算机的劣势进行了定量分析,本质上是从技术上解释了VAX最终消亡的原因。

在设计VAX的同时,研究界还倡导一种更高级的方法,称为高级语言计算机体系结构(high-level language computer architecture HLLCA)。这项运动旨在通过使硬件“上升到”编程语言的水平,从而消除高级语言和计算机硬件之间的鸿沟Gagliardi [1973]称之为“语义鸿沟(semantic gap)”。Meyers [1982]对高级语言体系结构项目的论点和历史进行了很好的总结。HLLCA从未产生过重大的商业影响。计算机内存容量的增加消除了高级语言引起的代码大小(code size)问题,并使得操作系统可以用高级语言来编写。最终,更简单的体系结构与软件的结合,以更低的成本和复杂度提供了更高的性能和更好的灵活性。 

Reduced Instruction Set Computers

在80年代初期,计算机体系结构开始偏离为编程语言提供高层次硬件支持的方向。Ditzel and Patterson [1980]分析了高级语言体系结构遇到的困难,并指出答案在于更简单的体系结构。在另一篇论文中[Patterson and Ditzel 1980],作者第一次讨论了Reduced Instruction Set Computers精简指令集计算机(RISC)的概念,并提出应使用更简单的架构的观点。VAX架构师Clark and Strecker [1980]则反驳了这一思想。

诸如MIPS之类的简单的载入-存储(load-store)计算机通常称为RISC架构。RISC架构的起源可以追溯到6600之类的计算机,Thornton,Cray和其他人都意识到,在设计高速计算机方面,简化指令集非常重要。Cray延续了他在CRAY-1中保持计算机尽量简单的传统。商业的RISC计算机主要建立在三个研究项目的基础之上:伯克利的RISC处理器,IBM 801和斯坦福MIPS处理器。这些体系结构声称其性能是使用相同工艺的其他计算机的2到5倍,引起了产业界的巨大兴趣。

在这些项目当中,始于1975年的IBM项目是第一个启动,但最后一个公开的。IBM的计算机被设计为24位基于发射极耦合逻辑(ECL,emitter coupled logic)电路的小型计算机,而大学项目都是基于MOS电路的32位微处理器。John Cocke被认为是801设计之父,为了表彰他的贡献,他被同时授予Eckert–Mauchly奖和图灵奖。Radin [1982]描述了801体系结构的亮点。801是一个实验性项目,从未设计成产品。为了降低成本和复杂性,该计算机仅使用了24位的寄存器。

1980年,帕特森(Patterson)和他在伯克利(Berkeley)的同事开始了赋予RISC体系结构这一名称的项目(Patterson and Ditzel [1980])。他们建造了两台名为RISC-I和RISC-II的计算机。由于IBM项目尚未广为人知,伯克利小组在推广RISC方法方面所扮演的角色对于该技术被广泛接受至关重要。他们还设计了第一个支持混合RISC指令格式的指令高速缓存(Patterson et al.[1983])。它在内存中支持16位和32位指令,但在缓存中支持32位。之后,伯克利小组继续设计了针对Smalltalk(Ungar et al.[1984]),和LISP(Taylor et al. [1986])的RISC计算机。 

1981年,Hennessy和他在斯坦福大学的同事发表了对斯坦福MIPS计算机的描述。有效的流水线化和编译器辅助的流水线调度都是最初MIPS设计的重要方面。MIPS代表了不带互锁流水线级(Interlocked Pipeline Stages)的微处理器,编译器能够处理依赖关系,而不需要硬件来使流水线停顿(stall)。

这些早期的RISC计算机(801,RISC-II和MIPS)有很多共同点。两个大学项目的兴趣点在于,可以在大学环境中,基于VLSI(Very-Large-scale integration)技术构建简单的计算机。所有三台计算机都使用简单的load-store架构和固定格式的32位指令,并强调有效的流水线设计。Patterson [1985]讨论了这三台计算机以及定义RISC计算机的基本设计原理,Hennessy [1984]从另一个角度提供了相同的观点,同时讨论了VLSI处理器设计中的其它问题。

1985年,Hennessy发表了有关RISC性能优势的讨论,并将其根源归结为CPI大大降低:RISC处理器的CPI低于2,而VAX-11/780的CPI则高于10(尽管工作负载不完全相同)。Emer and Clark [1984]的一篇论文描述了VAX-11/780的性能,有助于RISC研究人员分析他们看到的性能优势的来源。

大学项目完成后,在1983年至1984年间,RISC技术已被业界广泛接受。许多早期的计算机制造商声称他们的产品(1986年之前制造的)是RISC计算机。但是,这些说法通常是出于营销目的而不是真正的工程现实。

1986年,计算机行业开始发布基于三个RISC研究项目所探索的技术的处理器。Moussouris et al. [1986]描述了MIPS R2000整数处理器,而Kane的书籍[1986]提供了对该体系结构的完整介绍。惠普将其现有的微型计算机产品线转换为RISC架构。Lee [1989]描述了惠普的Precision架构。IBM从未直接将801变成产品,取而代之的是,801探索的想法被应用到一种新的,低端的体系结构,该体系结构最终融入IBM RT-PC,并在一系列论文中进行了讨论[Waters 1986]。1990年,IBM宣布了新的RISC架构(RS 6000),这是第一款超标量RISC处理器。1987年,Sun Microsystems开始交付基于SPARC体系结构的计算机,该体系结构是Berkeley RISC-II处理器的衍生产品。SPARC在Garner等人的文章中有所描述[1988]。PowerPC则是由Apple,IBM和Motorola组成的联盟所推出的。附录K总结了几种RISC体系结构。

为了辅助解决RISC架构与传统设计之间的争论,VAX处理器的设计者随后基于可对比实现(implementations with comparable organizations)对VAX和RISC处理器进行了定量比较。他们的选择是VAX 8700和MIPS M2000。VAX和MIPS不同的设计目标导致了截然不同的体系结构。VAX的目标是,简单的编译器和高代码密度,结果是使用了强大的寻址模式,强大的指令,有效的指令编码和少量的寄存器。MIPS的目标是通过流水线实现高性能,简化硬件实现并与高度优化的编译器兼容;而这些目标的结果是,简单的指令,简单的寻址模式,固定长度的指令格式和大量的寄存器。

图M.1显示了执行指令数的比率,CPI的比率以及以时钟周期衡量的性能比率。由于实现的组织方式相似,因此假定时钟周期相同。MIPS执行的指令数量大约是VAX的两倍,而VAX的CPI大约是MIPS的六倍。因此,MIPS M2000的性能几乎是VAX 8700的三倍。此外,实现MIPS处理器所需的硬件比VAX处理器少得多。这种成本性能的差距导致以前制造VAX的公司推出基于MIPS的产品,然后完全放弃了VAX并转而使用与MIPS十分相似的Alpha处理器。Bell and Strecker [1998]总结了公司内部的争论。DEC曾经是第二大计算机公司,并且在小型机行业取得了巨大的成功,而现在则仅仅是惠普和英特尔内部的一部分。 

dc2b78d5f76f7c1c863388a317752808.png

图M.1使用SPEC89程序分析的MIPS M2000与VAX 8700执行指令以及时钟周期性能的比率。平均而言,MIPS执行的指令数量是VAX的两倍多,但VAX的CPI几乎是MIPS CPI的六倍,因此MIPS有几乎三倍的性能优势。(基于Bhandarkar and Clark [1991]的数据。) 

回顾过去,只有一个CISC(Complex Instruction Set Computer)的指令集(80x86)在RISC/CISC辩论中幸存下来,并且它与PC软件具有二进制兼容性。在PC行业中,使用芯片的数量巨大,以至于有足够的收入来支付额外的设计成本(以及摩尔定律带来的足够资源),从而在内部实现从CISC到RISC的转换。无论效率如何降低(使用更长的流水线和更大的芯片尺寸来支持芯片上的翻译),都可以通过巨大的芯片尺寸和专用于该产品的芯片生产工艺来克服。

有趣的是,英特尔也得出结论,认为80x86系列产品的未来值得怀疑。他们设计了IA-64体系结构,以支持64位寻址并转移到RISC方式的指令集。在Itanium-1和Itanium-2中IA-64(Huck et al.[2000])的实施取得了部分的成功。尽管实现了浮点应用的高性能,但整数性能相对平庸。此外,Itanium的实现在晶体管数量,芯片尺寸和功耗方面都非常巨大。IA-64指令集的复杂性,至少部分与RISC哲学有冲突,这无疑是导致面积和功耗效率低下的原因。

与Intel不同,AMD决定仅将体系结构从32位地址扩展到64位地址,类似于Intel在80386将其从16位地址扩展到32位地址时所做的那样。英特尔后来也效仿了AMD。In the end, the tremendous marketplace advantage of the 80x86 presencewas too much even for Intel, the owner of this legacy, to overcome!

- 第三部分完 -


参考资料见『译』计算机体系结构发展史(三)

f49416bc8d272aad1c2b8c06cfcdcce2.jpeg


题图由stable diffusion生成

prompt: a beautiful oil and canvas painting of computers and networks technology, abstract, by rembrandt, trending on artstation

本文为个人兴趣之作,仅代表本人观点,与就职单位无关

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值