内容要点:流水线,相关和冒险
1. 流水线基本原理
- 执行指令的主要步骤(MIPS)
1. 取指(Fetch) | 从存储器取指令,更新PC |
---|---|
2. 译码(Decode) | 指令译码,从寄存器堆读出寄存器的值 |
3. 执行(Execute) | 运算指令:进行算术逻辑运算 访存指令:计算存储器地址 |
4. 访存(Memory) | Load指令:从存储器读数据 Store指令:将数据写入存储器 |
5. 回写(Write-back) | 将数据写入寄存器堆 |
2. 流水线寄存器性能分析
- 流水线中的各个处理部件可并行工作,从而可使整个程序的执行时间缩短
- 流水线并不会缩短单条指令的执行时间(甚至会增加),从而提高了指令的吞吐率
-
流水线的最终性能目标:最大的指令吞吐率!
3. ”超级流水线“技术(Super Pipelining)
- 将五级流水线细分为更多的阶段,增加流水线的深度
- 提升时钟频率,从而提高指令吞吐率
- 比如:5级(T=200ps+50ps=250ps)=>10级(T=100ps+50ps=150ps)
- 但单条指令延迟:5级(250*5=1250ps)=> 10级(150*10=1500ps)
- 级数不是越多越好(现在一般15级左右)
- 13年,Core i7(Haswell):14级
- 13年,Cortex-A57:15级
4. 超标量流水线
- 超标量结构(Superscalar):通常具有两条或两条以上并行工作的流水线结构
- 使用该结构的处理器称为超标量处理器
- 标量和超标量流水线
- 单周期 -> 标量流水线:时间并行性的优化,主要是对现有硬件的切分
- 标量 -> 超标量:空间并行性的优化,需成倍增加硬件资源
- 超标量流水线与多核CPU
- 现代的多核CPU通常是在一个CPU芯片中集成了多个超标量处理器核
- Pentium的超标量流水线(第一款超标量X86 CPU)
- 两条流水线:”U流水“和”V流水“
- 每条流水线都拥有自己的地址生成逻辑、ALU及数据Cache接口
- 在一个时钟周期内,可以同时发送两条指令
- CDC6600:第一台超级计算机(1964)
- Cortex-A9的超标量流水线
- 4发射,8~11级流水
- Core i7的超标量流水线
- 4发射,16级流水
5. 冒险(Hazard)
阻止下一条指令在下一个时钟周期开始执行的情况
-
结构冒险
-
所需要的硬件部件正在为之前的指令工作
-
如果指令和数据放在同一个存储器中,则不能同时读存储器
解决方案1:流水线停顿(stall),产生空泡(bubble)
解决方案2:指令和数据放在不同的存储器中
-
如果读寄存器和写寄存器同时发生
- 解决方案:前半个时钟周期写,后半个读,并且设置独立的读写口
-
-
-
数据冒险
-
需要等待之前的指令完成数据的读写
-
一条指令需要使用之前指令的运算结果,但是结果还没有写回
sub $t0, $s1, $s2 add $s3, $t0, $s4 # $t0 是上一条减法指令的结果 and $s5, $s4, $t0 # $t0 是上上条减法指令的结果 instruction 4
- 解决方案1:流水线停顿(stall),产生空泡(bubble)
- 软件解决方案:插入nop指令
- 解决方案2:数据前递(Forwarding)/旁路(Bypass)
-
一条指令需要使用之前指令的访存结果(Load-Use Harzard)
lw $t1, 20($t0) or $t2, $t1, $t5
- 解决方案:流水线停顿 + 数据前递
-
-
-
控制冒险
-
需要根据之前指令的结果决定下一步的行为
- 尚未确定是否发生分生
beq ... instruction 1 instruction 2 instruction 3
- 解决方案1:流水线停顿(stall),产生空泡(bubble)
-
6. 转移指令对流水线的影响
改变指令流向,破坏流水模式
流水线越深,超标量数越多,转移指令带来的影响越大
-
转移指令分类(MIPS):
无条件转移 条件转移 直接转移 j Target
jal Tagetbeq rs, rt, imm16 间接转移 jr rs -
无条件直接转移(J-Type)=> 流水线不停顿
- 目标地址计算方法:New PC = {(PC+4)[31..28], addr, 00}
- 所需信息在取指阶段即可获得(流水线不停顿)
-
无条件间接转移(R-Type)=> 流水线停顿1周期
- 译码阶段才能获得转移目标地址(流水线停顿1周期)
-
条件直接转移(I-Type)=> 流水线停顿1周期
-
if(R[rs] - R[rt] == 0)
then New PC = PC + 4 + SignExt[imm16] * 4;
else New PC = PC + 4
译码阶段才能获得待比较的寄存器内容(流水线停顿1周期)
执行阶段才能完成转移条件的判定(流水线停顿2周期)==优化==> 比较可以不需要ALU,在译码后的busA和busB后额外加一个比较电路,比较的结果再送回PC的更新部件,这样在译码结束就能获得转移条件的判定结果,流水线只需停顿一个周期
-
-
-
延迟转移技术
-
原本:
xor $s1, $s2, $s3 addi $t1, $t3, 1 subi $t2, $t4, 2 beq $t1, $t2, Next slt $s4, $s5, -50 ... Next: ...
beq:停顿一个周期,有浪费,可以在这个浪费的周期内填充一条指令
软件层面规定:beq之后的指令是一定会被执行的,这样就不会出现被浪费的周期,但为了不改变程序原来想达到的结果,在这个例子中,只能将xor拿下来(addi和subi的结果需要用于beq的,必须要在beq前执行)
-
优化:
addi $t1, $t3, 1 subi $t2, $t4, 2 xor $s1, $s2, $s3 beq $t1, $t2, Next slt $s4, $s5, -50 ... Next: ...
- 流水线不发生停顿
-
7. Quiz:
- MIPS的五级流水线结构中,读寄存器堆是在哪个阶段完成的?<u>译码</u>
- MIPS的五级流水线结构中,计算访存的地址是在哪个阶段完成的?<u>执行</u>
- 对于典型的MIPS五级流水线处理器,按照指令执行的正常流程,beq指令的分支条件判定会在哪个阶段完成?<u>执行</u>