BREAK LAYER 研究阅读室

五套最终程序:怎样构造,解决什么问题

按问题跳读 · 每节自带背景 · 9节1. 先把比较对象对齐2. 硬件构造:共同底座与真正的差异3. 共同软件骨架:把八次读取变成一次驻留4. 方案一:把小计算合成大批次,让FFN中间结果就地使用5. 方案二:把RF空隙用起来,把不随输入变化的计算提前做6. 方案三:让数据块贴合存储分区,让已经就绪的Q先干活7. 方案四:一次做更大的矩阵块,但保留分阶段的数据交接8. 方案五:增加任务位置,将一份历史注意力分给六个人算9. 人类应该怎样比较这些成品

如果还不熟悉SM、WG、RF、tile,请先读首页的任务与机器说明。下面固定按“要解决的问题 → 具体怎么做 → 付出的代价 → 结果”理解每套程序。

这五份解共同利用了 RF 驻留、矩阵分块、组播与数学重排。最值得学的差别,是谁持有数据、什么时候释放结果、哪些计算能提前做、哪些中间值可以留在 RF。这页解释成品的机制;实际搜索时如何发现这些机制,请接着读两条有记录的更新路径。

本页只分析榜单快照对应的五份已提交成品。这里的“最终”指各提交 ZIP 内实际送评的 hardware.json 和两份汇编,不代表课程截止日的最终版本,也不混入包内旧候选。全部分数来自服务器已保存的官方报告;本次没有重新求解或重新评分。性能属于冻结教学模拟器。

1. 先把比较对象对齐

本次是 v0.7:P1 为 M1(三层、宽256、FFN1024),两个 batch、每个64个 prompt token,另含首个新位置;D1 为 M2(两层、宽128、FFN512),128-token 历史后顺序生成8步。原项目 README 中较早的 v0.6 两个 M1 场景不能套用。

数值用于核对实验身份,阅读时可以先跳过。完整结果见报告数据;自己的过程见八步更新路径。

展开评分口径与六套程序的结果

合格分数为 1000 × sqrt(30,996,995 × 1,302,032 / (P1_cycles × D1_cycles)),要求面积 ≤24 mm²、1000周期滑动窗口功率 ≤20 W 等门槛全部通过。面积在此为门槛,公式没有再乘面积惩罚。

方案编号 官方分数 P1 周期 D1 周期 面积 mm² P1 / D1 峰值 W
1 方案一 86,665.62 210,399 25,539 23.281765 19.218 / 19.289
2 方案二 73,915.77 282,431 26,155 23.998565 19.440 / 19.591
3 方案三 72,237.05 254,686 30,368 23.998565 19.694 / 18.888
4 方案四 57,655.77 361,868 33,551 23.902565 19.593 / 18.224
5 方案五 52,508.66 352,305 41,549 23.644648 16.958 / 19.357
Astra 对照,非前五 50,416.65 337,476 47,049 22.494565 19.971 / 19.866

2. 硬件构造:共同底座与真正的差异

所有人都用每 SM 一个 8×16 TC、8R4W RF、SH0、Cache0;全芯片均为 NoC512 B/cycle、HBM8、multicast=true。这里的“无缓存”仍保留每个驻留 WG 的64 KiB RF;程序自己组织复用。

方案 SM TC K并行 向量 / SFU lanes 专用归约 DMA引擎 × 深度 SM链路 B/cycle 最多RF槽容量*
1 16 2 16 / 16 0 2 × 2 64 4 MiB
2 16 2 16 / 14 0 4 × 1 128 4 MiB
3 16 2 32 / 18 0 2 × 2 128 4 MiB
4 16 2 8 / 8 1 4 × 1 128 4 MiB
5 24 1 16 / 8 0 1 × 2 64 6 MiB

* 按每SM最多4个WG、每WG64 KiB计算的物理槽总量,不代表程序都用满。P1方案一有80个不同WG生命周期,分阶段创建/结束,不能解释成同时驻留80个。

方案五用24个较弱SM换取更多RF槽和任务位置;前四名的TC名义乘积为 16×8×16×2=4096,方案五为 24×8×16×1=3072。这仅是菜单参数乘积,不等同有效吞吐。方案一SM链路仅64,却比采用128的第二、三名更快;方案四配有专用归约,仍落后。硬件单项规格不能解释最终结果。

四份无专用归约的解仍含 REDUCE 指令,它们走可用实现路径;方案一还显式把一些求和改写成 MMA。硬件与软件共同变化,以上比较不能当作某个硬件字段的消融实验。

3. 共同软件骨架:把八次读取变成一次驻留

按官方 ABI 对汇编中的 HBM 读取地址分类,五份 D1 都在第一次 STEP.COMMIT 之前读取 1,572,864 B 的四类矩阵权重、262,144 B 的历史 K/V;后面七步这两类读取均为0。这是静态展开后的逻辑操作数字节统计。官方报告还包含事务粒度、组播和其余数据流,因此不能拿它直接代替物理HBM流量。

这意味着每一步主要交换输入、当前K/V和部分结果,核心权重留在各WG的RF。所有五份 D1 的 WG.END 都在最终提交步骤后出现,驻留生命周期跨越整个decode。

另一个共同机制是 LayerNorm 与线性投影重排。对 LN(x)W+b,可以预先计算 γW 和 βW+b,运行时组织为:

[(x⊙γ)W − μ(γW)] × invstd + βW + b。

均值/方差与主投影可部分重叠。方案二还在预载后把 γ 乘入RF中的权重;方案三把首token与两个常量向量合为 M=3 的矩阵乘。方案五也缓存常量投影。实数恒等式改变了FP32运算次序;这里以提交报告的功能通过为证据,不声称全输入形式等价。每份汇编的编号摘录。

4. 方案一:把小计算合成大批次,让FFN中间结果就地使用

先理解它解决什么问题。 矩阵乘开始前,LayerNorm要先求每行的均值和方差;如果逐行求和,便会产生许多小指令。这个方案把一批数据排成矩阵,再与全1向量相乘,一次得到多行的和。全1在这里相当于“把这些数加起来”,因此矩阵硬件也能干统计工作。随后才能完成归一化并做投影。

D1的重点是让同一任务连续做完一段FFN。 一个任务保留32个隐通道,做完W1和GELU就接着乘W2,输出128维部分和;16个任务的部分和相加才得到完整结果。减少中间结果往返HBM,是收益来源;16份部分和的汇总是额外代价。下面给出这套安排在最终程序中的具体位置。

P1:16个主要WG处理prompt;按列分布数据、用TC批量做统计归约。 汇编第89–94行先计算平方,再用全1向量做MMA,得到分块和及平方和;第343–349行合并统计并做rsqrt。主矩阵形状以 16×32×32、16×16×64 为主。这样的安排把许多小向量归约变成可批量发射的矩阵任务。不能仅由MMA数量推出其加速比例。

D1:Q/K/V投影与四片历史注意力协作。 每层有12个 a WG,配合4个 p WG构成每head的四份32位置历史;a组也承担Q/K/V投影。局部最大值、指数和、加权V向量被稳定合并。第3134–3157行显示本地QK、当前token处理、四份摘要合并,再输出context。

FFN按32个隐通道形成生产者。 每层16个 f WG分别持有W1的32列和W2对应的32行。第3558–3566行得到归一化投影和GELU;第3912行起,W2直接读取该RF结果,不经过完整hidden张量的HBM中转。随后写出128维输出的部分和,由消费者加载并用MMA合并;融合仍有部分和通信成本。

发射节奏是程序的一部分。 pace0/pace1 发出事件,加载指令显式WAIT这些事件。只能确认静态节流机制存在,缺少其搜索历史,无法声称作者具体尝试过哪些桶宽/间隔。

这是五份中两项周期都最短的结果。P1报告的SM平均RF读端口利用率约73.2%,TC约41.2%;它很好地利用了RF路径,不能将“TC未100%”解释成加TC就会更快。

5. 方案二:把RF空隙用起来,把不随输入变化的计算提前做

它面临的限制是每个工作组只有64 KiB。 如果所有权重都强制用相同的大块存放,分区里会留下用不上的空隙。因此某个128项的矩阵内积被分成16、56、56项,而没有机械地分成两个64项。三段仍覆盖同一个完整内积,目的在于匹配实际剩余空间。

另一个机会来自重复的归一化参数。 每个decode步骤的输入不同,γ、β和权重W却不变。将γ乘入权重、把β与W的乘积预先算好,就能在后7步复用。运行时只计算与新输入有关的部分,再用该输入的均值和方差修正结果。它增加了启动准备,换取后续步骤更少的重复工作。

P1按batch×列组织。 p{b}{j} 把两个batch分别放在两组8个SM上,每个SM另有3个x组;共64个常驻WG。汇编使用FOR压缩源码,展开后的指令数为130,681,明显多于方案一的68,304;源文件小不代表执行工作少。矩阵主形状为 32×16×32 和 64×16×16。

D1每层16个投影组与16个注意力组。 预载阶段用 2×24×32 同时计算γ/β常量投影,再把γ乘入权重;运行时主GEMV与均值/方差交错。WQKV每组24列,W1每组32列;Wo中出现K=16/56/56的非均匀块,把RF分区剩余空间也利用起来。

D1的W1→GELU→W2局部融合。 GELU结果供持有对应W2行的同组继续计算,再归并部分和。它达到26,155周期,仅比方案一慢2.41%,明显优于方案三的30,368。其P1读HBM为33.855 MB,方案一25.335 MB;P1更慢与流量、指令更多同时出现,但尚无控制其他变量的因果实验。

可学习的视角是:RF分配可以精细到分区空隙,tile也不必每一段都相同。代价是布局更复杂,需要沿实际地址和依赖核查,不能仅看“16列tile”配置标签。

6. 方案三:让数据块贴合存储分区,让已经就绪的Q先干活

总容量放得下,不等于一条指令能直接读取。 64 KiB RF被切成多个分区,指令操作数还要符合分区边界。这个方案增加向量通道后,每区变小,于是同时重排数据、拆细矩阵指令。否则原来的一块数据可能跨区,导致额外拆分和搬运。

注意力还有一个容易被粗粒度调度隐藏的机会。 Q是当前新位置的查询向量,K是用来匹配查询的键,V是按匹配权重汇总的值。算“Q对已有128个位置的注意力”只需要Q和已有历史K/V;无需先等当前新位置的K/V全部产生。这个方案先完成Q,让历史部分先算,当前位置的贡献稍后再合并。它改变了等待边界,而没有跳过当前位置。

最终ZIP与 c80-bulk-gelu-bias 的两程序哈希匹配。包中README、release文档仍引用更早候选,本分析以根目录汇编及官方报告为准。

P1:二维行网格与K连续布局。 两个行块复用权重,32-lane硬件把每个RF分区缩为512个FP32,所以最终常见指令是 16×16×32,不能将配置里的名义 32×16×64 当成实际MMA。配套实现对RF边界重新分块;K/V按物理边界保留,bias、GELU、残差尾处理与矩阵输出配合。

D1:32个投影WG + 16个注意力WG + 控制WG。 权重按输出面板放置,W2沿K分两片;每head四片注意力。Q的owner优先完成,使历史注意力提前启动,当前K/V单独处理并在最后合并。直接K输出、复用V生产者RF,减少中间往返。

统计与投影并行,首token顺便计算常量。 8组统计采用局部中心化平方和,再合并方差;首token的投影与γ/β常量投影组成M=3,后七步复用常量。最后的GELU提取公因子、整块bias加载也进入最终版本。

最终分配文件保留COPT目标2143、界2143、gap0,但 query_early=true 已限制owner,W2也有固定归属约束。这是限定面板模型的目标闭合,绝不代表72,237分已经全局最优。完整过程在方法复盘单独展开。

7. 方案四:一次做更大的矩阵块,但保留分阶段的数据交接

大指令的好处是同样的工作可少发几次命令。 这个方案常用32行、32列、64项求和的大块。代价是单块占用更多RF,下一阶段往往要等这一块完成。它还使用较明确的阶段屏障:参与的任务完成前,后续阶段不能越过。

它的FFN交接方式便于理解。 W1结果在RF里完成bias和GELU,然后写到HBM临时区;W2任务再读取。即使D1总体读HBM很少,这条等待链仍可能拖慢完成时间。最终报告确实显示它读量最少,但速度落后前三套,所以比较时还要看数据何时到达消费者。

P1:1个控制组、16个辅助组、32个GEMM组。 主要矩阵形状是 32×32×64 与 32×16×64,展开MMA数只有9,900;大指令降低条数,但报告周期为361,868,说明条数少并不足以判断快慢。辅助组完成统计与注意力,整体有231个BARRIER。

D1:32个按层驻留的权重WG、32个四片历史注意力WG。 每层16个权重组。QKV每组24列、W1每组32列,分别用K64块做投影;归一化常量提前计算。W1后在RF内做bias/GELU,再写hidden片段到scratch,由后续W2消费;不能将它描述成方案一那种完整FFN局部流水融合。

官方D1的HBM读量约1.999 MB,是五份中最少,周期仍高于前三名。搬运量降低后仍需看依赖、端口与计算安排。这份结果特别适合用来纠正“指令少、流量少就必然最快”的直觉。汇编第1592–1617行。

8. 方案五:增加任务位置,将一份历史注意力分给六个人算

它用24个较轻的SM,替代前四套的16个较强SM。 更多SM带来更多工作组位置和RF容量,但每个SM的矩阵K并行度更低,DMA引擎也更少。程序必须从更细的分工中赚回这些损失。

以一个head的128个历史位置为例。 head是独立的一路注意力计算;本题D1有4路。方案五将每路历史分成22、22、21、21、21、21个位置,交给六个任务。每个任务得到本片最大分数、指数和和加权V;最后根据各片最大值重新缩放,再求总和。不能直接平均六个局部输出,因为每片归一化的分母不同。分片增加并行,也增加六份摘要的汇总成本。

P1:24个WG,一SM一个。 源码声明lock-step multicast GEMM,主指令为 32×32×16,通过相近发射的共同读取与组播减少重复外存事务。它的P1为352,305周期,比方案四快2.64%,峰值功率仅16.958 W。

D1:每层24个持久WG。 每组混合持有投影与历史K/V。每head的128个历史位置分成6份,实际长度为22、22、21、21、21、21;汇编同时出现 1×22×32 与 1×21×32 的QK,以及反向形状的PV。六份局部softmax摘要稳定合并。

W2也沿K拆分。 示例WG持有176行,按64+64+48计算部分和;另外两份共同覆盖完整512维,最后归并。这使更多SM能参与短输出向量计算,也增加中间结果交换。

这份解的SM更多、单SM计算和DMA资源更小。它证明较轻单元也能过五万分;D1仍是五份中最慢,不能据此推广“越多SM越好”。P1功率余量也不能自动转成D1收益,因为两场景共用硬件且瓶颈不同。

9. 人类应该怎样比较这些成品

先按三个问题读程序:静态数据放哪里?关键结果由谁最先产生?中间结果在什么边界落地? 再比较资源规格与服务时间。

观察到的差别 有证据的结论 下一步需要怎样的对照
全部D1权重和历史跨步驻留 持久RF数据所有权是共同骨架 同硬件关闭驻留,量化净收益
第一、二名D1融合FFN,方案四hidden落HBM 同一种数学计算具有不同通信边界 同布局比较融合、部分和归并、独立W2
方案一用TC批量统计 指令映射能跨越通常的单元分工 固定硬件,比较REDUCE与MMA统计
第二、三名P1/D1优劣互换 分数需要联合考虑两场景 用周期乘积筛选,分别保留场景退化
方案三先放行Q、延迟常量计算 依赖与一次性准备工作都可重排 测关键路径与首步/稳态分别耗时
方案四D1读量最少仍不最快 单一流量指标不足以评价数据流 查看端口等待和部分结果的到达时间

这些是下一次研究可执行的假设,本次没有替参赛者补做未发生的消融。也不能从最终汇编反推某个agent必然“先想到了”某个主意。