深入理解操作系统(11)第四章:处理器体系结构(3)流水线的通用原理(包括:吞吐量/流水线的操作/流水线的局限性/流水线的实现)
1. 流水线的通用原理
在试图设计一个流水线化的Y86处理器之前,让我们先来看看流水线化的系统的一些通用属性和原理。
对于曾经开车通过自动汽车清洗线的人,都会非常熟悉这种系统。在流水线化的系统中,待执行的任务被划分成了若干个独立的阶段。在汽车清洗中,这些阶段包括喷水和打肥皂、擦洗、上蜡和烘干。通常都会允许多个顾客同时经过系统,而不是要等到一个用户完成了所有从头至尾的过程才让下一个开始。
吞吐量:
流水线化的一个重要特性就是增加了系统的吞吐量( throughput),
也就是单位时间内服务的顾客总数,不过它也会轻微地增加执行时间(latency),
也就是服务一个用户需要的时间。
1.1 计算流水线
1.1.1 非流水线化的硬件系统例子
图4.32
ps 微微秒 picosecond
它是由一些执行计算的逻辑以及一个保存计算结果的寄存器组成的。时钟信号控制在每个特定的时间间隔加载寄存器。
CD播放器中的解码器就是这样的一个系统。输入信号是从CD表面读出的位,逻辑部分对这些位进行解码,产生音频信号。图中的计算块是用组合逻辑来实现的,意味着信号会穿过一系列逻辑门,在一定时间的延迟之后,输出就成为了输入的某个函数。
执行时间:从头到尾执行一条指令所需要的时间称为执行时间
1.1.2 三阶段流水线
假设将我们的系统执行的计算分成三个阶段(A、B和C),每个阶段需要100ps(微微秒 picosecond),如下图所示。
图4.33
时钟周期设为100+20=120ps,得到的吞吐量大约为8.33GOPS
处理一条操作需要3个时钟周期,所以这条流水线的执行时间就是3×120=360ps
1.2 流水线操作的详细说明
三阶段流水线时序
图4.34
流水线操作的一个时钟周期
图4.35跟踪了时刻240~360之间的电路活动,操作OP1(用深灰色表示)经过阶段C,OP2(用浅灰色表示)经过阶段B,而OP3(用中度灰色表示)经过阶段A。
图4.35
说明:
在时刻240(点1),也就是时钟上升之前,操作OP1(用深灰色表示)和OP2(用浅灰色表示)已经完成了阶段B和A。在时钟上升后,这些操作开始传送到阶段C和B,而操作OP3(用中度灰色表示)开始经过阶段A(点2和3)。就在时钟开始再次上升之前,这些操作的结果就会传到流水线寄存器的输入(点4)。
1.3 流水线的局限性
1.3.1 不一致的划分
下图展示的系统中,和前面一样,我们将计算划分为了三个阶段,但是通过这些阶段的延迟从50ps到150ps不等。通过所有阶段的延迟和仍然为300ps。不过,我们运行时钟的速率是由最慢的阶段的速度限制的。
正如本图中流水线图表明的那样,每个时钟周期,阶段A都会空闲(用白色方框表示)100ps,
而阶段C会空闲50ps。只有阶段B会一直处于活动状态。
我们必须将时钟周期设为150+20=170ps,也就是吞吐量为5.88GOPS。另外,由于时钟周期减慢了,执行时间也增加到了510ps。
图4.36
对硬件设计者来说,将系统计算设计划分成一组具有相同延迟的阶段是一个主要的挑战。
通常处理器中的某些硬件单元,如ALU和存储器,是不能被划分成多个延迟较小的单元的。这就使得创建一组平衡的阶段非常困难。在设计我们的流水线化的Y86处理器中,我们不会过于关注这一层次的细节,但是理解时序优化在实际系统设计中的重要性还是非常重要的。
1.3.2 流水线过深,收益反而下降
下图说明了流水线技术的另一个局限性。
在这个例子中,我们把计算分成了6个阶段,每个阶段需要50ps。在每对阶段之间插入流水线寄存器就得到了一个六阶段流水线。这个延迟占到了整个时钟周期的28.6%。
图4.37
现代处理器为了提高时钟频率,采用了很深的(15或更多的阶段)流水线。
处理器设计师将指令的执行划分成很多非常简单的步骤,这样一来每个阶段的延迟就很小。电路设计者小心地设计流水线寄存器,使其延迟尽可能得小。
1.4 带反馈的流水线系统
当我们将流水线技术引入Y86处理器时,我们必须正确处理反馈的影响。
我们必须以某种方式来处理指令间的数据和控制相关,以使得到的行为与ISA定义的模型相符。