【计算机系统结构】【延迟槽技术】分支延迟、分支预测和MIPS延迟槽

注:本文从系统结构的角度去看待延迟槽这一技术,故不会涉及到代码细节,仅仅描述延迟槽的工作原理。且该文字描述的流水线基于的是经典的MIPS五段流水,即IF、ID、EX、MEM、WB。

一、前置知识

延迟槽出现是源于指令流水线中出现的控制冲突,由于分支指令需要在MEM段才将跳转地址传入PC,故在流水线中,需要有两个stall(流水线气泡)去等待分支指令的PC值(说白了就是得到分支是成功还是失败,跳转到的地址是哪里),因此效率是很低下的。

在这样的情况下,设计者为了减少分支延迟,则需要让流水线尽早判断出(或者猜测,这里只会介绍简单的分支预测)分支是否成功,并且尽早计算出分支的目标地址(实际上这两点是一个意思)。在对技术进行改进之后,可以使得流水线在ID段结束就可以得到分支的跳转方向,这无疑很大程度上提高了效率,但还不够,因为这仍然存在着一个分支延迟,导致效率的降低。因此出现了三种比较简单的进一步减少分支延迟的方法

减缓方法

一、预测失败、成功

这两种方法实际上就是去猜测分支跳转的方向,比如猜测分支总会成功。这样的预测是有实际意义的:例如程序中某个函数在多次样例下总是向着正确分支的方向跳转,那么我们就可以预测这个函数的分支就是向着正确的方向跳转。事实证明这样确实可以提高效率。而预测失败大同小异,即预测分支向着失败的方向跳转。

下图是采用预测分支失败的方法的流水线时空图:可以看到该情况下分支失败就可以忽略等待跳转的结果。但在预测失败时,需要丢弃掉原预测方向的指令,选择正确的指令进行执行。
【计算机系统结构】【延迟槽技术】分支延迟、分支预测和MIPS延迟槽_第1张图片

二、延迟分支(Delayed Branch)

这种方法的思想其实是去延长分支指令的执行时间,因此多出来的时间可以用来填补上图分支预测失败导致的丢弃指令的操作。那么如何延长呢?其实就是通过设置延迟槽(slot),一般来说,延迟槽都是一个,且无论分支是否成功,都需要执行延迟槽中的指令。即:

(1) 分支指令
(2) 延迟槽
(3) 后续指令

那么延迟槽的内容是什么呢?毕竟延迟槽是需要被执行的,那么最好是执行一些无论分支成功失败都要执行的指令,最好还与分支并不相干。比如如下的执行过程,延迟槽的指令如果是一条和分支完全无关的指令,那么就可以很好的填补预测错误导致的丢弃指令的操作,也就避免了时钟周期的浪费,使得指令更加紧凑
【计算机系统结构】【延迟槽技术】分支延迟、分支预测和MIPS延迟槽_第2张图片而如何选择这样的语句呢?常用的调度方法有三种:从前调度、目标处调度和失败处调度。
【计算机系统结构】【延迟槽技术】分支延迟、分支预测和MIPS延迟槽_第3张图片
以从前调度举例:原来的情况是if跳转成功则执行某条语句(即箭头指向),而前面的add指令与分支无任何关系,那么此时将其放入延迟槽(要记得,无论分支预测如何,都要执行延迟槽指令,且是在branch后一句执行),就可以充分利用分支指令的空间。而剩下两种方法也是如此。

而目标调度并不是直接移动指令的原因是别的路径可能也要执行改条指令。

总而言之,延迟槽的作用就是通过找与分支无关的指令(或者不影响分支运行的指令)去充分利用分支的空间,进而削弱预测分支的副作用,减少分支延迟。

你可能感兴趣的:(计算机系统结构,github,git,数据结构,硬件架构)