|
|
本章主要介绍了如何利用流水线来提高指令执行效率。主要内容包括:指令流水线的一般原理、流水线方式下的吞吐率和指令执行时间、流水线的局限性、流水线寄存器的概念、流水线冒险的种类、结构冒险及其处理、控制冒险及其处理、分支预测原理、数据冒险及其处理、转发或旁路技术的原理、流水线数据通路的设计、流水线的控制信号、超标量和动态流水线的概念。具体总结如下: (1)指令流水线的设计 a)将每条指令的执行规整化为若干个同样的流水阶段 b)每个流水阶段的执行时间一样,都等于一个时钟 c)理想情况下,每个时钟有一条指令进入流水线,也有一条指令执行结束 d)每个流水段中的部件都是组合逻辑加寄存器,组合逻辑中产生的结果在时钟到来时被存储到寄存器(如:程序计数器、条件码寄存器、流水线寄存器等)。每两个相邻流水段之间的流水线寄存器,用以记录所有在后面阶段要用到的各种信息,例如:控制信号、指令的代码、参加运算的操作数、指令运算结果、指令异常信息、寄存器读口地址、寄存器写口地址、存储器地址、新的PC值等。 e)指令译码得到的控制信号通过流水线寄存器传送到后面各个流水段中 (2)指令流水线的局限性 a)并不是每条指令都有相同多个流水段 b)并不是每个流水段都一样长 c)随着流水线深度的增加,流水线寄存器的额外开销比例也增大 d)指令在资源冲突、数据相关或控制相关时会发生流水线冒险 (3)指令流水线的执行效率 a)吞吐率:比非流水线方式下大大提高 b)指令执行时间:相对于非流水线方式,一条指令的执行时间延长了 (4)流水线冒险的种类 a)结构冒险(资源冲突):多条指令同时使用同一个功能部件 所用解决策略如下: ①规定每个功能部件在一条指令中只能被用一次 ②规定每个功能部件只能在某个特定的阶段被用 ③指令存储器(Code Cache)和数据存储器(Data Cache)分开 b)数据冒险(数据相关):前面指令的结果是后面指令的操作数 所用解决策略如下: ①用软件(如:编译器)在后面的数据相关指令前插入nop指令 ②硬件上,在后面数据相关指令的特定流水段插入“气泡”以“阻塞”指令继续执行,直到取得所需数据为止 ③利用“转发”(旁路)技术把前面指令执行过程中得到的数据直接传送到后面指令用操作数的地方 ④对于取数后直接使用的情况(如:Load指令取出的数据是随后的运算指令的操作数),则采用“阻塞加转发”的方式解决数据冒险 c)控制冒险(控制相关):返回指令、分支指令等有可能改变顺序增量的PC值,由于获取转移目标地址的时间较长,使得在目标地址产生前已经有指令被取到流水线中,如果已经取出执行的指令不是正确的指令,则发生了控制冒险。 所用解决策略如下: ①用软件(如:编译器)在控制相关指令后面插入nop指令 ②硬件上,在控制相关指令后面的指令被取出前插入“气泡”,使流水线停顿若干时钟,直到控制相关指令得到正确的PC值为止。 ③采用“分支预测”技术。简单(静态)地预测每次分支结果都一样,或根据分支指令执行历史进行动态预测,动态预测能达到90%的成功率。 ④采用延迟分支技术。将前面一条与分支指令无关的指令放到分支指令后面执行,这样,流水线不会发生阻塞现象。这种对指令顺序进行调整的工作在程序编译阶段完成。 (5)超流水线:级数更多的流水线 (6)超标量流水线:同时发射多条指令的流水线 (7)动态流水线:“乱序”执行的流水线
|