方案01 · 服务器验证
把中间结果留在计算组内,减少接力搬运
一段计算中,哪些中间结果可以留在原地,哪些小运算可以交给矩阵硬件批量完成?
从这里开始读:这份方案为同一个模型计算选择硬件和执行程序。P1处理整段输入及紧接的首个新位置;D1使用已有历史,连续生成8步。权重是各步复用的模型参数;工作组是承担一部分计算的任务,寄存器(RF)是它直接使用的小存储。下列周期与功率均来自教学模拟器。
先看这套硬件提供了什么
配置 16 个计算单元(SM);每单元 1 个 8×16 矩阵阵列,沿求和方向并行 2 项。不另配共享暂存和缓存,计算仍可使用寄存器小存储。每单元 2 个搬运引擎(DMA);全局片内网络每周期可传 512 字节,外部内存有 8 个通道。这些是模拟器中的配置,作用要结合程序的数据放置与执行顺序判断。
把统计也当成可以批量处理的计算
模型在矩阵投影前要对输入做归一化:先求均值和方差,再调整各元素的尺度。方案01把一批输入排成矩阵,与全1向量相乘来求和;平方后的输入也可用同样方式求平方和。这里的矩阵阵列既做通常的乘法,也承担统计。好处是把许多零碎操作合在一起,代价是统计与主计算会共享矩阵和寄存器资源。
整段输入程序常见的分块是16行×32列、每轮累加32项,以及16行×16列、每轮累加64项。“分块”描述一次软件指令处理的数据,不是芯片上阵列的物理尺寸。整段程序包含80次工作组创建,不能把它读成80组同时驻留。
前馈中间结果为什么不用完整写到外存
前馈网络可以理解成三步:W1矩阵把向量变宽,GELU激活函数逐元素变换,W2矩阵再把它压回原宽度。生成程序把中间的512个通道分给16个任务,每个任务持有32个通道对应的W1列和W2行。它算完这32个值、做完激活,立即在寄存器小存储里接着乘W2。
每个任务得到的是128维输出的一份部分和,16份相加才是完整结果。这省掉了把完整中间向量写出再读回的路径,但仍有部分和传输与汇总。因而“融合”在这里有具体含义,不能理解成所有通信都消失。
注意力还需要另一种分工
注意力用当前输入的查询向量Q,与历史位置的键K比较,再按比较结果汇总值V。该方案把每一路历史注意力分成四片,各片计算局部统计和加权结果,最后重新缩放并合并。两层权重与原始历史仅首步加载,后续步骤继续复用;每一步的新输入仍需读取。
程序还存在按事件控制加载时刻的安排,说明“何时搬数据”也是成品结构的一部分。没有附带搜索记录,不能补写作者怎样选择事件间隔或怎样逐次获得这些改进。
过程证据:本次没有可用于还原搜索顺序的记录。上文讲的是最终程序及其机制;没有把这种事后分析当成作者当时的思考过程。
这份方案值得带走什么
可迁移的观察角度是重新划定数据交接边界:中间结果的生产者能否直接完成下一步?同时检查新增的部分和汇总成本。静态结构说明这种机会存在,独立收益仍需对照实验。
证据能说到哪里:结构沿用旧快照的同一份程序,可核对汇编;本次提交没有搜索过程,不能补写作者怎样想到它。
核对硬件、指令与来源指纹
旧版最终构造分析:final-solutions.html 中方案一;与本快照对应同一份程序。
最终汇编中归一化统计、四片注意力与32通道前馈部分和路径。
面积 23.282 mm²;P1 / D1 峰值 19.218 / 19.289 W。
{"version": "challenge-hardware-v0.4", "sm_count": 16, "tc_count": 1, "vector_lanes": 16, "sfu_lanes": 16, "reduction_units": 0, "rf_ports": "8R4W", "shared_kib": 0, "dma_depth": 2, "dma_engines": 2, "sm_noc_bytes_per_cycle": 64, "multicast": true, "noc_bytes_per_cycle": 512, "hbm_channels": 8, "cache_mib": 0, "tc_array": "8x16", "tc_k_parallel": 2}
D1逐步权重读取字节数:[1572864, 0, 0, 0, 0, 0, 0, 0]。历史读取:[262144, 0, 0, 0, 0, 0, 0, 0]。
源文件中涉及共享暂存SH的LD/ST行数:P1 0,D1 0;这是源码行统计,不等于循环展开后的传输次数。
M1_P1 · SHA256
b3a9c6a5b865c90240ad70add4cf443f413ae67d30d3d04f324bfc172106d69a
矩阵指令 22,848 条;加载指令 13,858 条;工作组生命周期 80 个。
{
"line": 91,
"args": {
"a": {
"space": "RF",
"offset": 640,
"count": 32,
"wg": "w0",
"lane": 15
},
"b": {
"space": "RF",
"offset": 0,
"count": 1024,
"wg": "w0",
"lane": 10,
"shape": [
32,
32
],
"strides": [
1,
32
]
},
"acc": {
"space": "RF",
"offset": 0,
"count": 32,
"wg": "w0",
"lane": 15
},
"m": 1,
"n": 32,
"k": 32,
"event": "w0m75_0"
}
}M2_D1 · SHA256
64290db4628b0f2024cef4db9d25f55810306d4f8b45562a92bfbee8297a33d2
矩阵指令 6,656 条;加载指令 2,840 条;工作组生命周期 62 个。
{
"line": 752,
"args": {
"a": {
"space": "RF",
"offset": 944,
"count": 16,
"wg": "f0_0",
"lane": 15
},
"b": {
"space": "RF",
"offset": 928,
"count": 32,
"wg": "f0_0",
"lane": 15,
"shape": [
16,
2
],
"strides": [
1,
16
]
},
"acc": {
"space": "RF",
"offset": 176,
"count": 2,
"wg": "f0_0",
"lane": 14
},
"m": 1,
"n": 2,
"k": 16,
"event": "f0_0m690"
}
}报告SHA256 071af5ed4dfe2c176fd202b45006f16ae8e90e619b1c15ea7175d825c8a1196a
提交ID TRF-6A0A6DAACD214831