计算机组成与设计 硬件软件接口 第五版 流水线部分笔记
TODO1:为什么果壳不在 IDU 阶段读出寄存器?而要在后端?是跟超标量、乱序有关系吗?
TODO2: 修改PC难道比修改其它寄存器更快吗?
TODO3: 长流水线有什么缺点?
TODO4: 需要两个存储器吗?优缺点?
TODO5: 气泡指令是什么?为什么可以起到阻塞的作用?比起直接阻塞有什么优缺点?(4.8 会说明阻塞)
TODO6: 怎么阻塞?(比如在遇到分支指令后插入一个气泡)(4.8 会说明阻塞)
TODO7: 怎么flush ?
TODO8:4.8 会给出分支预测的细节,包括动态分支预测
TODO9: 什么是数据相关性(RAW等等)
很重要的一点:并不是所有指令都需要访问内存
----------------------------- 笔记开始 ----------------------------------
4.5 中的关键部分
冒险:流水线有这样一种情况,在下一个时钟周期中下一条指令不能执行。这种情况称为冒险(hazard)
1. 结构冒险:因缺乏硬件支持而导致的冒险。比如指令和数据在同一个存储器里,无法同时取指和读数据。(可以用 I-cache 来解决)
2. 数据冒险:也称为流水线数据冒险(pipeline data hazard),因无法提供指令执行所需的数据而导致的冒险
对于数据冒险来说,可以使用 前递(forwarding) 和 旁路(bypassing) 来解决
但即便使用了前递和旁路,在 取数-使用 型数据冒险(load-use data hazard) 中,依然得阻塞一个阶段 (4.7 会讲讲怎么处理这种复杂阶段)
3. 控制冒险(control hazard/ branch hazard): 由于jmp和branch指令的存在,指令地址的变化有时并不是流水线所预期的,如果取到了错误的指令,就会导致冒险
有两种办法可以处理控制冒险
1. 阻塞。遇到分支跳转指令时,立刻阻塞流水线,知道分支跳转指令的结果出来。
2. 加入更多硬件,在IDU阶段计算并更新 PC 的值(详见4.8)。不过即便如此,在遇到分支跳转指令判定失败的时候依然会阻塞一个时钟周期(但是判定成功的时候就不会阻塞了)
4.5 看完了,用来处理三种冒险的主要方法有:旁路、阻塞、分支预测