几条指令,能不能分工接力?
洗餐具时,可以一个人洗、一个人冲、一个人擦,不用等第一只全部完成才开始下一只。指令流水线也把工作分成几步,让不同指令同时做不同的一步。
跟住同一个编号,它仍要按顺序走过这些工位。节省的是整批工作的等待,并不是让每条指令一下就做完。
后面的步骤要等需要的答案。 如果下一条依赖前一条的结果,可能要传递结果或停一停;如果走错分支,后面已经开始的一些工作也要取消。
逐拍拆开一次计算
- 跟住同一个指令编号,看它走过哪些工位。
- 开关“数据前递”,比较后一条指令等待答案的过程。
- 改变初始数据,再看分支判断:哪些工作继续,哪些被取消?
正确性规定了哪些重叠可以发生
进一步操作与数值核对
- 打开“自己试试”,在第 5 拍停住。I3 在执行级把 4 和 7 相加,结果为 11;r3 尚未写回,仍是 0。两条前递记录标出了值的来处。
- 关闭“启用数据前递”,重新推进到第 5、6 拍。I3 留在译码级,直到需要的值完成写回。编号不会丢失,前面的老指令也没有跟着全部停下。
- 开启前递,观察第 7 拍。I4 正在访存,I5 还在译码,执行级出现气泡。第 8 拍,加载结果进入 I5 的执行输入。
- 保持初始内存
M[0] = 11,观察第 9 拍:I6 判断r4 == r3成立,I7 和 I8 被清除。错误路径中的 I7 本来要写M[4],这次写入不会发生。 - 把
M[0]改为 5,再运行到完成。分支不成立,十条指令全部完成,M[4]变为 16。最终检查仍使用同样输入的逐条参考。
修改输入或前递开关会回到第零拍。进度条、上一拍和下一拍都读取同一条确定性执行轨迹,可以来回观察。屏幕上的工位表示本拍正在做的事,寄存器与内存数值表示本拍结束后的状态。时序纸里的 Ⅱ 表示保持,× 表示清除,圆点表示没有指令。
想核对技术细节?
洗餐具时,一个人洗、一个人冲、一个人擦,不用等第一只盘子全部做完才开始第二只。指令流水线也把工作分成几步,让不同指令同时做不同的一步。但后一条指令要用前一条的答案时,就必须等答案真的准备好。
跟住带编号的指令。它依次经过取指 IF、译码 ID、执行 EX、访存 MEM 和写回 WB。取指获得指令,译码确定操作与寄存器输入,执行级完成加减或计算地址,访存级读写数据,写回级更新目的寄存器。加法也经过访存这个位置,只是不访问数据内存。
画面是一台教学用五级、单发射、顺序流水线,每一级占一拍。同一份程序也会交给逐条参考执行:上一条完成五级,下一条才开始。两边使用相同的指令、初始寄存器和内存,比较没有换题。
重叠让不同指令同时占据不同工位,缩短完成指令之间的间隔。第一条没有遭遇停顿的指令,在两边都经过五拍。吞吐量提高,不等于一条指令的延迟缩成一拍。 本例的比较使用相同、理想化的级时长,不能直接换成真实 CPU 的频率或加速倍数。
数据前递为什么有时有效,有时还得等?
算术结果在执行级结束时已经形成,随后保存在流水线锁存器中。消费者的执行级可以选择最新匹配的锁存值,不必等到它写回寄存器。这里优先选择 EX/MEM 中较新的结果,其次选择 MEM/WB 中的值;固定为零的 r0 不参与前递。
加载不同:执行级只计算地址,真正的数据到访存级结束才可用。若下一条指令立刻使用它,必须保持取指和译码一拍,在执行级插入一个空位。这个模型也对加载后紧邻使用该值的存储和分支做相同的处理。读操作数发生在译码;同拍的写回先于译码读取。
Brown 的流水线课程具体展示了锁存器前递、最新值优先与加载依赖停顿。
清除和停顿有什么区别?
停顿保存正在等待的指令,未来还要继续完成它。清除取消错误路径上的指令,使它们永远不能产生寄存器或内存副作用。本例假定分支不跳转,先顺序取指;执行级发现分支成立后,取消当前取指和译码中的两条年轻指令,下一拍从目标重新取指。没有分支延迟槽。
分支判断放在哪一级,是模型选择。这里采用 Harris 与 Harris 的五级模型中执行级判断、两条年轻指令清除的结构。Brown 的课程在更晚一级判断分支,不能直接套用它的三条清除数量。
为什么恰好是 15 拍?模型没有模拟什么?
默认输入执行八条有效指令。理想五级流水线的填充与排空合计增加四拍,再加一次加载依赖停顿和分支产生的两个空位:
逐条参考则是 8 × 5 = 40 拍。流水线结束时 r3 = 11、r4 = 11、r5 = 22、r7 = 23,M[4] = 0、M[8] = 22。程序按独立解释器核对全部八个寄存器、内存和有效指令顺序;不是只比一个总和。
指令语义取自 RISC-V RV32I 规范中的小型子集:ADDI、ADD、SUB、LW、SW、BEQ。这里仅有八个 32 位寄存器,用 r0–r7 命名;程序预先解码,分支目标用指令索引表示,内存只存放按四字节对齐的整字。加减结果保留低 32 位,显示为有符号整数。它不是完整 RISC-V 模拟器。
指令与数据存储独立,访存固定一拍;没有缓存缺失、异常、乱序、多发射、复杂分支预测或真实门延迟。未写过的合法内存位置读作零。不对这些教学时钟周期标注 GHz 或纳秒。