既是要回顾计算机的发展,那必然绕不开著名的摩尔定律。当然摩尔定律想必已是闻名天下,但除此之外在体系结构领域内,还有一个定律叫Dennard Scaling,相对而言不是那么有名。
此外还有一个绝对绕不开的,那就是著名的冯诺伊曼结构。比较巧合的是,体系结构领域内也有一个与之对应、却不太出名的,叫哈佛结构。
相同面积的集成电路里,晶体管数目每18-24个月会增加一倍【1】
值得注意的是,摩尔定律只是一个经验定律,只具有统计学上的意义,而不是一个绝对的法则。目前摩尔定律已经失效了,即晶体管数量的增长已经放缓了。若把18-24个月翻一倍换算成每年的增长速度,则是大约每年翻1.4倍到1.5倍,则增长速度的变化大致如下。
1977年到1997年,平均每年翻1.46倍1997年到2017年,平均每年翻1.34倍 而在2012年到2017年,每年仅翻1.1倍,摩尔定律已不复存在在摩尔定律的作用下,计算机体系结构的发展经历了三个阶段【2】
第1阶段:晶体管不够用 彼时芯片集成度还很低,有限的晶体管数量限制了系统结构的设计 第2阶段:更多、更快、更省电 ”更多“即越来越多的晶体管,使得系统结构设计可以大展身手”更快“是晶体管尺寸不断减小,开关速度不断加快,芯片频率也越来越高”更省电“是随着工艺的进步,工作电压越来越低,负载电容也在降低, 第3阶段:复杂、不快、不省电 ”复杂“是纳米级工艺给物理设计带来的巨大难度,如连线之间的相互干扰、工艺带来的片内漂移问题等等。此外过多的晶体管数目也加大了设计、验证测试的难度。”不快“指的是频率很难再提高了”不省电”则有三方面原因:漏电功耗不断增加乃至不可忽视、晶体管阈值电压很难再降低、连线功耗占主导而不是晶体管功耗在第2阶段中正是摩尔定律最为有效的阶段,此时系统结构的设计主要集中在ILP(Instruction Level Parallelism)即指令集并行上,进而出现了若干经典的设计:流水线结构、乱序执行结构、缓存层次结构等等。此时还有一个很头疼的问题就是存储墙(Memory Wall):虽然处理器速度越来越快,但内存速度的提升远远赶不上处理器速度。当内存远远慢于处理器时,就面临一个尴尬的问题:尽管处理器运行得很快,但是由于数据和指令来自于相对更慢的内存,因此处理器再快也没意义,不得不等待访存。缓存层次结构就是解决这个问题的有效方法。
而第3阶段中摩尔定律逐渐失效,原因在于面临的问题越来越多越来越复杂,晶体管数量增长无法保持以前的高速。此时单核性能已经难以提升,进而转向多核结构。难以忽视漏电问题使得设计时需要着重考虑功耗,而不仅仅是考虑性能的提升。功耗问题的出现还有另一方面的原因,那就是散热技术的发展速度远远跟不上处理器的发展速度。
如今功耗问题已不可忽视,而Dennard Scaling正是一个关于功耗的定律。
随着晶体管尺寸越来越小,功耗密度保持不变,即单位面积的功耗保持不变。【3】
原因在于,晶体管尺寸的降低,同时也带来了电压和电流的降低。不严格的来说,晶体管面积与边长是平方关系,使得单位面积内的晶体管数目增加也是平方增加,而电压和电流的则随着边长减小而同时降低,使得单个晶体管的功耗也呈现平方级的下降,总的来说单位面积的功耗保持不变。
这个定律是如此的美好:我们不需要考虑功耗问题,只要堆越来越多的晶体管,就可以直接获得性能上的提升。但这么美好的定律其实也很短暂,原因在于Dennard Scaling只考虑了动态功耗,而在纳米级工艺之前,由于绝缘层足够厚,因此漏电功耗可以忽略不计。而随着纳米级工艺的到来,晶体管内的绝缘层越来越薄,使得漏电流越来越大,漏电功耗几乎是直线上升。
此外从功耗公式上可以来观察一番:
动态功耗(单个晶体管) = 1/2 * 负载电容 * 电压的平方 * 频率静态功耗 = 漏电电流 * 电压在只需考虑动态功耗的年代,随着晶体管边长的缩小,电压随着长度缩小而降低,因此单个晶体管的动态功耗呈现平方级降低,而单位面积的晶体管数目平方级增长,因此功耗密度保持不变。而公式中电压的平方,给人们带来了巨大的吸引力,即不断降低电压即可获得更大的主频提升空间。此外还可以通过工艺的改进来降低负载电容,从而进一步为主频提升留出空间。而主频的提高直接带来的就是性能的提升,这一阶段可谓是摩尔定律和Dennard Scaling共同造就的黄金时期。
而随着工艺的进步,漏电电流持续增大,而电压则无法继续降低——晶体管内的P管和N管有一个开关的阈值电压,因此很难降得很低。在此趋势下,静态功耗持续增加,很快就到了让人无法忽视的境地。而受限于工艺的发展,负载电容也难以下降。另一方面,散热技术的缓慢发展则意味着功耗有一个上限。种种因素下,主频的提升空间变得越来越小。这一阶段Dennard Scaling的失效,使得功耗问题越来越严重,进而使得主频的提升越来越缓慢。
冯诺伊曼结构,最初提出是在1945年由著名数学和物理学家冯诺伊曼所起草的《First Draft of a Report on the EDVAC》中【5】,因此被称为冯诺伊曼结构。然而这个结构并非由冯诺伊曼所提出,而是另有他人(J. Presper Eckert 和 John Mauchly),只是当时冯诺伊曼赫赫有名,故而借其名来发表。无论如何,总之流传下来的就是冯诺伊曼结构了。
冯诺伊曼结构分为五大部分:
运算单元:包含算术逻辑单元和寄存器控制单元:包含指令寄存器和程序计数器存储单元:存储数据和指令输入设备、输出设备冯诺伊曼结构的最大的特点是“存储程序”(stored-program),即把程序当作数据一样,存储在存储器中。这种结构优于此前的程序控制计算机(program-controlled computers),比如著名的ENIAC,其将程序和数据分离,编程的工作则是通过各种插头开关来完成,十分复杂。而将程序视为数据,无疑是一种先进的思想。同时代的阿兰·图灵则忙于通用图灵机模型,在图灵机的概念下,程序和数据一样,都是数据而已。实际上两处的工作是互相不知道的,即理论上有图灵提出了图灵机,在此模型下程序和数据本质上一致;而工程上也有人提出了相同的想法,即存储程序结构。
除此之外,冯诺伊曼结构是将CPU和内存分离:CPU负责运算,内存负责存储数据。而随着计算机发展,这逐渐导致了“存储墙”(Memory Wall)问题的出现。这一问题最初被称为”冯诺伊曼瓶颈“(Von Neumann bottleneck),指的是CPU和内存之间通过共享总线传输数据,而这种传输每次只能传输很小一部分的数据,相比于存储器巨大的容量而言显得微不足道。当数据的传输带宽无法满足处理器的运行速度时,处理器就不得不等待数据的传送。而随着处理器变得越来越快,存储器容量越来越大,这个问题也就越来越凸显。目前这个问题仍然存在,解决方法有缓存层次结构,进而有分支预测、数据预取等等各种技术,目的都是为了给处理器提供数据,减少处理器的停顿时间,让处理器能充分的工作。
哈佛结构也是一种存储程序结构,其起源于计算机“IBM Automatic Sequence Controlled Calculator”,更广为熟知的名字是“Harvard Mark I”,其被用于在二战期间进行运算。
哈佛结构的特点在于,其在硬件上将程序和数据分开存储,即有专门存储程序的存储器和专门存储数据的存储器。目前的计算机虽然都采用统一的内存,存储数据和程序(即指令),而在处理器内部,通常又分为指令缓存(Instruction Cache)和数据缓存(Data Cache)。缓存结构是为了解决存储墙问题,而指令和数据分离则可以进一步解决这个问题。在传统的冯诺伊曼结构中,指令和数据存储在一起,则处理器在某一时刻只能读取指令或者操作数据,而将指令和数据分离,则同一时刻处理器即可以读起指令,同时可以操作数据,指令和数据本身并无冲突,因此也可以同时操作。
现代计算机中,处理器芯片之外仍然遵循冯诺伊曼结构。冯诺伊曼结构并不区分程序和数据,因此较为简单,成本低,对外围设备的扩展性也好,缺点是存在通信瓶颈。而在处理器芯片内部,观察其微结构,则通常是将指令和数据分开存储,即遵循哈佛结构。哈佛结构虽然较为复杂,但具有更高的执行效率,可以同时操作指令和数据,并能够分别对其访存行为进行观察从而预测。
安提凯希拉装置【7】,于1901年在希腊古船的残骸中发现,复杂的齿轮结构可以精确的计算月亮和行星的运动,被认为是第一台计算器。严格意义上感觉其并不能称之为计算机,不过加上引号称其为天文“计算机”也不算过。
最早的一台差分机,是由Charles Babbage在1819年开始建造,并在1822年完成【8】。这台差分机使用的是小数系统,并通过摇动手柄来驱动。差分机的意义在于,可以把复杂的运算转换成差分运算,从而使用简单的加法就可以完成,使得机器计算的前景更为广阔。
分析机最早在1837年提出,作为差分机的后继。分析机已经具备了如今计算机的雏形,包括存储单元、运算单元、控制单元,支持分支和循环,被认为是第一台通用的数字计算机【9】。然而分析机并没有真正被制造出来,由于Babbage与工程师的意见不合,并且也没有足够的资金。
被认为是第一个程序员的Ada Lovelace,其写的第一个计算机程序就是基于分析机,而Lovelace和Babbage也是很好的朋友和合作伙伴【10】。
Atanasoff–Berry computer,简称ABC,是第一台自动化的电子数字计算机(the first automatic electronic digital computer)【11】。可惜ABC并不符合图灵机模型,而且不能进行编程。ABC的主要贡献包括电子运算、二进制算数、并行处理、存储和运算分离。
Z3是一台德国的电子计算机,由Konrad Zuse设计,在此之前有Z1和Z2,而Z3是世界上第一台可以编程的完全自动化的数字计算机(the world’s first working programmable, fully automatic digital computer)【12】。Z3由2600个继电器所建成,字宽为22比特,运行频率为4到5Hz,支持浮点运算,程序存储在打孔的底片(punched film)上,初始值需要手动输入。
Z3没有条件分支,但是仍然可以构造出循环,而在1998年则有证明表示Z3是图灵完备的,即理论上Z3可以完成所有的计算任务,然而由于缺少分支,因此Z3需要把所有的可能都计算一遍,才能真正完成计算任务。而由于Z3的存在,Konrad Zuse也常常被认为是计算机的发明者。
Colossus是在1943年到1945年期间,由英国开发的一系列计算机【13】。Colossus使用热敏电阻(thermionic valves)来进行布尔和计数运算,因此Colossus被视为世界上第一个可编程的电子数字计算机(the world’s first programmable, electronic, digital computer),尽管Colossus的编程是通过开关和插头来完成,而不是存储程序。而Colossus是被专门设计来处理一些密码分析任务,而不是一台通用计算机,因此也不是图灵完备的。而且直到二战之后,通用计算机的概念才逐渐变得重要起来,二战期间的计算机大多都是针对专门的计算任务。
即IBM Automatic Sequence Controlled Calculator,简称ASCC,被哈佛大学称为Mark I,是一台通用的电子数学计算机【14】。其在二战期间用于军事用途。最初的想法是IBM的Howard Aiken在1937年11月提出,之后在1939年被IBM批准并资助。最终在1944年2月由IBM建造成功并移交到哈佛开始为美国海军进行运算,但直到1944年8月7日才被正式移交给哈佛大学。
然而ASCC并不支持分支操作,程序是写在纸带上,循环也只是简单的将纸带绕成圈。此外ASCC的基础运算单元仍需要被机械化的驱动,由一个长达15米的驱动轴连接着一个功率达3.7千瓦的电动马达,这个电动马达作为主要动力来源和系统时钟。
Electronic Numerical Integrator and Computer,即ENIAC,被认为是第一台通用电子计算机(the first electronic general-purpose computer),由J. Presper Eckert和John Mauchly设计,于1946年2月15日正式交付给宾夕法尼亚大学【15】。
ENIAC被认为是第一台计算机,因其同时满足了这几个条件:
电子的(electronic):ENIAC包含接近20000个电子真空管,7200个晶二极管,1500个继电器,70000个电阻器,10000个电容器,以及超过5000000个人工焊接的关节部件。ENIAC重达30吨,占地167平方米(1800平方英尺),所需的电源功率为150千瓦。数字的(digital):ENIAC是一个模块化的计算机,其中有20个模块是累加器,不仅可以执行加法和减法操作,而且还能存储十进制数,这些数字通过若干通用的总线进行传输。自动的(automatical):ENIAC为了实现高速运算,其嵌板(panels)上可以完成发送和传输数据、计算、存储结果并触发下一个操作,这一系列操作完全自动完成,不需要其他的操作步骤。ENIAC的灵活性也源于其分支的能力,可以根据先前的计算结果来触发不同的操作。可编程的(programmable):ENIAC可以被编程来进行复杂的运算,包括循环、分支、子程序。然而ENIAC并非存储程序,而是通过插线板来进行编程,通常需要耗费数周时间才能完成一个程序。通用的(general-purpose):源于其强大的编程能力,ENIAC可以完成各种计算任务,是图灵完备的。ENIAC最大的缺陷,在于仍然需要通过开关和插线板进行编程,不仅非常慢而且过于复杂。此时Eckert和Mauchly二人已经逐渐形成了存储程序的概念,并由冯诺伊曼在其报告中首次提出,也就是著名的冯诺伊曼架构。1948年对ENIAC的改造使得其成为一台存储程序计算机,然而其运行速度却只有之前的六分之一,但却将编程的时间从数周降低到数小时。而这之后才诞生了EDVAC——这是一台一出生就是存储程序结构的计算机。
也称为Small-Scale Experimental Machine,简称SSEM,是世界上第一台电子的存储程序计算机(the world’s first electronic stored-program computer)【16】。SSEM有着32比特的字宽,并且有一个可以存储32个字的存储器。SSEM的目的是为了验证第一个真正意义上的RAM,因此其被设计为最简单的存储程序计算机,运算单元只有减法和正负转换。
在SSEM展现出了设计上的可扩展性时,一个以此为基础来建立更加实用的计算机的项目就成立了,随后诞生了Manchester Mark I,而后又以此为原型诞生了Ferranti Mark I,而这正是世界上第一个商业化的通用计算机(the world’s first commercially available general-purpose computer)。
Electronic Discrete Variable Automatic Calculator,即EDVAC,作为ENIAC的后继,其在1949年移交给弹道研究所(The Ballistic Research Laboratory,简称BRL),而BRL在1942年成为美国军方研究所的一部分【17】。
EDVAC相对于ENIAC,主要有两点改变,一是EDVAC使用二进制而不是十进制,二是EDVAC是存储程序结构。而在移交给弹道研究所后,修复了一系列问题,并最终在1951年才开始进行运算。
Electronic delay storage automatic calculator,即EDSAC,是一台早期的英国计算机,由Maurice Wilkes和他的团队在剑桥大学完成【18】。Maurice受到冯诺伊曼的报告《First Draft of a Report on the EDVAC》的启发,进而设计出了这台存储程序计算机。EDSAC的建在始于1947年,最终在1949年运行了第一个程序。基于EDSAC,David Wheeler发明了子程序的概念,从而获得了世界上第一个计算机科学博士学位。
BINary Automatic Computer,即BINAC,是EMCC公司的首台商用计算机。EMCC即Eckert-Mauchly Computer Corporation,由Eckert和Mauchly二人所创立,目的是开发商业计算机【19】。BINAC是美国的第一台存储程序计算机(the first stored-program computer in the United States),此外其独特的地方是有两个独立的CPU来相互检查。然而BINAC的应用范围却非常有限,功能上不是很完备,并且卖得也很贵。
随后EMCC推出了UNIVersal Automatic Computer,即UNIVAC,是其第二代商用计算机【20】。UNIVAC因为被用来预测美国总统选举而广为人知。
The IBM 701 Electronic Data Processing Machine,简称IBM 701,是IBM的首台商业科学计算机,在1952年4月29日首次发布【21】。其后继者为IBM 704,与其同一代的还有面向商务的IBM 702和面向低成本的通用计算机IBM 650。IBM 650则是世界上首个量产的计算机(the world’s first mass-produced computer),生产了将近2000台计算机,最后一台在1962年生产。
IBM System/360是一系列主机,由IBM宣布于1964年4月7日。IBM 360是第一个计算机族被设计来覆盖几乎所有的应用(the first family of computers designed to cover the complete range of applications),无论是小程序还是大程序,无论是商用还是科学计算【22】。
IBM 360的贡献之一是提出了许多影响深远的标准,比如有:
以8比特为一个字节、按字节寻址的内存、以32比特为一个字IBM的外围总线标准、IBN的浮点结构、IBM所用的EBCDIC字符集而IBM最突出的贡献是兼容性,可以说IBM System/360开创了计算机兼容性时代,有史以来第一次允许在不同机器上运行相同的程序。尽管计算机在过去25年中的发展速度令人吃惊,但 System/360 包含的基本技术概念仍是通用计算机行业骨干的组成部分。IBM 推出的 System/360 真正标志着现代计算时代的来临。【23】
再来稍微说一下现代计算机。
现代计算机中,有着三个很重要的芯片,分别是CPU、北桥芯片和南桥芯片。
CPU毫无疑问是整个计算机中最核心的部件,但只有CPU显然是不够的,至少从冯诺伊曼结构上看,我们还需要有输入输出设备、存储数据和程序的内存,CPU则是集成了控制单元和运算单元。不严格的来说,北桥承担起了与内存沟通的任务,而南桥则承担起了与输入输出设备沟通的任务。详细来说的话,北桥与CPU互连,负责连接高速设备,如内存、显卡甚至缓存等等,并且与南桥互连。南桥则负责连接低速设备,如鼠标、键盘、串口、硬盘、USB接口等等。
而随着CPU运行得越来越快,其对内存的要求也越来越高,终于CPU开始集成了内存控制器,可以直接与内存沟通而不需要经过北桥了。后来北桥的任务逐渐被CPU接管,也就不存在北桥芯片了。但显然CPU不可能集成所有的接口控制器,至多支持最为通用的PCIe接口(以连接显卡等高速设备)。CPU的面积可谓是寸土寸金,花太多在各种接口上显然不值得,因此南桥芯片仍然值得存在,用于支持USB接口、硬盘接口以及更多的PCIe接口等等。
[1] WiKiPedia.Moore’s Law[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Moore’s_law
[2] 胡伟武.计算机体系结构(第2版)[M].清华大学出版社:北京,2017:11-13.
[3] WiKiPedia.Dennard Scaling[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Dennard_scaling
[4] G.E.Moore…No exponential is forever: but “Forever” can be delayed![J].2003 IEEE ISSCC, 2003. Digest of Technical Papers. ISSCC.,2003,1(1):20-23.
[5] WiKiPedia.Von Neumann architecture[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Von_Neumann_architecture
[6] WiKiPedia.Harvard architecture[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Harvard_architecture
[7] Bilibili.公元前的天文钟:安提凯希拉装置[EB/OL].[2019-05-01].https://www.bilibili.com/video/av13458262/
[8] WiKiPedia.Difference Engine[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Difference_engine#Method_of_differences
[9] WiKiPedia.Analytical Engine[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Analytical_Engine
[10] Steve Taranovich.Ada Lovelace: 19世纪的数学奇女子——计算机之母[EB/OL].[2019-05-01].https://www.ednchina.com/news/Ada-Lovelace.html
[11] WiKiPedia.Atanasoff–Berry computer[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Atanasoff–Berry_computer
[12] WiKiPedia.Z3(computer)[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Z3_(computer)
[13] WiKiPedia.Colossus computer[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Colossus_computer
[14] WiKiPedia.Harvard Mark I[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Harvard_Mark_I
[15] WiKiPedia.ENIAC[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/ENIAC
[16] WiKiPedia.Manchester Baby[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/Manchester_Baby
[17] WiKiPedia.EDVAC[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/EDVAC
[18] WiKiPedia.EDSAC[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/EDSAC#System_software
[19] WiKiPedia.BINAC[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/BINAC
[20] WiKiPedia.UNIVAC[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/UNIVAC
[21] WiKiPedia.IBM 701[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/IBM_701
[22] WiKiPedia.IBM System/360[EB/OL].[2019-05-01].https://en.wikipedia.org/wiki/IBM_System/360
[23] IBM.System 360 从计算机到计算机系统[EB/OL].[2019-05-01].http://www-31.ibm.com/ibm/cn/ibm100/icons/system360/index.shtml