408强化课录播五级流水线相关内容笔记
- 指令流水线基本概念:简单的概念题
- 指令流水线基本实现:指令按序发射,按序完成
- 各种冒险:结合MIPS指令序列分析并处理冒险
- 超标量和动态流水线:简单的概念题
五级流水线
五级流水线的设计是为了通过并行提高处理器的吞吐量。
图片来自CSAPP。
一个指令通常被划分为五个阶段:
- 取指(IF)
- 译码(ID)
- 执行(EX)
- 访存(MEM)(如果需要的话)
- 写回(WB)(如果需要的话)
总体的图如下
结构冒险(考的少)
一个被请求的资源仍处于忙碌状态。
多个阶段可能请求同一份资源,例如IF和MEM需要同一块Cache,就会发生结构冒险。
解决方法有:
- 阻塞指令
- 把指令Cache和数据Cache分离
数据冒险
需要等待上一个指令完成数据读写。
如上图所示,因为指令I1对寄存器R1的写操作发生在WB写回阶段,因此指令I2在ID译码阶段需要读寄存器时,R1的值还没有被写回,这就是数据冒险。
核心特点:两条指令,先写后读同一个寄存器。如果某条指令写了一个寄存器,则要观察后面三条指令是否读了这个寄存器。(个人感觉可能画图更直观)
解决方案:
- 硬件阻塞:将读寄存器的指令ID段阻塞若干时钟,直到写寄存器的指令完成WB。
- 转发(旁路)技术:将写寄存器的数据直接转发给读寄存器的指令。但转发旁路不能解决Load指令写寄存器引发的Load-Use数据冒险。
Load-Use数据冒险
Load指令把数据从内存读到寄存器,后面的指令需要用到这个寄存器的值。这种情况下,即使使用转发技术也无法解决数据冒险。
控制冒险
一些控制取决于上一条指令的结果。
转移类指令会更改PC,因此下一条指令不是I2而是其他,会产生控制冒险。
解决方案:
- 硬件阻塞:将转移类指令后一条指令IF段阻塞3时钟