ONNXim / GemmWS / Stepwise Mapping

GEMM Tile、C 归约与片上地址逐步映射

单一边界示例:[T] N28 C64 M32 · [O] N2 C2 M2 · [I] N16 C32 M16

8×8 WS 阵列 precision = 1 B 无 Bias 指令示意,不是周期 Trace

逐步播放

按 GemmWS 的 Tile → 指令顺序高亮
MOVIN
指令 1 / 176Tile 0 / 8
Step 1 · Tile 0 · MOVIN

Tile 索引
全局范围
局部偏移
缓冲符号

8 个外层 Tile(点击跳到该 Tile 的第一条指令)

全局范围
当前 Tile
当前 C/K 微块
片上 entry
边界有效区域
标称/非当前范围

全局 N / C / M 范围

紫色背景表示当前 Tile;亮色表示当前指令的对应切片
total_loop = N28 / C64 / M32

Activation A N28 × C64

N: 0 → 27C: 0 → 63

Weight W M32 × C64

M: 0 → 31C: 0 → 63

Output Y N28 × M32

N: 0 → 27M: 0 → 31

当前 Tile 的局部映射

高亮的微块同时对应全局切片和 entry 标签
完整 N Tile

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 调度周期。
图按源码的指令生成顺序教学展示,不模拟 DMA 响应、流水线或真实周期。边界 Tile 保留标称步长,Ns=8 仅 N24…27 有效。Accumulator 复用按相邻 C Tile 接续发射的归约意图示意;具体 bank 由 Core 当前调度状态决定,不保证任意重排或间隙。快捷键:← / → 单步,空格播放 / 暂停。