CS152 · Homework 3 导读
这份导读帮你理解 HW3 在考什么、需要哪些前置知识。它不包含完整解答——答案需要你自己动手推导。
一句话总结:亲手逐周期推演一台乱序处理器(单发射、支持寄存器重命名)在无限 ROB 和有限(4 项)ROB 两种情况下如何调度一段真实的浮点/整数混合指令序列;再用一个具体的循环+分支例子,追踪 2 位饱和计数器分支预测器的状态演化,计算预测准确率。
给定一段 7 条指令的序列(load、fadd.d、fmul.d、addi、又一条 load 造成 WAW 需要重命名、fadd.d、fmul.d),以及一套完整的时序规则:load 延迟 2 周期、加法器 3 周期、乘法器 6 周期(均全流水化);整数结果发射后 1 周期即可旁路、发射后 2 周期写回;浮点结果写回后还需要额外多停留 1 周期才能被依赖指令使用;ROB 写端口只有一个(写回冲突时,更旧的指令优先,年轻的指令被推迟);单发射(每周期系统中只能有一条指令发射);提交严格按顺序,写回后最早 1 周期提交。
解题的关键提醒:这道题最容易出错的地方,是"自然"的写回周期(延迟直接相加得到)和"实际"的写回周期(还要考虑单一 ROB 写端口的争用)之间的区别——较年轻的指令即使自己的操作数都已就绪,也可能因为更旧的指令同一周期也想写 ROB 而被迫推迟写回,进而连带推迟它自己的提交时间。另外别忘了浮点结果比整数结果多出的那 1 个"停留"周期——这个细节会直接影响后续依赖指令的发射时间。建议先严格按照第 11、12 课讲的"发射→完成→提交"三阶段模型,把每条指令的四个关键时间点(发射、开始执行、写回、提交)分别列成表格,再逐条核对依赖关系。
给定一段遍历数组 array[N] 的循环代码,外层循环分支(bnez 风格)在 5 次里有 4 次被采纳,内层的 if(array[i]!=0) 分支(beqz 风格,判断元素是否为零)行为则取决于具体数组内容。要求你从初始状态开始,逐次追踪一个 2 位饱和计数器 BHT 的状态演化,分别对两条分支各自计算预测准确率。
与第 15 课的直接呼应:这道题就是第 15 课"2 位饱和计数器"和"BHT"内容的直接练习——记住核心规则:"只有连续两次预测错误才会真正翻转预测方向"。解题时,把每次分支的(预测,实际结果,新状态)三元组按顺序列成表格,会比试图心算整个过程更不容易出错。题目后续部分还会问到"如果两条分支共享同一个计数器(发生别名)会怎样",以及"该给哪条分支加静态预测提示"——后者应该回到第 15 课"数据无关的循环分支适合静态提示,数据相关的条件分支不适合"这条论点来组织答案。
问题 1:Problem 1 中,为什么"自然"写回周期(延迟直接相加)和"实际"写回周期可能不同?
问题 2:Problem 5 要求追踪 2 位饱和计数器 BHT 的状态演化,这类计数器最核心的规则是什么?
sp23/hw03.pdf(UC Berkeley CS152, Spring 2023)