已关闭
SwigluGroupGrad性能不达标 #4832
小王!创建于  8月17日关闭于  8月18日
小王!
小王!成员
8月17日 创建

优化方案如下
一、SIMT 模板的性能优化:
1、新增 H=1 快路径:H=1 时直接完成单元素 gate/up 反向和可选 weight 输出,不再进入通用 hidden 循环、pairwise 入口和多层可选分支,线程仍按行跨步调度。
2、撤销超宽 SIMT 协作分支:不再让 SIMT 处理 T≤8、H≥262144 的超大 H 场景,避免单线程/少线程串行长循环;该类 shape 全部转交 RegBase/SIMD fixed-tree 分支。
二、RegBase/SIMD(small kernel)模板的性能优化:
1、路由层窄域隔离:仅 1≤T≤8、H≥262144 且同时存在 weight、y_origin 时进入 mode 2;其他 shape 继续沿用原 mode 0/1,避免粗糙 T/H 二分导致存量路径回归。
2、任务域从“行”扩展为“行 × hidden 子树”:mode 2 将一行 hidden 切成 2 的幂次个连续 subtree,总任务数 = T × subtree 数,使 T=1/2 时也能填满多核;每个任务连续访问,保持数据局部性。
3、新增 fixed-tree 精确归约:每个 subtree 对应参考 pairwise 归约树的真实子树,各核计算自己的 partial 后,由一个核按原左右顺序合并,不改变 FP32 加法顺序,满足 gradWeight 精度契约。
4、统一 blockDim 与任务契约:实际 launchedCoreNum 取 min(平台核数, 总任务数),并显式用于 Kernel 的任务 stride 和 ownership 计算,消除 Tiling 与 Kernel 字段语义不一致。
5、UB 预算纳入 partial 缓冲区:mode 2 在核算主体 tile 的同时把 partial、FP32 临时区和 y_origin 全部纳入 UB 上限,避免“主体能放下、归约临时区越界”的假可行方案。
6、跨核 partial 与第二输出改为 DMA 传递:各核 partial 通过向量队列/MTE3 写入 gradX scratch,core 0 用 DMA 集中读回并连续写出 gradWeight,避免多核标量 GM store 落在同一缓存行导致的 DCache 伪共享随机错误。
7、复用 gradX 前缀作为 scratch,不新增 workspace:归约完成后同步,各核只重算被占用的 gradX 前缀,恢复正确输出;重算范围远小于 H,避免额外 HBM 分配和协议。
8、保留已有 SIMD 快速路径:原 H=2048 专用 pairwise 快路径仍保持最高优先级;count≥512 的通用归约继续使用向量化 pairwise leaf;splitHidden 且需要 gradWeight 时不再搬运该阶段不用的 x,减少 GM 带宽和 UB 占用。

likedislike
小王!小王!成员
8月17日 将 qq_52056150 设为负责人
CANN-robotCANN-robot成员
8月18日 关闭了 issue
CANN-robotCANN-robot成员
8月18日 添加了label:resolved