CHAPTER 12 REUCED INSTRUCTION SET COMPUTERS(第12章精简指令集计算机)●对设计RISC计算机,高级语言程序行为的研究成果是有指导意义。
程序中赋值语句占有最大份额,这暗示着简单的数据传送应当优化。
程序中还有许多IF和LOOP语句,基础的顺序控制机制需要进行优化,以准许有效地使用流水技术。
操作数引用样式的研究表明,在寄存器中保持适当数量的操作数会有助于性能的提高。
●RISC机器的关键特征:①有限的指令集并具有固定格式,②大量的寄存器或利用编译器来优化寄存器的作用,③强调对指令流水线的优化(optimizing)。
●RISC的简单指令集自身便利于有效的流水化;RISC指令集自身也有助于实施延迟转移技术(the delayed branch technique):将转移指令和其他指令重排能提高流水线效率。
下面给出了自计算机诞生以来某些最主要的进步。
●Family Concept:以不同的价格/性能特征提供的一级计算机,性能和价格方面的差异在于同样结构的不同实现。
●Microprogrammed Control Unit:微编程使控制器的设计和实现变得更容易,并提供了对系列概念的支持。
●Cache Memory:极大地改善了系统性能。
●Pipelining:将并行性引入机器指令程序顺序本性的一种方式。
●Multiple Processors:包含几种不同的组织和目标●RISC:最重要的变革,在语言和行为方面对大多数计算机结构的学识是一个挑战RISC系统的关键点是:①有限的和简单的指令集并具有固定格式,②大量的寄存器或利用编译器来优化寄存器的作用,③强调指令流水线的优化(optimizing)CP332+EP458表12.1比较了几个RISC和非RISC系统12.1INSTRUCTION EXECUTION CHARACTERISTICS 指令执行特征计算机发展最易见的形式是编程语言;随着硬件成本的下降,软件成本相对上升;通用性的扩展和编程人员的长期缺乏驱使软件成本在绝对意义上上升;软件运行多年后虽经不断修正仍继续出现新的缺欠。
因此,一个计算机系统存活期的主要成本是软件而不硬件。
研究人员和工业界对此的响应是,开发出了功能更强、更复杂的高级程序设计语言,高级语言(HLL:high-level language)允许编程人员能更简明地表示算法,更关注细节,并经常支持结构化程序设计。
由此而来的是语义间隙问题(Semantic Gap),即HLL中提供的操作与计算机结构提供的操作间的差异。
这种间隙现象(Symptoms of the Semantic Gap)被认为是,包括执行的低效、过长的机器程序和编译器的复杂性。
设计者试图以结构的改进来减小这个间隙。
关键的做法包括大指令集、若干的寻址方式和硬件实现的各种HLL语句设计人员寻找新的方法:使支持HLL的结构更简单而不是更复杂。
为了理解主张RISC的理由,先简要地重新审视指令执行的特征:●完成的操作●所用的操作数●执行顺序下面总结的几个有关高级语言研究的报告中,动态测量是通过收集某些特征已出现或某一具体特性已由该情况下的程序所执行,并统计执行次数来进行的。
静态测量只是在源程序文本上进行统计,它们没有加权到每条语句的执行次数。
12.1.1Operations 操作CP106+EP146表4.9包括了几个研究的重要结论:赋值语句在程序中很显著,这暗示简单的数据传送非常重要;条件语句亦在程序中占有优势,这表明指令集的顺序控制机制亦是关键。
因而应以一种“优化”形式(an optimal fashion)来支持它们。
研究者曾在V AX、PDP-11和Motorola68000上编译Patterson程序,以确定每类语句的平均机器指令数和平均存储器访问数。
将这些平均数乘以每类语句的出现频度,就得到了CP334+EP460表12.2。
结果表明:过程调用/返回是典型HLL程序中最耗时的操作。
12.1.2Operands 操作数Patterson的研究报告查看了各类变量的动态出现频度,详见CP334+EP460表12.3。
Pascal和C程序的结论是一致的:主要使用的简单标量变量,而且80%以上的标量是(过程的)局部变量。
结论:程序中大量访问的是标量,而且它们是高度局部化的。
研究显示,因为操作数存取如此频繁,适用快速存取的结构将起重要作用。
Patterson 研究提示,优化的主选方向应是对局部标量变量的存储和访问。
12.1.3Procedure Calls 过程调用过程调用和返回是HLL程序的一个重要部分。
表12.2指出,过程调用和返回是编译后的HLL程序中最耗时的操作。
因此,考虑高效实现这些操作的方式将是有益的。
Tanenbaum的研究指出,98%的动态调用过程中传送的量少于6个,而且其中92%是少于6个局部标量变量。
Berkeley的RISC小组报告的结果,如CP335+EP461表12.4所示。
Berkeley小组发现程序保持在相当窄的过程调用窗口区域内。
这就进一步证实了操作数访问(operand reference)是“高度局部化(highly localized )”的结论。
12.1.4Implications 结论试图让指令集结构更接近HLL并不是一个有效的策略;而通过优化典型HLL程序中最耗时操作的性能,能更好地支持HLL。
由此,表征RISC结构体现在如下三点:①使用大量的寄存器,可以优化操作数的访问;②精心谨慎地设计指令流水线,因为条件转移和过程调用指令的高比例,一个过于简单的指令流水线将是低效的;③对简单(Reduced)的指令集的需求。
12.2THE USE OF A LARGE REGISTER FILE 大寄存器方案的使用已经看到:①HLL程序中有大量的赋值语句;②每个HLL语句都有一定数量的操作数访问;③大多数访问的是局部标量。
故:侧重于寄存器存储是明智的。
其理由是,寄存器存储是比主存和Cache还要快的最快可用存储装置。
寄存器集从物理上讲是小的,与ALU和控制器建在同一芯片上,使用比主存和Cache地址还要短的地址。
因此:需要一种策略能使最频繁访问的操作数保持在寄存器中,并减少(minimize)“寄存器—存储器”操作。
有两种基本途径:①基于软件,②基于硬件。
软件方法是依赖编译器来使寄存器使用最大化(maximize)。
编译器将试图为那些在一给定时间期内使用最多的变量分配寄存器,并要求使用复杂的程序分析算法。
硬件方法是简单地装备更多的寄存器,以致更多的变量更长时间地保持在寄存器中。
12.2.1Register Windows 寄存器窗口使用一大组寄存器应能减少对存储器访问的需求。
显然,设计的任务就是很好地组织寄存器来实现这个目标。
因为大多数操作数量局部标量,局部的定义是随着每次过程调用和返回而改变的,过程调用是频繁出现的操作。
解决的方法是基于两个结论:①典型的过程只使用少数传送参数和局部变量;②过程动作的深度仅限定在一个相对窄的范围内(CP75+EP106图4.3)。
因此,使用多个小的寄存器组,每个小组指派给一个不同的过程。
过程调用时自动地切换来使用不同的但大小固定的寄存器窗口;相邻过程的窗口是重叠的,以允许参数传递。
CP337+EP463图12.1说明了上述方法:任何时刻,只有一个寄存器窗口是可见的和可寻址的;窗口分成三个固定长度域:参数寄存器域、局部寄存器域和临时寄存器域。
①参数寄存器用来保存调用当前过程的过程(父过程)向下传递的参数和将被返送的结果;②局部寄存器用于局部变量,由编译器指派;③临时寄存器(Temporary Register)用于当前过程与下一级过程(孙过程)交换参数和结果。
某一级的临时寄存器与下一级的参数寄存器是物理同一的,这种重叠(overlap)准许不用实际移动数据就能传递参数。
为管理任何可能样式的调用和返回,寄存器窗口的数目将必须是不受限制的。
寄存器窗口只用于保持少数最近过程的动作,旧的动作必须保持在存储器中并当嵌套浓度减少时再恢复;因此,寄存器集的实际组织是一个由重叠窗口组成的环形缓冲器。
CP337+EP464图12.2描述的是一个6窗口的环形缓冲器。
缓冲器已填充到深度 4 (A调用B,B调用C,C调用D),过程D是当前活动的过程。
当前窗口指针(CWP)指向当前活动过程的窗口;保存窗口指针(SWP:saved-window pointer),用来指明(Identify)最近保存在存储器的窗口。
结论:N个窗口的寄存器集仅能用于N-1个过程的动作。
有研究报告指出仅有1%的过程调用和返回需要8个窗口。
Berkeley RISC计算机使用8个窗口,每个窗口有16个寄存器。
Pyramid计算机使用16个窗口,每个窗口有32个寄存器。
12.2.2Global Variables 全局变量全局变量由多个过程所使用:①编译器为HLL中声明为全局的变量指派存储器位置。
对于频繁访问的全局变量来说,这种策略是低效的;②替代方法是CPU包含有一组全局寄存器,统一编号的方法能用来简化指令格式。
例如:寄存器引用号0~7是唯一的一组全局寄存器;对寄存器8~31的引用可以是当前窗口内的具体寄存器(对CWP)的位移。
12.2.3Large Register File versus Cache 大寄存器集与Cache的对比CP338+EP466表12.5比较了大寄存器集与Cache组织的特征:①寄存器集会使空间利用低效:寄存器仅容纳有用的变量②Cache蒙受另一类的低效:数据是成块读入Cache的,其中某些块甚至将不会使用。
③Cache能处理局部变量和全局变量。
④使用寄存器集,寄存器和存储器间的数据传送由过程嵌套深度所确定。
⑤基于Cache的系统是明显较慢的,Cache的存取时间肯定要长于寄存器的存取时间。
从性能的观点看:基于窗口的寄存器集对于局部标量是优选的;通过加入只由指令使用的Cache,能进一步改善性能12.3COMPILER-BASED REGISTER OPTIMIZATION基于编译器的寄存器优化1.编译器的目标:尽可能地在寄存器中而不是在主存中为多数计算保持操作数,并且减少装入和存储操作。
2.优化任务的本质:判定在程序的任何给定点,什么样的量应指派到寄存器中。
RISC 的编译器普遍使用图着色的技术(Gradph Coloring)图着色做法:①对于一个由结点和边组成的给定图,为结点指定颜色使相邻结点不同色,而且要使颜色的数目最少。
②该问题以如下方式转换成编译器问题:1)分析程序并构成一个寄存器相关图,图的结点是符号寄存器,若两个符号寄存器同时“存活(live)”于同一程序段期间,则相应的两个结点是用一条边连接起来以指出它们相关。