时间:10 分钟
规则:闭卷,不看笔记,不用 AI。
目的:检查你是否真的理解了 Week 1–2 的核心数字,而不是只会跑测试。
先完成L1/L2的核心访存、L3第8节和Lab0/1再闭卷作答。Q1对照L2地址分桶;Q2对照L1两条时间下界;Q3对照L3读写账本;Q4对照L1尾部;Q5对照起步2/预备2的副本。每题分值仍为2分,合计10分;下面的复习变式不新增评分。
Q1(2 分)
一个 warp 的 32 个 thread 读取 32 个连续的 int32,起始地址是 word 16(不是 0)。 本题采用 Lab0 的简化模型:以 128 字节(32 个 word)的 line 为一次统计单位。触及几条 line?如果改用 32B sector 统计,又触及几个?这里不把 line 计数称为真实 GPU 的 transaction 数。
Q2(2 分)
vector_add 处理 n = 1,000,000 个 float32:
- 搬多少字节?
- 做多少 FLOPs?
- 如果带宽 500GB/s、算力 10TFLOP/s,在给定模型中哪条限制主导?时间下界是多少?不能将它直接称为实测时间。
Q3(2 分)
一个 4096 维 float32 的 softmax:
- 3-pass 搬多少字节?
- 2-pass 搬多少字节?
- 采用 Lab1 的 activation-only 口径,分别为
16n与12n字节;在 2TB/s 带宽下,两者的带宽时间下界差多少?这能直接当实测提速吗?
Q4(2 分)
n=10, block=4,需要几个 block?最后一个 block 的 tid=0..3 分别处理哪些 i,哪些应该跳过?
Q5(2 分)
函数应该返回一个新列表,不改变输入:
def scale(values):
result = values
for i in range(len(result)):
result[i] = result[i] * 2
return result
输入 a=[2,3],调用后 a 是什么?指出契约被破坏的原因,并说明如何修复。先手算,不运行。
答案(做完再看)
A1
2 条 line。word 地址 16..47 跨 line 0(0..31)和 line 1(32..63)。对应 byte 64..191,共 4 个 32B sector。两种数字统计的单位不同。
A2
- Bytes =
3 * n * 4 = 12,000,000字节 ≈ 12MB。 - FLOPs =
n = 1,000,000(一次加法)。 - memory time =
12e6 / 500e9 = 24e-6 s = 24us。 - compute time =
1e6 / 10e12 = 0.1e-6 s = 0.1us。 - 在此理想模型下 memory-bound,时间下界 24us;忽略 launch、缓存和同步等成本。
A3
- 3-pass =
16 * 4096 = 65,536字节 = 64 KiB。 - 2-pass =
12 * 4096 = 49,152字节 = 48 KiB。 - 差 16,384 字节;在 2TB/s 下
16384 / 2e12 = 8.192e-9 s = 8.192ns。 - 这是所选流量模型的带宽时间下界差;小向量还受启动开销、缓存等影响,不能作为实测提速。
A4
需要 3 个 block。最后一个 bid=2,i 为 8、9、10、11;只处理 8、9,跳过 10、11。guard 是 i<n。
A5
调用后 a 是 [4,6],因为 result 与 values 指向同一个列表。可先建新列表,再逐项追加翻倍后的元素;或先复制这个一维数值列表,再改副本。
评分
- 8–10 分:Week1–2 核心已掌握,可以继续下一阶段。
- 5–7 分:回看 Lecture 2/3 的对应小节,再做一遍 Lab。
- 0–4 分:不要赶进度;先把 Lab 0/1 的 checkoff 问题讲一遍。
隔日迁移检查(不计分)
错题复习后,不照抄相同数字:Q1把起始word改为1;Q2只将字节减半;Q3把n改为1024;Q4改n=9;Q5改为二维列表只复制外层。先写改变了哪个假设,再重新推导。能解释新例子,才说明复习不只是在记答案。
变式锚点
word1–32为2 lines、5 sectors。Q2只改字节模型后memory下界12µs,compute仍0.1µs;这不是保持相同算法不变时可以随意承诺的流量减半。n=1024时三遍16384B、两遍12288B。n=9的最后组只有tid0有效。二维列表切片只复制外层,内部行仍共享。