title: 流水线技术
date: 2022-01-17 22:05:59
tags:
categories: 计算机体系结构
description: 流水线是实现多条指令重叠执行的技术,其目的是在硬件尽可能的情况下增加吞吐量。一条指令的执行需要多个操作,流水线技术充分利用了这些操作之间的并行性。流水线是加快CPU速度的关键实现技术。
一、流水线技术介绍
1.1 什么是流水线
流水线是实现多条指令重叠执行的技术,其目的是在硬件尽可能的情况下增加吞吐量。一条指令的执行需要多个操作,流水线技术充分利用了这些操作之间的并行性。流水线是加快 CPU 速度的关键实现技术。
拿洗衣服来举例子,假设洗衣服有四个步骤(每个步骤用时相同):
- 洗衣机洗衣
- 烘干机烘干
- 叠好衣服
- 放进衣柜
如上图一所示,每个人洗完自己的衣服,下一个人才可以开始洗自己的衣服,总共需要花费 16 个步骤时间;上图二所示,每个人并行洗衣。当一个人洗衣机用完时,进入烘干机阶段,另一人立刻进入洗衣机阶段。此时总共只要花费 7 个步骤时间。
1.2 经典的五级流水线
流水线是指将计算机指令过程分为多个步骤,并通过多个硬件处理单元并行执行来加快指令执行速度。其中有两个关键点:
- 拆分过程
- 并行
-
取指令(fetch)
根据 PC 将指令从存储器中读取出来的过程。
-
译码(decode)
对指令进行译码,从通用寄存器堆(Regfile)中将操作数读出。
-
执行(execute)
对指令进行真正运算的过程。
-
访存(memory access)
指存储器访问指令将数据从存储器中读出,或者写入存储器的过程
-
写回(write back)
指将指令执行的结果写回通用寄存器组的过程。如果是普通运算指令,该结果值来自于“执行”阶段计算的结果:如果是存储器读指令,该结果来自于“访存”阶段从存储器中读取出来的数据。
1.3 流水线划分
流水线划分条件:
- 流水线中每个阶段所需的时间近乎相等。
- 流水线中每个阶段的操作都会被重复执行。
- 流水线中每个阶段的操作都与其他流水段相互独立。
不同的指令集,流水线实现的难易也是不同的。对于复杂的 CISC 指令集,如 x86,指令长度不同,并且执行时间 也不同,所以直接实现流水线是比较复杂的;对 RISC 来说,如 MIPS 和 ARM,由于指令的长度相等,并且每条指令所完成的任务比较规整,所以较容易用流水线实现。
1.4 流水线的深度
- 在两级寄存器(每一级流水线由寄存器组成〉之间的硬件逻辑越少,就意味能够运行到更高的主频。因此, 现代的处理器流水线极深主要是由于处理器追求高频的指标所驱使。主频越高也意味着流水线的吞吐率越高,从而性能越高。
- 由于每一级流水线都由寄存器组成,更多的流水线级数要消耗更多的寄存器,以及更多的面积开销。
- 较深的处理器流水线还有一个问题,那就是由于在流水线的取指令阶段无法得知条件跳转的结果是到底跳还是不跳,因此只能进行预测,而到了流水线的末端才能够通过实际的运算得知该分支是真的该跳还是不该跳。如果发现真实的结果与之前预测的结果不相符,则意味着预测失败,需要将所有预取的错误指令流全部丢弃掉。重新取正确的指令流,这个过程叫作“流水线冲刷( Pipeline Flush )” 。那么,流水线的深度越深,意味着己经预取了更多的错误指令流,需要将其全部抛弃然后重启,不仅白白浪费了功耗,还造成了性能的损失。
二、流水线冲突
2.1 结构冒险
**同一个部件同时被不同指令所使用。**比如说,当处理器是冯诺依曼结构时,只有一个存储器。在访存阶段,一条需要读出一条数据,而另一条指令需要写入一条数据,这时就会产生结构冒险。
2.2 数据冒险
-
WAR(Write After Read)
假设指令 j 是在指令 i 后面执行的指令,WAR 表示指令 i 读出数据后,指令 j 才能写这个寄存器。
ADD R2, R1, R0 SUB R0, R3, R4
-
WAW(Write After Write)
假设指令 j 是在指令 i 后面执行的指令,WAW 表示指令 i 将数据写入寄存器后,指令 j 才能将数据写入这个寄存器。
ADD R0, R1, R2 SUB R0, R4, R5
-
RAW(Read After Write)
假设指令 j 是在指令 i 后面执行的指令,RAW 表示指令 i 将数据写入寄存器后,指令 j 才能从这个寄存器读取数据。
ADD r1,r2,r3 SUB r4,r5,r1
2.3 控制冒险
转移或异常改变执行流程,顺序执行指令在目标地址产生前已被取出。
三、流水线冲突解决方法
3.1 结构冒险
- 采用哈弗结构,指令存储器和数据存储器分离。
- 多级缓存
3.2 数据冒险
-
流水线阻塞(stall)
-
软件插入“NOP”指令
-
寄存器重命名
-
编译优化:调整指令顺序
-
旁路(Bypassing)技术
但是,Bypassing 并不能解决所以的数据冒险问题,它不能解决 Load-use data hazard。
3.3 控制冒险
- 动态分支预测
- 硬件阻塞(stall)
- 插入三条“NOP”指令