计算机组成与设计(九)—— 流水线处理器
流水线的基本原理
指令的主要执行步骤
这个是之前设计的单周期寄存器,它已经能正确的执行MIPS指令。
而MIPS的指令可以分成如下5个阶段:
- 取指(Fetch)::从存储器取指令,并更新PC
- 译码(Decode):指令译码,从寄存器堆读出寄存器的值
- 执行(Execute):运算指令:进行算术逻辑运算,访存指令:计算存储器的地址
- 访存(Memory):Load指令:从存储器读指令,Store指令:将数据写入寄存器
- 回写(Write Back):将数据写入寄存器堆
与示意图结合如下:
单周期与流水线的区别
全在这个图里:
实际上,流水线并不会缩短单条指令的执行时间(甚至会增加时间),而是提高指令的吞吐率(单位时间进多少指令,有多少指令完成)。
添加流水线寄存器
我们要改造成流水线寄存器的话,我们发现每个阶段所需的硬件资源基本是独立的,如果我们能把指令存储器输出的指令编码事先保存下来,那我们就可以提前更新PC寄存器的值,并用这新的值去指令存储器当中取出一个新的指令,而在取新指令的同时,刚才取出的那条指令的编码就会被分解成不同位域,而寄存器堆也会根据输入送出对应寄存器的内容。所以需要添加流水线寄存器。
流水线寄存器:保存了前一个阶段要向后一个阶段传递的所有信息。
所以每过一个时钟周期,都可以更新寄存器的值,而不会影响当前的执行过程,当前执行所需要的全部信息都保存好在流水线寄存器中。
在两个阶段之间添加流水线寄存器后,此时5个阶段所作的工作还要与流水线寄存器联系起来
- 取指令(IF):利用PC中的地址从存储器中读取指令,然后将指令放入IF/ID流水线寄存器中
- 指令译码和寄存器堆的读取(ID):IF/ID流水线寄存器中的指令包括用于读取寄存器的两个寄存器号和用于符号扩展的16位立即数。读出的两个寄存器值和符号扩展后的32位立即数都存放在ID/EX流水线寄存器中
- 指令执行或地址计算(EX):指令执行或地址计算,并将结果存放在EX/MEM流水线寄存器中
- 存储器访问(MEM):根据EX/MEM中的有效地址读取数据。值得注意的是,需要写入寄存器的数据在较早的流水级中已经读取并存放在ID/EX中。在MEM级获得这个数据的唯一方法是把数据放入EX步骤中的EX/MEM流水线寄存器中,这一过程与将有效地址放入EX/MEM流水线中类似
- 写回(WB):在寄存器堆写信号有效时,将数据写入目的寄存器。sw指令在回写步骤不用做任何事
性能分析,与之前的流水线相比,多了流水线寄存器的延迟,周期200到250ps。
流水线的优化
“超级流水线”技术
“超级流水线”技术:将五级流水线细分为更多的阶段,增加流水线的深度。
这样缩短了周期,从而提升了时钟频率,从而提高了指令吞吐率。
流水线的级数
流水线的级数是越大越好吗?肯定不是。级数越大,所用的流水线寄存器相应增加,单条指令的延迟增加,流水线寄存器延迟比例增加;填满流水线的指令条数更多,指令之间的关系更加复杂。
超标量流水线
超标量结构
超标量结构:通常,将具有两条或两条以上的并行工作的流水线结构称为超标量结构,亦称为“超标量流水线”或超标量。
如图,我们对每个阶段扩大一倍,那么可以同时对两个指令进行操作。第一、二条指令同时进入阶段一,经过一个时钟周期,第一、二条指令进入阶段二,同时第三、四条指令进入阶段一......这样每个阶段两条指令并行前行,到第五个周期就有两条指令同时被完成。
像这样两者并行的结构叫作双发射的结构。按这种方式扩大,就能得到三发射、四发射,这就是超变量流水线寄存器的原理。
超标量的应用
ARM Cortex-A9的超标量流水线
它每个时钟周期可以发射4条指令,根据指令的不同,总共会经过8~11级流水线。在流水线的前端比如说 取指,译码并没有分成多条流水线而是采用统一的部件。当然我们要知道这些部件虽然看上去是一个,但它实际上比标量流水线要大得多,比如说取指部件至少一次要能取来四条指令甚至更多,而译码部件一次也至少应该完成四条指令的译码,而到了流水线的后端, 才会从结构表示上体现出多条并行流水线的形态。
Core i7的超标量流水线
- 取指令:从高速缓存中取出指令,取回128bit,16个字节
- 将这16个字节放入指令译码器:因为x86指令长度是不固定的,所以首先要经过一个 指令长度的译码器,分解出到底哪几个字节是一条指令。
那么在这一点上类似的指令系统就体现出了明显的优势, 它每条指令都是定长的,不用额外进行这样的识别工作。
- 微指令译码:在译码器当中通过硬件会将x86的指令转换成更为简单的类MIPS指令, Inter称之为“微操作”。那从这里可以看出有三个简单的译码器,用于对那些比较简单的x86指令进行转换,每条指令对应一个微操作;而那些非常复杂的指令则会通过这个复杂的译码器转换成多条V操作。从而可以充分运用大量面向RISC处理器研发出的高级流水线的技术,这也就是为什么我们现在经常说x86虽然是一个CISC的指令系统, 但它实际上是用RISC的方式去实现的
- ......
超标量与多核CPU
现在的多核CPU通常是在一个CPU芯片中集成了多个超标量处理器核。同时包含指令高速缓存和数据高速缓存,对应了我们原理结构当中的指令存储器和数据存储器。为了提高性能现在的处理器当中一般还配备了二级的高速缓存。 这些部件的关系非常紧密,我们通常也就把这一部分称为一个处理器核。
那么刚才看到那个四发射十六级流水线的结构图就是在只这么一个处理器核内部的结构,那么可以说这一个处理器核就是一个超标量流水线的处理器核。
参考链接:https://www.coursera.org/learn/jisuanji-zucheng/lecture/dL6g2/604-liu-shui-xian-de-mou-xian