指令和数据混合存储与分开存储的比较
刘爱贵
(高能物理研究所计算中心 北京 2003年)
摘要 : 存储程序概念对计算机的发展影响深远。本文从总线、指令系统、数据表示、指令相关、编译对寄存器的管理等几个相关方面对 冯. 诺依曼结构的指令和数据混合存储与哈佛结构的指令和数据分开存储进行了比较详细的分析和比较。
关键词 : 冯. 诺依曼结构 哈佛结构 总线 指令修改 数据表示 结构相关 数据相关 寄存器管理
1946 年Von Neumann 在“电子计算机逻辑设计的初步讨论”一文中,首次提出了存储程序概念(stored program concept ),这是冯. 诺依曼设计思想的核心。冯. 诺依曼结构中指令和数据是不加区别混合存储在同一存储器中的,程序执行时通过译码来识别指令和数据。这种思想在现代计算机中仍被广泛应用。与冯. 诺依曼结构混合存储思想相对应的是一种称为哈佛结构的设计思想,其指令和数据分开存储的,即指令和数据分别存储于不同的存储器中。这种设计思想广泛用于单片机的设计中。众所周知,计算机的工作体现为程序的执行,计算机功能的扩展在很大程度上体现为所存储程序的扩展。[1] 冯. 诺依曼结构和哈佛结构的存储器设计思想各有优缺点,本文将就几个相关方面对两者进行分析和比较。
冯. 诺依曼结构(如图1 所示)指令和数据是不加区别混合存储的、共享数据总线,因而取指令和取操作数是不可以同时进行的。而哈佛结构(如图2 所示)指令和数据是完全分开的,存储器分为固定大小的两个部分,分别用来存放指令和数据。这样取指令和取操作数可以同时进行。从图1 可以看到,冯. 诺依曼结构中,数据和程序存储器是共享数据总线的。数据总线共享有许多优点,它可以减少总线的开销,这样控制逻辑也相对简单。哈佛结构中必须设置各自独立的数据总线和地址总线用于访问指令存储器和数据存储器,不仅总线开销增大许多,控制逻辑更复杂。如果要和外部的程序和数据存储器进行交互,对于两部分存储器来说,由于地址总线和数据总线的相互独立,就需要额外增加大量的芯片管脚。共享数据总线的另一个优点在于能够把RAM 映射到程序空间,这样设备也能访问 EEPROM 中的内存。对于指令和数据存储器采用独立的地址和数据总线来说,映射是非常困难的。哈佛结构中指令和数据可以同时进行访问,能够在一个周期内同时同时取指令和取操作数,这相应减少了指令执行时间,从而提供了很高的并行度,提高了数据吞吐率。因此并行存储指令和专用指令可以在这种结构上得到充分利用。冯. 诺依曼结构中不能同时取指令和取操作数,由于存储器存取速度远远低于CPU 运算速度,从而使计算机运算速度受到很大限制,CPU 与共享存储器间的数据交换成了影响高速计算和系统性能的“瓶颈”。
存储器在现代计算机中作为全机数据传送的中心,不仅要向高速运行的CPU 提供所需的指令的数据外,还需承担同CPU 并行工作的大量的外部设备和终端所输入和输出的数据的读写工作。[1] 可见存储器已经成为影响整个计算机系统运行速度的一个关键因素,尤其是在高性能的计算机系统中。存储器的有效利用和可扩充性在体系结构中也是很重要的。冯. 诺依曼结构中,共享数据总线,即取指令和取数据的带宽是相同的,只要总线位数足够多,存储器的扩充是很容易的。哈佛结构中,指令存储器和数据存储器使用相互独立的地址总线和数据总线,因而地址总线和数据总线可以采用不同的宽度。例如,指令存储器的数据总线可以是8 位、16 位或32 位的,而指令存储器的数据总线是12 位、14 位或16 位的。两个存储器数据总线宽度不相互制约,这样可以通过增加数据存储器和总线宽度来实现更大的存储带宽,从而缩小存储器与CPU 的速度差异。采用哈佛结构的单片机数据线和指令线分离,由于一般指令线宽于数据线,使其较之冯. 诺依曼结构单片机指令包含更多的处理信息,执行效率更高、速度亦更快。同时这种单片机指令多为单字节, 指令存储器的利用率大大提高,有利于实现超小型化。指令和数据集中存储一个优点是存储空间的利用率较高,哈佛结构的指令和数据分开存储可能会导致存储空间利用率比较低。实际的程序,指令和数据的比例一般不会为1 :1 ,甚至两者相差很大,所以经常会出现一个存储器放得很满,另一个存储器比较空的情况。现代计算机中的高速缓冲存储器Cache ,第一级Cache 层次采用哈佛结构,把Cache 分为指令Cache 和数据Cache 两个部分,而主存储器采用冯. 诺依曼结构,只有一个,由指令的数据合用。如此将冯. 诺依曼结构和哈佛结构结合起来,不仅可以提高主存储器的利用率,而且可以提高程序执行的效率,缩短指令执行的时钟周期。
指令和数据混合存储,即一个存储单元在解释时期其性质是含混的。这个含混性只有当被取出或当成一条指令来执行或当成一个数据来操作时才暂时地能分辨出来。[3] 对含混的开拓之一,产生了指令修改技术。即在计算机的运算器中作为某些操作的结果产生的数据,和其他的数据一样放在存储器中,但以后当作指令来取出和执行。迭代法的实现就是靠把指令当成数据取出,对它的地址段进行修改,然后把它存起来,并把它当成一条指令再取出和再执行。假设在哈佛结构中实现迭代法,可以想象是非常困难的。哈佛结构中,指令和数据是严格区分的,分别存储在不同的存储器中,从指令存储器中取出来的CPU 只会把它当成指令进行处理,而不会当作数据处理。所以指令的自我修改是很难实现的。指令自我修改技术在指令系统设计中的微程序设计中得到了非常成功的应用。机器语言的一条指令对应于一个微程序。微程序从微程序入口开始执行。每条微指令执行完毕后,都要根据其顺序控制字段的规定形成后续微地址,写入微地址寄存器uAR ,保证微程序的连续执行。[2] 一些微指令的后续微地址不是按增量的方式形成的,在执行前是不确定的,例如条件转移微指令,只能在当前微指令执行结束后根据测试条件确定后续微指令的地址,然后写入微地址寄存器中,使后续微指令顺利调入和执行。
指令与数据不加区别混合存储,操作数本身没有属性标志,其类型要由指令的操作码确定。[1] 对于不同的数据类型,虽然进行同一种操作,也要设置不同的操作码。例如,加法就要用定点加、浮点加、浮点双字加、十进制加等不同的操作码来区分不同操作数的数据类型。高级语言中用说明语句来指明数据类型,数据类型直接属于数据本身,因而运算符对各种数据类型是通用的,运算符中并不需要有数据类型的含义。所以机器语言指令的数据表示方法同高级语言的对数据属性的说明之间有很大的语义差距。究其原因,主要是指令和数据是无法区分造成的。因而冯. 诺依曼结构中多采用CISC 指令系统。哈佛结构中指令和数据是完全分开的,这种天然的属性使我们可以采用一种带标志的数据表示方法(如图3 所示)来缩小语义差距。这样每种操作只要用一种操作码,指令类型就较少,所需指令操作码位数减少,可以简化编译器的设计。所以在哈佛结构中采用RISC 指令系统是很自然的。当然,采用带标志符的数据表示需要增加硬件来进行数据类型的判别和转换,但这比冯. 诺依曼结构中用软件变换效率要高得多,且生成的目标代码较短。
指令级并行是提高计算机性能的一个主要方向,其中一个重要技术是指令流水。但是流水线中会因为指令间的相关而造成流水线的停顿,使指令不能连续不断地进入流水线,其结果是降低流水线的工作效率,使流水线达不到理想CPI 为1 的目标。流水线指令相关具体分为结构相关、数据相关和控制相关。哈佛结构可以免除许多结构相关和因寄存器中数据相关引起的问题[1] 。
结构相关是由流水线中的指令间争用有限硬件资源引起的。解决结构相关可以采取把有冲突的资源配置多套的办法。冯. 诺依曼结构中存储器冲突的结构相关在取指令(IF )和访存(MEM )阶段是经常发生的,即某指令需取指令的同时另一条指令在等待访存取操作数。由于取指令和取操作数不可以同时进行,造成了流水线若干时钟周期的延迟。这个问题在哈佛结构中被天然地解决了,其指令和数据是分开的,IF 和MEM 可以同时进行,根本不会产生IF 和MEM 的结构相关问题。数据相关是由重叠执行的指令引用同一个存储单元或同一个通用寄存器引起的。哈佛结构由于取指令和取操作数的同时进行,则很大部分的操作数不必事先取出放入寄存器中暂存,而是直接可以从数据存储器中取出送入ALU 部件进行运算。由于没有引用寄存器,很多寄存器的数据相关问题在无形中得到了完美的解决。而在冯. 诺依曼结构中就没有这样幸运了,需要通过设置旁路数据源、指令调度和寄存器改名等方法来尽量解决,如果实在无法解决就只好暂停流水线。
寄存器对应用程序是透明的,寄存器的分配和管理全部由编译程序来负责。计算机系统中的寄存器数量是非常的限的,为了高效合理地分配和利用寄存器,编译程序要运用复杂的策略进行分配。寄存器分配是一个NP 完全问题,所以少引用寄存器将会给编译程序减轻不小的工作量。哈佛结构由于减少了常用数据暂存寄存器的工作量,这样寄存器的分配和管理就会简单很多,从而简化了编译程序的设计。冯. 诺依曼结构中必须事先将数据读入寄存器中暂存,指令执行时再从寄存器送入ALU 部件进行运算,这就需要大量的寄存器。可是寄存器数量是很有限的,这个矛盾要由编译程序的合理分配来缓和,这加重了编译程序的负担,编译程序的设计也将变得更复杂。
如果仅仅从存储器的角度来看,哈佛结构的优越性更多一些。程序的执行最终需要明确区分指令和数据,假设冯. 诺依曼结构存储单元的含混性直到指令执行时仍没有得以区分,程序是没有办法执行的。Von Neumann 在IAS 体系结构设计中一个很重要的设计思想是设置了各种寄存器,其中有数据寄存器DR 和指令寄存器IR ,这与哈佛结构的设计思想是一致的。文章前面所提到的指令自我修改技术,哈佛结构实现起来比较困难,但并不是实现不了。完全可以设计一条专用地址修改指令用于修改指令的地址段,同样可以达到指令修改的目的。由此可见,冯. 诺依曼结构和哈佛结构并不是完全对立的,两者也有着微妙的联系。在计算机体系设计中,若能将两者的优点有机结合起来可能会取得非常好的实际效果。文章前面所提到的存储层次设计就是一个很好的例证,Cache 采用哈佛结构,而主存储器采用冯. 诺依曼结构,这样不仅缩短了指令执行周期,而且提高了存储器的利用率。
[ 参考文献]
[1] 、 孙强南、孙昱东 计算机系统结构 2002.7 科学出版社
[2] 、俸远祯、阎慧娟、罗克露 计算机组成原理 1996.4 电子工业出版社
[3] 、 张效强 计算机科学技术百科全书 1998.8 清华大学出版社