第四章 流水线中各种相关及其处理
31
4.4 控制相关
与数据相关相比,控制相关将产生更大的流水线性能损失。控制相关是因为程序的执行方向可能被改变而引起的相关,有的时候,我们也称之为全局性相关。可能改变程序执行方向的指令通常有无条件转移、一般条件转移、复合条件转移、子程序调用、中断等。下面介绍一些常用的处理方法。
4.4.1 猜测法
设有条件转移指i,其两个分支分别为i和p,若转移成功时按原来的顺序从i接着往下执行;若转移成功是则转向p执行。流水方式是同时解释多条指令,因此,当指令i进入流水线,后面进i+1还是进p,只有等条件码建立才能知道,而这一般要等这条条件转移指令快流出流水线时才行。如果在此期间让i后的指令都等着,流水线就会“断流”,性能急剧下降。这种时候,绝大多数机器都采用猜测法来解决这一问题。
那么,猜测法选哪个分支比较好呢?如果两个分支概率相近时,宜保持原来的顺序,即继续执行i+1,因为这些指令一般已经预取进指令缓冲器,可以很快从指令缓冲器中取出,进入流水线而不必等待。如果猜选成功转移分支,指令p很可能不在指令缓冲器中,需要花较长时间去访存取得,使流水线实际上断流。
采用猜测法时,应能够保证猜测出错时可恢复分支点原先的现场,一般有三种办法。一种是对指令只进行译码和准备好操作数,在转移条件码出现之前不进行运算;一种是让他运算完,但是不送回运算结果;另外一种是让它和正常情况一样,不加区别的全部解释完,只要把可能被破坏的原始状态都有后援缓存器保存期来,一旦猜错就取出后援缓存器的内容来恢复分支点的现场。早期曾经用过前面两种方法。现在,随着器件的价格、体积、技术的进展,一般都用第三种方法以保证效率。
为了在猜错时能尽快回复到原分支点,转入另一分支,在沿猜测路径向前流动的同时,还可以由存贮器预取转移成功分支的头几条指令放在转移目标指令缓冲器中。以便在猜错时,不必从访存取p开始,减少了流水线的等待时间。
32
CPU中指令流水线技术研究
4.4.2 加快和提前形成条件码
尽快、尽早获得条件码以便提前知道流向哪个分支,是会有利于流水机器简化对转移的处理的。这可以从两方面采取措施。
一方面是加快单挑指令内部条件码的形成,不等指令执行玩完,就提前形成反应运算结果的条件码。例如,乘除结果是正、负还是零的条件码可以在运算前形成。Amdahl 470V/6 就按照此思路,在流水运算器输入端设置LUCK部件,可以对大多数指令预判断出他们的条件码,从而在具体运算前就能将运算结果的条件码送到指令分析部件。
另一方面是在一段程序内提前形成条件码,这特别适合于循环型程序在判断循环是否继续时的转移情况。例如 FORTRAN DO 循环,每当执行到循环终端语句时,总要对循环控制次数减去1,如果减下来结果为0就跳出循环,否则继续执行循环体部分,这通常是用减1和等于零条件转移两条指令来实现的。为了使等于零条件转移指令的条件码能提前形成,完全可以将减1指令提前到与其不相关的其他指令之前,甚至提前到循环体开始时进行。
4.4.3 采取转移延迟
这是用软件的方法进行静态指令调度技术。不必增加硬件,在编译生成目标指令程序时,将转移指令与其前面不相关的一条或者多条指令交换位置,让成功转移总是延迟到在这一条或者多条指令执行之后再进行。这样,可以使转移造成的流水性能损失减少到0。
4.4.4 加快短循环程序的处理
一是可以将长度小于指令缓冲器容量的短循环程序整个一次性放入指令缓冲器内,并暂停预取指令,避免执行循环时由于指令预取导致指令缓冲器需循环执行指令被冲掉,从而可以减少访问主存重复取指的次数;而是由于循环分支概率高,因此让循环出口端的条件转移指令恒猜循环分支,以减少因条件分支造成流水线断流的机会。
第四章 流水线中各种相关及其处理
33
有的机器还采取顺序执行时,让预取指令既放入正常使用的指令缓冲器,也放入转移目标指令缓冲器中。一旦检测出是循环时,可以转移到指令缓冲器的内容作为短循环程序控制用,省去了第一次循环时,重新从主存中取此短循环程序中指令的操作开销。还有的机器允许将这两种指令缓冲寄存器连接起来使用,使更大的循环程序也能得到加快处理。
34
CPU中指令流水线技术研究
第五章 中断处理与流水线调度
35
第五章 中断处理与流水线调度
中断处理和非线性流水线及多功能流水线调度问题也是设计指令流水线时非常值得注意的两个大问题,在本章,我们将对这两大问题进行初步的研究。
5.1 中断处理
中断会引起流水线断流。然而,其出现的概率比条件转移的概率要低得多,且又是随机发生的。所以,流水机器处理中断主要是如何处理好断点现场的保护合恢复,而不是如何缩短流水线的断流时间。
在执行指令i时有中断,断电本应该在指令i执行结束,指令i+1尚未开始执行的地方,但流水机器是同时解释多条指令,指令i+1、i+2?可能已经进入流水线并且被部分解释了。对于一部流动流水线,这些指令中有些可能流到指令i前面去了。
早期的流水机器,如IBM 360/91,为了简化中断处理,采用了“不精确断点”法。不论指令i在流水线的哪一段发生了中断,都不再允许尚未进入流水线的后续指令再进入,但已在流水线中的所有指令仍继续流动到执行完毕,然后才转入中断处理程序。这样,断点就不一定是i,可能是后面的i+1、i+2?,即断点是不确定的。仅当指令i在第一段响应中断时,断点才是精确的。
这种“不精确断点”法不利于编程和程序的排错。后来的流水机器多采用“精确断点”法,如 AMDAHL470/6 。不论指令i是在流水线中的哪一段响应中断,给中断处理程序的现场全部都是对应i的,i之后流入流水线的指令的原有现场全部都能恢复。这种方法需要设置很多后援寄存器,以保证流水线内各条指令的原有现场都能够恢复。如前所述,这些寄存器也是“指令复执”所必须的,并不需要另外设置。
5.2 流水线调度