流水线机制简介
流水线机制简介
流水线是RISC处理器执行指令时采用的机制。使用流水线,可在取下一条指令的同时译码和执行其他指令,从而加快执行速度。可以把流水线看作是汽车生产线,每个阶段只完成一项专门的生产任务。
图 1显示了一个3级流水线:
z 取指(fetch)——从存储器装载一条指令; z 译码(decode)——识别将被执行的指令;
z 执行(execute)——处理指令并把结果写回寄存器;
图 1 ARM7的3级流水线
图 2通过一个简单的例子说明了流水线机制。在第1个周期,内核从存储器中取出指令ADD;在第2个周期,内核取出指令SUB,同时对ADD指令译码;在第3个周期,指令SUB和ADD都沿流水线移动,ADD指令被执行,而SUB指令被译码,同时又取出CMP指令。流水线使得每个时钟周期就可以执行一条指令。
随着流水线深度(级数)的增加,每一段的工作量被削减了,这使得处理器可以工作在更高的频率,同时也改善了性能。但系统延时(latency)同样也增加了,这是因为在内核执行一条指令前,需要更多的周期来填充流水线。流水线级数的增加也意味着在某些段之间会产生数据相关。可使用指令调整技术来编写代码,以减少数据相关。
图 2 流水线指令顺序
每种ARM系列的流水线设计都有差异。例如,ARM9内核把流水线深度增加到5级,如图 3所示。ARM9增加了存储器访问段和回写段,这使得ARM9的处理能力可达到平均1.1DhrystoneMIPS/MHz,与ARM7相比,指令吞吐量增加了约13%。同时,ARM9内核能达到的最高频率也更高。
图 3 ARM9的5级流水线
ARM10更是把流水线的深度增加到6级,如图 4所示。ARM10的平均处理能力达到1.3DhrystoneMIPS/MHz,与ARM7相比,指令吞吐量增加了约34%。但同时有较大的系统延时。
图 4 ARM10的6级流水线
虽然ARM9和ARM10的流水线不同,但它们使用了与ARM7相同的流水线执行机制,因此ARM7上的代码也可以在ARM9和ARM10上运行。
流水线执行的特点
ARM流水线的一条指令只有在完全通过“执行”阶段才被处理。例如,一条ARM7流水线(有3级)只有在取第4条指令时,第一条指令才完成执行。
图 5显示了流水线及程序计数器PC的使用情况。在指令“执行”阶段,PC总是指向该地址加8字节的地址。换句话说,PC总是指向当前正在执行的指令的地址再加2条指令的地址。当用PC来计算一个相对偏移量时,这一点是很重要的,并且它也是所有流水线的结构特征:
图 5 例子:pc = address+8
另外,还有3个值得注意的流水线特征:
第一, 执行一条分支指令或直接修改PC而发生跳转时,会使ARM内核凊空流水线; 第二, ARM10使用分支预测技术,通过预测可能的分支并在指令执行前装载新的分支地
址,从而减少了凊空流水线的影响;
第三, 即使产生了一个中断,一条处于“执行”阶段的指令也将会完成。流水线里其他指
令将会放弃,而处理器将从向量表的适当入口开始填充流水线。