逐步播放
按 GemmWS 的 Tile → 指令顺序高亮8 个外层 Tile(点击跳到该 Tile 的第一条指令)
全局 N / C / M 范围
紫色背景表示当前 Tile;亮色表示当前指令的对应切片Activation A N28 × C64
Weight W M32 × C64
Output Y N28 × M32
当前 Tile 的局部映射
高亮的微块同时对应全局切片和 entry 标签Ms / Ns 微块(Tile 内 N16 × M16)
C/K 微块(当前 C Tile 内 C32)
当前事件的数据流
片上 entry 地址标签
当前指令只高亮它使用的 entry;其他地址仅供对照T_N=16、T_C=32、T_M=16 是标称 Tile 长度,p=precision=1 B。SP_C0 / SP_C1 表示当前 C 阶段使用的 Scratchpad 缓冲符号;ACC_R 表示当前 N/M 输出区域的 Accumulator 缓冲符号,均不固定为 bank 0/1。
符号与源码抽象说明
N / C / M:N 是输入和输出的行,C 是归约长度,M 是权重的行与输出的列。A 按 [N,C]、W 按 [M,C]、Y 按 [N,M] 显示;同一 Y 区域经历 C0、C1 两个归约阶段。
[T] / [O] / [I]:分别对应 total_loop(全局长度)、tile_out_loop(各方向 Tile 数)与 tile_in_loop(单个 Tile 的标称长度)。本图共 2×2×2=8 个调度 Tile,形成 4 个最终输出区域。
Tile 索引与偏移:batch / M / C 是 Tile 的 N/M/C 方向索引,均从 0 开始;这里 batch 不是原始模型的 Batch。Ns / Ms 是 Tile 内 N/M 偏移,取 0 或 8;c_iter 是 Tile 内 C/K 微块起点,取 0、8、16、24。
边界长度:m_loop / n_loop 是当前 M/N 微块的有效长度;c_in_loop 是当前 C Tile 的有效归约长度,本例为 32;c_iter_size 是一条计算指令的有效 K 长度,本例为 8。N 尾部 Tile 的 Ns=8 只剩 4 行。
GEMM_PRELOAD:图中 PRELOAD 是该计算 opcode 的简称,表示带预装载时序的阵列计算指令。tile_m / tile_k / tile_n 分别填写 m_loop / c_iter_size / n_loop;基础延迟还使用 compute_size=n_loop。高亮的 C/K 逻辑切片移动,A/W entry 标签保持不变。
MOVIN / MOVOUT:MOVIN 把全局 A/W 的 DRAM 请求关联到片上 entry;MOVOUT 在输出 entry 就绪后生成 DRAM 写请求,本图只在 C1 出现。Scratchpad entry 追踪输入/权重就绪,Accumulator entry 追踪输出贡献;二者都是元数据,不保存真实矩阵值。
地址公式:SPAD_BASE=0x10000000、ACCUM_SPAD_BASE=0x20000000 是片上标签基址;T_N/T_C/T_M=16/32/16 是标称步长,p=precision=1 B。A_SP/W_SP/Y_ACC 分别是激活、权重、输出 entry 标签。边界裁剪不改变这些步长。
缓冲符号:spad_id、accum_spad_id 选择各 entry 的实际 bank;本图用 SP_C0/SP_C1 区分两次输入装载,用 ACC_R 表示同一 N/M 输出区域的归约缓冲。符号不固定为物理 bank 0/1。
src/operations/GemmWS.cc:220–233, 269–455, 465–504·src/Sram.cc:76–134·当前高亮按指令教学顺序组织,不表示所有 Core 调度周期。