CS152 · Homework 4 导读
这份导读帮你理解 HW4 在考什么、需要哪些前置知识。它不包含完整解答——答案需要你自己动手推导。
资料来源说明:本地的 hw04-sols.pdf 文件页眉标注的是"2022 年春季"(Assigned 3/12/2022, Due 3/31/2022),而不是 2023 年春季——但经过逐题比对,2022 年版本的全部 5 道题(Trace Scheduling、VLIW SAXPY、向量机、两道多线程题)与 2023 年版本的 hw04.pdf 在代码、图表、表格上完全一致,说明课程组直接沿用了上一年的题目,只是忘记更新解答文件的页眉元数据。此外,hw04.pdf 本身(通常应该是空白的问题集文件)里 Problem 3(向量机流水线图)的表格其实已经被预先填好了答案——这是原始课程材料本身的文档拼装方式,不是本站引入的错误。
一句话总结:用同一段 SAXPY 循环,横向比较四种 VLIW 调度策略(无优化、展开、软件流水线、展开+流水线)的吞吐率提升;分析向量链接如何随通道数增加而压缩流水线周期数;用不同的线程调度策略,计算隐藏特定访存/计算延迟各自需要多少个硬件线程。
针对同一段 ld→fmul→fadd→sd 依赖链循环,依次分析:(A)不做任何优化的调度;(B)展开一次;(C)只做软件流水线(不展开);(D)展开+流水线同时使用。每种情况都要求你算出循环体的周期数、每周期的 FLOPS 吞吐率、相对(A)的加速比。
与第 14 课的直接呼应:这正是第 14 课"循环展开 0.36 → 软件流水线 1.0 FLOPS/周期"那个例子的变体,只是这里换成了 SAXPY(y=ax+y)而不是简单加法,且延迟参数也不同。解题的关键仍然是:先画出依赖链上每一步的启动/结束周期,再数清楚循环体真正需要多少周期,不要凭直觉估算。
给定一台 8 通道向量机,先分析无链接情况下一次迭代需要多少周期(连续向量指令发射之间的间隔逐条累加);再分析有链接
与第 17 课的直接呼应:这是"向量链接消除依赖链上的等待"这一机制的定量练习。注意一个容易被忽略的约束:即使有链接,同一条依赖链上连续的向量 ALU 操作之间,仍然存在一个由单个 ALU 吞吐率决定的最小间隔周期数(链接只能让消费者提前开始,不能让同一个功能单元瞬间处理两个操作)——这个约束会限制通道数增加带来的收益上限。
给定不同的访存/浮点运算延迟场景,分别用固定轮转调度和数据相关调度两种策略,计算需要多少个硬件线程才能完全隐藏给定的延迟。
解题时请格外留意"循环携带依赖"和"访存延迟"的区别:如果循环体内存在跨迭代的累加依赖(例如某个浮点累加器 f3 = f3 + f2),真正限制线程数下限的可能是这条循环自身的依赖链长度,而不是单次访存的延迟数字——即使访存延迟很短,如果循环携带依赖本身需要好几个周期才能完成一轮,那才是真正的瓶颈。在计算"数据相关调度"需要多少线程时,务必先确认你分析的是哪一条依赖链在起决定作用,而不是想当然地套用访存延迟的公式——这是本题最容易出错、也最值得反复检查的一步。
问题 1:Problem 3 中,为什么即使有向量链接,通道数增加带来的收益仍然有上限?
问题 2:Problem 4-5 中,如果循环体存在跨迭代的浮点累加依赖,计算所需硬件线程数时最容易出错的地方是什么?
sp23/hw04.pdf(UC Berkeley CS152, Spring 2023)