408五级流水线强化课笔记
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时钟
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构