冯 . 诺依曼体系结构对计算机发展的限制
刘爱贵
( 高能物理研究所计算中心 北京 2003年)
摘要 : 本文简单介绍了传统冯 . 诺依曼体系结构的原理和特点,从计算模型和存储模型两个方面分析了这种体系结构的局限性,并对目前非冯体系结构的发展情况作了浅出的分析和展望。
关键词 : 计算模型 存储模型 语义间隔 映射
从计算机诞生那天起,冯 . 诺依曼体系结构占据着主导地位,几十年来计算机体系结构理论并没有新理论出现。随着计算机应用范围的迅速扩大,使用计算机解决的问题规模也越来越大,因此对计算机运算速度的要求也越来越高。而改进计算机的体系结构是提高计算机速度的重要途径,从而促进了计算机体系结构的发展,出现了诸如数据流结构、并行逻辑结构、归约结构等新的非冯诺依曼体系结构。
冯 . 诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯 . 诺依曼计算机的组织结构,只是作了一些改进而已,并没有从根本上突破冯体系结构的束缚。冯 . 诺依曼也因此被人们称为“计算机之父”。然而由于传统冯 . 诺依曼计算机体系结构天然所具有的局限性,从根本上限制了计算机的发展。
冯 . 诺依曼型计算机以存储程序原理为基础。存储程序原理的基本思想是指令驱动(或控制驱动),指令和数据混合存储。程序执行时, CPU 就能按照程序指定的逻辑顺序逐条把指令和数据从存储器中取出并加以执行,自动地完成由程序所描述的处理工作。冯 . 诺依曼型计算机主要由控制器、运算器、存储器、输入和输出设备五大部件组成,以运算器为中心,系统内各部件间的信息传送都要经过运算器中的寄存器。冯 . 诺依曼体系结构的基本特征有:
(1) 采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。
(2) 存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。
(3) 指令由操作码和地址组成。操作码指明本指令的操作类型 , 地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。
(4) 通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。
(5) 以运算器为中心, I/O 设备与存储器间的数据传送都要经过运算器。
(6) 数据以二进制表示。
从本质上讲,冯 . 诺依曼体系结构的本征属性就是二个一维性,即一维的计算模型和一维的存储模型,简单地说“存储程序”是不确切的。而正是这二个一维性,成就了现代计算机的辉煌,也限制了计算机的进一步的发展,真可谓“成也冯,败也冯”。
冯·诺依曼计算机的软件和硬件完全分离,适用于作数值计算。这种计算机的机器语言同高级语言在语义上存在很大的间隔,称之为冯 . 依曼语义间隔。造成这个差距的其中一个重要原因就是存储器组织方式不同,冯·诺依曼机存储器是一维的线性排列的单元,按顺序排列的地址访问。而高级语言表示的存储器则是一组有名字的变量,按名字调用变量,不考虑访问方法,而且数据结构经常是多维的(如数组,表格)。另外,在大多数高级语言中,数据和指令截然不同,并无指令可以像数据一样进行运算操作的概念。同时,高级语言中的每种操作对于任何数据类型都是通用的,数据类型属于数据本身,而冯 . 诺依曼机的数据本身没有属性标志,同一种操作要用不同的操作码来对数据加以区分。这些因素导致了语义的差距。如何消除如此大的语义间隔,这成了计算机面临的一大难题和发展障碍。
高级语言程序设计的过程,就是一个“分析问题——建立数学模型——选择数据结构——设计算法——翻译成计算机语言”的过程。最后通过编译器编译成机器识别的可执行代码由计算机运行。在冯诺依曼体系结构中,程序就是数据和代码的集合,数据是程序操纵的对象,其组织方式就是数据结构;代码则是程序的控制流程,负责对数据作某种变换,建立输入和输出数据之间的某种一一映射关系,这种映射变换的流就是所谓的算法步骤。由于机器语言与高级语言存在严重的语义间隔,不管你在高级语言中采用何种数据结构,多维数组、二叉树还是图,最终在存储器上都将转换成一维的线性存储模型进行存储。因而将高级语言翻译成机器语言就需要设计复杂的算法来进行映射,将高级语言的指令和数据结构变换成能被计算机识别的指令和数据。这些语义差距间的变换工作绝大部分要由编译程序来承担,从而给编译程序增加了很多的工作量。
冯 . 诺依曼计算机一维存储模型要求 CPU 访问 MEMORY 时严格按照地址顺序,从头至尾进行查找访问。而指令和数据是离散地存储在存储器上的,造成内存访问 50% 以上的微操作都是空操作,只作地址变化,而没有进行实际的存取操作。并且每次只能对一个存储单元进行操作,指令需要多个数据就必须事先从 MEMORY 中一个一个存储单元取出,而无法一次性取出,等所需数据全部就绪后指令才能得以执行。指令写存储器操作也是如此,只能一个一个存储单元写回,不可以一次完成多个存储单元的写操作。这些都浪费了大量的处理器时间。虽然高级语言支持各种数据结构,但是这是提供给程序员使用的,机器并不识别,只有通过编译程序进行复杂的语义转换,本质上没有改变这种存储模型。
冯 . 诺依曼体系结构的最大特点是“共享数据,串行执行”的一维计算模型。按照这种结构,指令和数据存放在共享的存储器中内, CPU 从中取出指令和数据进行相应的运算。由于存储器存取速度远低于 CPU 运算速度,而且每一时刻只能访问存储器的一个单元,从而使计算机的运算速度受到很大限制, CPU 与共享存储器间的数据交换造成了影响高速计算和系统性能的“瓶颈”。在冯 . 诺依曼机结构中,指令的执行次序受计数器的控制。 CPU 根据计数器指出的存储器地址访问相应的单元,指令计数器值增 1 指向下一条指令,因而指令是串行执行的。这种计算方式称为“控制驱动”,就是说由指令控制器控制指令执行的次序和时机,当它指向某条指令时才驱动该指令的执行。在实际程序中虽然可能存在大量的可以并行执行的指令,但是冯 . 诺依曼体系结构却难以支持这些指令的并行执行。这种顺序控制流结构从根本上限制了计算过程并行性的开发和利用,迫使程序员受制于“逐字思维方式”的传统程序设计风格的缺陷,语言臃肿无力,缺少必要的数学性质,从而使程序复杂性无法控制,软件质量无法保证,生产率无法提高。所以从理论上讲,不存在真正意义上的并行计算机,这就从根本上限制了计算机性能的提高。
在实际的程序中可能大量存在这样的指令序列:前面的某些指令所需的操作数据还没到,正在等待或正在进行 MEMORY 访问;然而之后的若干指令所需要的操作数据已在前面取出,或者就是无操作数指令。原本后面的指令可以提前或者并发执行,由于冯 . 诺依曼计算机一维的计算模型,指令只能串行执行,使得这种可能成为了不可能,指令序列只能按照事先按排好的次序顺序地执行。这样的计算模型严重浪费了有限的计算机资源,不仅工作效率低而且容易形成提高性能的系统瓶颈,使得计算机的运算速度很难从根本上得到提高,成了制约计算机发展的枷锁。
冯 . 诺依曼体系结构的局限严重束缚了现代计算机的进一步发展,而非数值处理应用领域对计算机性能的要求越来越高,这就亟待需要突破传统计算机体系结构的框架,寻求新的体系结构来解决实际应用问题。目前在体系结构方面已经有了重大的变化和改进,如文章开头提到的并行计算机、数据流计算机以及量子计算机、 DNA 计算机等非冯计算机,它们部分或完全不同于传统的冯 . 诺依曼型计算机,很大程度上提高了计算机的计算性能。
如并行计算机,它采用一种所谓的并行计算模型,将并行处理引入了计算机体系结构设计中。并行处理将一个传统串行处理的任务分解开来,并采用并行算法将其分配给多个处理器同时处理,即在同一时间间隔内增加计算机的操作数量。直觉上,我们认为串行计算模型解决不了的问题完全可以用并行计算模型来解决,甚至会想,并行计算机系统求解问题的速度将随着处理器数目的不断增加而不断提高,从而解决难解性问题,其实这是一种误解。当将一个问题分解到多个处理器解决时,由于算法中不可避免地存在必须串行执行的操作,从而大大限制了并行计算机系统的加速能力。根据阿达尔定律,当串行操作仅占全部操作 1% 时,即使 CPU 数目无穷多,也只能获得 100 倍串行执行的加速比。
这些新的非冯计算机体系结构,于传统冯 . 诺依曼体系结构相比较,在提高计算机性能上显现出了很大的优势。但仍然存在许多需要改进和突破的地方,计算机体系结构领域存在着很多发展机遇和挑战。
参考文献:
[1] 计算机科学与技术方法论 董荣胜、古天龙著――人民邮电出版社
[2] 计算机系统结构 孙强南、孙昱东著――科学出版社
[3] 并行计算机系统结构 白中英、杨旭东著――科学出版社