【计算机组成原理】流水线处理器

前言

流水线的想法源自于传统工厂生产产品的方式,通过这种方式大大提高了生产效率,反应在CPU上就是提高了指令的吞吐率。

上篇文章介绍了单周期处理器,姑且算是揭开了CPU那层神秘的面纱。现在我们来深入了解一下,一个超标量流水线处理器是什么样的。

流水线的设计

我们可以把一条指令的执行周期分为五个单独的过程,取指,译指,执行,访存,回写

要实现流水线,就得把每一步的计算结果用寄存器暂时保留下来,以便在下一个时钟周期到来时,将其提供给下一个步骤。下图的绿色长条,正是这些结果保存到寄存器所花的时间。还有一个值得注意的是,要保证流水线的平衡性,每个步骤所花的时间必须保证都在一个时钟周期内(比如,把一个耗时很长的步骤划分为两个小步骤),最好等于一个时钟周期,这样效率才能达到最高的。

总结的来说,流水线的目的,就是在时间上实现并行。

超标量流水线

具有两条或两条以上并行工作的流水线结构称为超标量结构。

其实也就是利用增加硬件的方式,在空间上实现了并行。

增加硬件,我们很容易联想到多核处理器,其实超标量结构是在CPU核内部的,而实际的多核是这样子的。

结构、数据、控制冒险

”冒险“在CPU技术里,是指的指令并行执行带来的各种硬件资源冲突,数据的读写顺序等等问题。下面分别讲一下这几个”冒险“。

  • 结构冒险。所需的硬件正在为之前的指令工作。
  • 数据冒险。需要等待之前的指令完成数据写入。
  • 控制冒险。需要根据之前的指令决定接下来的行为。

有一个万能的解决方案,就是执行“空泡指令”,也就是空指令,这样能使冒险的指令执行时间往后延迟。但这样显然效率太低了,因为冒险发生的频率太高。

于是研究者就提出了很多优化的方法。对于结构冒险,因为寄存器读写很快,所以完全可以把一个周期的前半段分给读操作,后半段分给写操作。对于数据冒险,可以利用”数据前递(forwarding)“,需要的数据在ALU计算完后能用了,而不要等到回写之后。对于控制冒险,可以通过在寄存器堆的输出端增加一个额外的比较电路,这个电路很简单,所以才可以塞在ID阶段的周期里。

这些优化的具体实现可能会比较复杂,不过要解决的问题,以及解决原理大概就是这样了。

你可能感兴趣的:(Component)