# M.2 计算机的早期发展（第 1 章）
<!-- source: p1381 -->

本节回顾数字计算机的早期发展，以及性能度量方法的发展。

## 第一批通用电子计算机

宾夕法尼亚大学 Moore 学院的 J. Presper Eckert 和 John Mauchly 建造了世界上第一台能够完整运行的通用电子计算机。这台机器称为 ENIAC（Electronic Numerical Integrator and Calculator，电子数字积分计算机），由美国陆军资助，在第二次世界大战期间投入运行，但直到 1946 年才对外公布。ENIAC 用来计算火炮射表。它体积庞大：长 100 英尺、高 8½ 英尺、宽数英尺；20 个十位十进制数字寄存器，每个长 2 英尺。整机共有 18,000 只真空管。

它的体积比原文撰写时制造的普通计算机大三个数量级，速度却慢五个数量级以上，一次加法需要 200 微秒。ENIAC 支持条件跳转，而且可以编程，这使它与此前的计算器有了明确区别。编程需要手工连接电缆、设置开关，耗时从半小时到一整天不等。数据通过穿孔卡输入。ENIAC 的主要限制在于存储容量很小、编程又十分繁琐。

1944 年，John von Neumann 被吸引到 ENIAC 项目中。项目组希望改进程序输入方式，讨论了将程序作为数字存储的想法。von Neumann 帮助这些想法逐渐成形，并写了一份备忘录，<!-- source: p1382 -->提出一种称为 EDVAC（Electronic Discrete Variable Automatic Computer，电子离散变量自动计算机）的存储程序计算机。Herman Goldstine 将备忘录散发出去，并署上 von Neumann 的名字；Eckert 和 Mauchly 的名字却被遗漏了，这令两人十分不满。常用的“von Neumann 计算机”一词正是源于这份备忘录。一些早期计算机发明者认为，这一称呼给了归纳并写出这些思想的 von Neumann 过多荣誉，却低估了实际研制机器的工程师 Eckert 和 Mauchly。与大多数历史学家一样，本书作者——2000 年 IEEE von Neumann 奖章的获得者——认为，这三个人都在存储程序计算机的发展中发挥了关键作用。von Neumann 将这些思想写成文字、加以概括，并思考程序设计方面的问题，对将思想传播给更多人至关重要。

1946 年，剑桥大学的 Maurice Wilkes 访问 Moore 学院，参加了有关电子计算机进展的系列讲座的后半部分。回到剑桥后，Wilkes 决定启动一个项目，建造名为 EDSAC（Electronic Delay Storage Automatic Calculator，电子延迟存储自动计算机）的存储程序计算机。EDSAC 使用汞延迟线作为存储器，名称中的“延迟存储”由此而来。EDSAC 于 1949 年投入运行，是世界上第一台完整规模、能够实际运行的存储程序计算机［Wilkes、Wheeler 和 Gill，1951；Wilkes，1985、1995］。（曼彻斯特大学建造的小型原型机 Mark I 于 1948 年运行，也可以称为第一台能够运行的存储程序机器。）EDSAC 采用基于累加器的体系结构；这种指令集体系结构一直流行到 20 世纪 70 年代初。附录 A 开头简要介绍了 EDSAC 的指令集。

1947 年，Mauchly 还抽出时间参与创办了美国计算机协会（Association for Computing Machinery，ACM），并担任首任副主席和第二任主席。同年，Eckert 和 Mauchly 申请了电子计算机专利。Moore 学院院长要求将专利转交给大学，这可能促使两人下定决心离开。他们的离去使 EDVAC 项目受到重创，直到 1952 年才投入运行。

1946 年，Goldstine 离开 Moore 学院，加入位于普林斯顿的高等研究院，与 von Neumann 共事。他们和 Arthur Burks 根据 1944 年的备忘录发表了一份报告［Burks、Goldstine 和 von Neumann，1946］。这篇论文促成了 Julian Bigelow 在普林斯顿高等研究院建造的 IAS 机器。它共有 1024 个 40 位字，速度约为 ENIAC 的 10 倍。该小组思考了机器的用途，发表了一系列报告，并鼓励外界来访。这些报告和访问活动启发了许多新计算机的研制，其中包括 IBM 的第一台计算机 701，它以 IAS 机器为基础。以当时的条件来看，Burks、Goldstine 和 von Neumann 的论文令人惊叹。今天读来，你很难猜到这篇里程碑式的论文写于 50 多年前，因为现代计算机中的大多数体系结构概念都已在其中得到讨论，例如第 2 章开头的引文。

<!-- source: p1383 -->

在 ENIAC 研制的同时，Harvard 的 Howard Aiken 正在设计一种名为 Mark-I 的机电式计算机。Mark-I 由一组 IBM 工程师建造。此后，他又研制了采用继电器的 Mark-II，以及采用真空管的 Mark-III 和 Mark-IV。Mark-III、Mark-IV 的建造晚于第一批存储程序机器。由于它们为指令和数据分别设置存储器，存储程序计算机的支持者认为这种设计是一种倒退。“Harvard 体系结构”一词就是为描述这种机器而创造的。虽然与最初的含义明显不同，今天这个术语也用于描述主存统一、但指令缓存和数据缓存分离的机器。

MIT 的 Whirlwind 项目［Redmond 和 Smith，1980］始于 1947 年，面向实时雷达信号处理。它带来了多项发明，其中最重要的创新是磁芯存储器：第一种可靠而廉价的存储技术。Whirlwind 的磁芯存储器能够容纳 2048 个 16 位字。此后，磁芯作为主要的主存技术使用了近 30 年。

## 重要的专用机器

第二次世界大战期间，英国和美国的主要计算研究工作都集中在用于破译密码的专用计算机上。英国的研究旨在解读德国 Enigma 密码机编码的消息。这项工作在 Bletchley Park 开展，催生了两台重要机器。第一台由 Alan Turing 构思，是一种称为 BOMB 的机电式机器［参见 Metropolis、Howlett 和 Rota，1980，收录的 Good 一文］。第二台由 Newman 和 Flowers 构思并设计，体积大得多，采用电子器件，称为 COLOSSUS［参见同书收录的 Randall 一文］。这些高度专用的密码分析机器能够读取加密消息，尤其是发给潜艇的消息，因此在战争中发挥了重要作用。Bletchley Park 的工作属于高度机密，事实上其中一部分在原文撰写时仍未解密，因此很难追溯其对 ENIAC、EDSAC 及其他计算机发展的直接影响；不过，它无疑通过推动技术进步、加深人们对相关问题的理解而产生了间接影响。

美国也进行了类似的专用密码分析计算机研究。这项工作的最直接继承者是 Engineering Research Associates（ERA）公司［参见 Metropolis、Howlett 和 Rota，1980，收录的 Thomash 一文］。ERA 成立于战后，试图将其中的关键思想商业化。它制造了几台机器，出售给秘密政府机构；后来被 Sperry-Rand 收购，而 Sperry-Rand 此前已收购 Eckert Mauchly Computer Corporation。

另一批值得肯定的早期机器，是 Konrad Zuse 于 20 世纪 30 年代末<!-- source: p1384 -->至 40 年代初在德国制造的一组专用机器［参见 Metropolis、Howlett 和 Rota，1980，收录的 Bauer 和 Zuse 的文章］。Zuse 不仅造出了能够运行的机器，还是第一个实现浮点运算的人；而 von Neumann 曾声称浮点运算没有必要！Zuse 的早期机器采用机械式存储装置，其体积小于当时其他机电式方案。他的最后一台机器也是机电式的，但因战争而未能完成。

John Atanasoff 是电子计算机发展的另一位重要早期贡献者。他在 20 世纪 40 年代初建造了一台小型电子计算机［Atanasoff，1940］。这台在 Iowa State University 设计的专用计算机称为 ABC（Atanasoff Berry Computer），始终未能完全投入运行。Mauchly 在建造 ENIAC 之前曾短暂拜访 Atanasoff，后者的一些思想，例如使用二进制表示，很可能影响了 Mauchly。Atanasoff 机器的存在、ENIAC 专利申请的延误——当时工作属于机密，战后才能申请专利——以及 von Neumann 的 EDVAC 论文已被散发，这些因素被用来推翻 Eckert–Mauchly 专利［Larson，1973］。尽管围绕 Atanasoff 作用的争论仍十分激烈，人们通常仍将建造第一台能够运行的通用电子计算机的功劳归于 Eckert 和 Mauchly［Stern，1980］。不过，Atanasoff 确实展示了后来计算机采用的几项重要创新。他的工作理应得到充分肯定；将世界上第一台专用电子计算机的功劳归于他，并认为他可能影响了 Eckert 和 Mauchly，也是公允的。

## 商业化的发展

1947 年 12 月，Eckert 和 Mauchly 成立了 Eckert-Mauchly Computer Corporation。他们的第一台机器 BINAC 为 Northrop 制造，于 1949 年 8 月展示。经历一些财务困难之后，公司被 Remington-Rand 收购；后者后来称为 Sperry-Rand。Sperry-Rand 将收购的 Eckert-Mauchly 公司、ERA 以及自身的制表机业务合并，成立了专门的计算机部门 UNIVAC。UNIVAC 于 1951 年 6 月交付第一台 UNIVAC I。UNIVAC I 售价为 250,000 美元，是第一款获得商业成功的计算机：总共制造了 48 套系统！这台早期机器以及许多其他引人入胜的计算机历史实物，可以在加利福尼亚州 Mountain View 的 Computer History Museum 看到。其他可参观早期计算系统的地方还包括慕尼黑的 Deutsches Museum、华盛顿特区的 Smithsonian Institution，以及众多网上虚拟博物馆。

IBM 此前从事穿孔卡和办公自动化业务，直到 1950 年才开始制造计算机。其第一台计算机 IBM 701 以 von Neumann 的 IAS 机器为基础，于 1952 年交付，最终售出 19 台［参见 Metropolis、Howlett 和 Rota，1980，收录的 Hurd 一文］。20 世纪 50 年代初，许多人对计算机的未来持悲观态度，认为这些“高度专用”机器的市场和发展机会<!-- source: p1385 -->相当有限。尽管如此，IBM 很快成为最成功的计算机公司。重视可靠性，以及以客户和市场为导向的策略，是它成功的关键。701 和 702 的成绩虽不算突出，后续于 1954 年和 1955 年交付的 650、704、705 却取得了显著成功，各型号销量在 132 至 1800 台之间。

计算机先驱们撰写了多本介绍早期计算历史的著作［Goldstine，1972；Wilkes，1985、1995］。Metropolis、Howlett 和 Rota［1980］编辑的文集则汇集了早期先驱的回忆。独立撰写的历史著作也很多，其中不少以相关人物为线索［Slater，1987］；此外，还有专门研究计算历史的期刊 *Annals of the History of Computing*。

## 量化性能度量的发展：成功与失败

在计算技术的萌芽阶段，设计者就设定了性能目标：ENIAC 要比 Harvard Mark-I 快 1000 倍，IBM Stretch（7030）则要比当时最快的机器快 100 倍。不过，如何度量这些性能并不明确。回顾多年的发展，可以看到一个反复出现的现象：每一代计算机都会使上一代的性能评估技术过时。

最初的性能指标是执行单个操作，例如加法所需的时间。由于大多数指令的执行时间相同，一条指令的用时就能反映其他指令的情况。然而，随着一台机器中各种指令的执行时间差异增大，单一操作的时间不再适合用于比较。为考虑这些差异，人们测量计算机运行许多程序时各种指令出现的相对频率，据此计算指令混合。Gibson mix［Gibson，1970］是一种早期流行的指令混合。将每条指令的时间乘以它在混合中的权重，再求和，就能得到平均指令执行时间。如果以时钟周期计量，这就是每条指令的平均时钟周期数。由于当时指令集彼此相似，这种比较比加法时间更准确。从平均指令执行时间到 MIPS，只需再走一小步；正如前文所述，两者互为倒数。MIPS 的优点是非专业人士也容易理解。

随着 CPU 变得更加复杂，越来越依赖存储层次结构和流水线，每条指令不再具有一个固定的执行时间，也就无法仅根据指令混合和机器手册计算 MIPS。下一步是使用内核程序和合成程序进行基准测试。Curnow 和 Wichmann［1976］通过测量用 Algol 60 编写的科学程序，创建了 Whetstone 合成程序。该程序被转换成 FORTRAN 后，广泛用于描述科学程序的性能。McMahon［1986］与 Lawrence Livermore Laboratory 的研究人员开展了目标类似的工作，提出 Livermore FORTRAN Kernels，试图建立<!-- source: p1386 -->超级计算机的基准。不过，这些内核由真实程序中的循环组成。

人们逐渐认识到，不能用 MIPS 比较不同指令集的体系结构，于是提出了相对 MIPS 的概念。1977 年，VAX-11/780 即将发布时，DEC 运行了一些小型基准，这些基准也在 IBM 370/158 上运行。IBM 的市场部门将 370/158 称为 1 MIPS 计算机；由于这些程序在两台机器上运行速度相同，DEC 的市场部门也将 VAX-11/780 称为 1 MIPS 计算机。对于机器 \(M\)，基于某台参考机器定义的相对 MIPS 为：

$$
\mathrm{MIPS}_{M}=\frac{\mathrm{Performance}_{M}}{\mathrm{Performance}_{\mathrm{reference}}}\times\mathrm{MIPS}_{\mathrm{reference}}
$$

VAX-11/780 广受欢迎，也因此成为常用的相对 MIPS 参考机器；特别是以 1 MIPS 的机器为基准，计算十分方便：如果某台机器在一个基准上比 VAX-11/780 快 5 倍，它的相对 MIPS 评分就是 5。这个 1 MIPS 的评分连续四年无人质疑，直到 DEC 的 Joel Emer 在分时负载下测量 VAX-11/780。他发现，VAX-11/780 的原生 MIPS 评分实际上为 0.5。后来，一些 VAX 在某些基准上达到 3 原生 MIPS，却被称为 6 MIPS 机器，因为它们比 VAX-11/780 快 6 倍。到 20 世纪 80 年代初，MIPS 一词几乎普遍用于指代相对 MIPS。

20 世纪 70 年代和 80 年代，超级计算机行业迅速发展，其特点是在浮点密集型程序上具有高性能。平均指令时间和 MIPS 显然不适合这一行业，于是产生了 MFLOPS，即每秒百万次浮点运算。它实际上度量的是某个基准执行时间的倒数。遗憾的是，客户很快就会忘记评分使用的具体程序，而市场部门也开始在超级计算机的性能竞争中宣称峰值 MFLOPS。

SPEC（System Performance and Evaluation Cooperative）成立于 20 世纪 80 年代末，试图改善基准测试的状况，为比较提供更可靠的依据。该组织最初关注 UNIX 市场中的工作站和服务器，在原文撰写时，这些仍是其基准的主要对象。首版 SPEC 基准现在称为 SPEC89，它采用更贴近实际的基准，使性能评估取得了显著进步。近二十年后，SPEC2006 仍在处理器基准测试中占据主导地位。

## 参考文献

<!-- source: p1386 -->

1. Amdahl, G. M. [1967]. “Validity of the single processor approach to achieving large scale computing capabilities,” Proc. AFIPS Spring Joint Computer Conf., April 18–20, 1967, Atlantic City, N.J., 483–485.

2. Atanasoff, J. V. [1940]. “Computing machine for the solution of large systems of linear equations,” Internal Report, Iowa State University, Ames.

<!-- source: p1387 -->

3. Azizi, O., Mahesri, A., Lee, B. C., Patel, S. J., & Horowitz, M. [2010]. Energy-performance tradeoffs in processor architecture and circuit design: a marginal cost analysis. Proc. International Symposium on Computer Architecture, 26-36.

4. Bell, C. G. [1984]. “The mini and micro industries,” IEEE Computer 17:10 (October), 14–30.

5. Bell, C. G., J. C. Mudge, and J. E. McNamara [1978]. A DEC View of Computer Engineering, Digital Press, Bedford, Mass.

6. Burks, A. W., H. H. Goldstine, and J. von Neumann [1946]. “Preliminary discussion of the logical design of an electronic computing instrument,” Report to the U.S. Army Ordnance Department, p. 1; also appears in Papers of John von Neumann, W. Aspray and A. Burks, eds., MIT Press, Cambridge, Mass., and Tomash Publishers, Los Angeles, Calif., 1987, 97–146.

7. Curnow, H. J., and B. A. Wichmann [1976]. “A synthetic benchmark,” The Computer J. 19:1, 43–49.

8. Dally, William J., “High Performance Hardware for Machine Learning,” Cadence Embedded Neural Network Summit, February 9, 2016. http://ip.cadence.com/uploads/presentations/1000AM_Dally_Cadence_ENN.pdf

9. Flemming, P. J., and J. J. Wallace [1986]. “How not to lie with statistics: The correct way to summarize benchmarks results,” Communications of the ACM 29:3 (March), 218–221.

10. Fuller, S. H., and W. E. Burr [1977]. “Measurement and evaluation of alternative computer architectures,” Computer 10:10 (October), 24–35.

11. Gibson, J. C. [1970]. “The Gibson mix,” Rep. TR. 00.2043, IBM Systems Development Division, Poughkeepsie, N.Y. (research done in 1959).

12. Goldstine, H. H. [1972]. The Computer: From Pascal to von Neumann, Princeton University Press, Princeton, N.J.

13. Gray, J., and C. van Ingen [2005]. Empirical Measurements of Disk Failure Rates and Error Rates, MSR-TR-2005-166, Microsoft Research, Redmond, Wash.

14. Jain, R. [1991]. The Art of Computer Systems Performance Analysis: Techniques for Experimental Design, Measurement, Simulation, and Modeling, Wiley, New York.

15. Kembel, R. [2000]. “Fibre Channel: A comprehensive introduction,” Internet Week (April).

16. Larson, E. R. [1973]. “Findings of fact, conclusions of law, and order for judgment,” File No. 4-67, Civ. 138, Honeywell v. Sperry-Rand and Illinois Scientific Development, U.S. District Court for the State of Minnesota, Fourth Division (October 19).

17. Lubeck, O., J. Moore, and R. Mendez [1985]. “A benchmark comparison of three supercomputers: Fujitsu VP-200, Hitachi S810/20, and Cray X-MP/2,” Computer 18:12 (December), 10–24.

18. Landstrom, B. [2014]. “The Cost Of Downtime,” http://www.interxion.com/blogs/2014/07/the-cost-of-downtime/

19. McMahon, F. M. [1986]. The Livermore FORTRAN Kernels: A Computer Test of Numerical Performance Range, Tech. Rep. UCRL-55745, Lawrence Livermore National Laboratory, University of California, Livermore.

<!-- source: p1388 -->

20. Metropolis, N., J. Howlett, and G. C. Rota, eds. [1980]. A History of Computing in the Twentieth Century, Academic Press, New York.

21. Mukherjee S. S., C. Weaver, J. S. Emer, S. K. Reinhardt, and T. M. Austin [2003]. “Measuring architectural vulnerability factors,” IEEE Micro 23:6, 70–75.

22. Oliker, L., A. Canning, J. Carter, J. Shalf, and S. Ethier [2004]. “Scientific computations on modern parallel vector systems,” Proc. ACM/IEEE Conf. on Supercomputing, November 6–12, 2004, Pittsburgh, Penn., 10.

23. Patterson, D. [2004]. “Latency lags bandwidth,” Communications of the ACM 47: 10 (October), 71–75.

24. Redmond, K. C., and T. M. Smith [1980]. Project Whirlwind—The History of a Pioneer Computer, Digital Press, Boston.

25. Shurkin, J. [1984]. Engines of the Mind: A History of the Computer, W. W. Norton, New York.

26. Slater, R. [1987]. Portraits in Silicon, MIT Press, Cambridge, Mass.

27. Smith, J. E. [1988]. “Characterizing computer performance with a single number,” Communications of the ACM 31:10 (October), 1202–1206.

28. SPEC. [1989]. SPEC Benchmark Suite Release 1.0 (October 2).

29. SPEC. [1994]. SPEC Newsletter (June).

30. Stern, N. [1980]. “Who invented the first electronic digital computer?” Annals of the History of Computing 2:4 (October), 375–376.

31. Touma, W. R. [1993]. The Dynamics of the Computer Industry: Modeling the Supply of Workstations and Their Components, Kluwer Academic, Boston.

32. Weicker, R. P. [1984]. “Dhrystone: A synthetic systems programming benchmark,” Communications of the ACM 27:10 (October), 1013–1030.

33. Wilkes, M. V. [1985]. Memoirs of a Computer Pioneer, MIT Press, Cambridge, Mass.

34. Wilkes, M. V. [1995]. Computing Perspectives, Morgan Kaufmann, San Francisco.

35. Wilkes, M. V., D. J. Wheeler, and S. Gill [1951]. The Preparation of Programs for an Electronic Digital Computer, Addison-Wesley, Cambridge, Mass.
