已关闭
[Requirement|需求建议]: gemm blaze模板 TT量化场景支持StreamK性能优化 #136
chen-shuai创建于  28 天前关闭于  12 天前
chen-shuai成员
28 天前 创建

Thanks for sending a requirement! Please fill in the following template to help quickly solve your problem.

一、背景信息 (必填)

blaze模板支持TT量化场景streamK
gemm blaze模板 TT量化场景支持StreamK性能优化

二、价值/作用 (必填)

解决小M、N大K场景核利用率可能不足的问题,提高该场景下的性能表现

三、设计方案 (必填)

整体流程

Device 侧按照以下模块组织:

Policy
  -> Kernel
  -> BlockScheduler
  -> BlockMmad
  -> BlockEpilogue
  • Policy 选择 QBMM per-tensor StreamK 调度类型。
  • Kernel 负责组装各模块,并完成 AIC/AIV 分流和同步。
  • BlockScheduler 复用已有 StreamK block 映射和 K 维切分逻辑。
  • BlockMmad 在 AIC 上完成各个 K 分片的矩阵计算。
  • BlockEpilogue 在 AIV 上归约 workspace partial,并在 UB 上完成 Vector 反量化和后处理。

Policy

新增 KernelQbmmPertensorMultiBlockStreamK 调度类型,并为 MatmulWithScaleFixpipeQuant 增加可配置的 ScheduleType

通过独立 ScheduleType 将普通 Fixpipe QBMM、MX StreamK 和 per-tensor StreamK 的模板实例区分开,防止 Kernel、MMAD 和 Epilogue 发生错误组合。

Kernel

新增 kernel_qbmm_pertensor_streamk.h,实现 QBMM per-tensor StreamK 对应的 GemmUniversal 特化。

Kernel 主要完成:

  • 组装 BlockMmad、BlockEpilogue 和 BlockScheduler。
  • AIC 根据 Scheduler 返回的 block 信息执行 DP tile 或 StreamK K 分片。
  • DP block 通过 Fixpipe 反量化并直接写入最终输出。
  • StreamK block 将未反量化的 raw accumulator partial 写入 workspace。
  • AIC 完成后通过 CrossCore 同步通知 AIV。
  • AIV 等待 AIC 完成后,执行 workspace reduce 和 Vector 后处理。

BlockScheduler

直接复用已有 BlockSchedulerMatmulStreamK,不修改原有 StreamK 切块策略。

Scheduler 负责:

  • M/N tile 划分。
  • DP block 和 StreamK block 映射。
  • K 分片编号和当前分片长度计算。
  • 尾块 StreamK 调度。

BlockMmad

扩展 block_mmad_a8w8_fixpipe_quant.h,使已有 QBMM BlockMmad 支持 per-tensor StreamK ScheduleType。

主要修改包括:

  • 根据当前 StreamK 分片长度更新 K 循环。
  • DP block 保留原有 Fixpipe 反量化输出路径。
  • StreamK block 不进行 Fixpipe 反量化,将 raw partial 写入 workspace。
  • 根据量化组合决定 bias 在 MMAD 中累加,还是交给 AIV Epilogue 处理。
  • 同一个输出 tile 的 bias 只在第一个 K 分片中累加,避免重复累加。

int32 bias,以及 FP8 整数编码 scale 对应的 fp32 bias,在 MMAD 累加域处理。

BlockEpilogue

新增 block_epilogue_qbmm_pertensor_streamk.h,实现专用 AIV 后处理:

  1. 从 workspace 读取同一输出 tile 的多个 K 分片 partial。
  2. 在 UB 中完成 split-K reduce。
  3. 应用 X2 per-tensor scale。
  4. 根据量化模式应用可选 X1 per-tensor scale。
  5. 累加需要在反量化后处理的 bias。
  6. 转换为 fp16、bf16 或 fp32,并写回最终输出。

反量化全部在 UB 上由 Vector 完成,不使用 Fixpipe 随路反量化处理 StreamK partial。

Scale 和 Bias 顺序

支持两类 bias 处理顺序:

反量化前 bias:
(raw accumulator + bias) * scale
反量化后 bias:
raw accumulator * x2Scale * optional x1Scale + bias

对于反量化后 bias,Host Tiling 仅允许全 StreamK 调度,确保所有输出 tile 都经过 AIV Epilogue。

💡 备注(选填)

likedislike
Cchen-shuai成员
28 天前 添加了label:requirement
Cchen-shuai成员
28 天前 修改了issue 的描述
Cchen-shuai成员
28 天前 修改了issue 的描述
chen-shuai成员
28 天前 评论:

/assign

likedislike
CANN-robotCANN-robot成员
28 天前 将 chen-shuai 设为负责人
chen-shuai成员
12 天前 评论:

/close

likedislike
CANN-robotCANN-robot成员
12 天前 issue状态由 进行中 改变为 已完成
CANN-robotCANN-robot成员
12 天前 关闭了 issue
CANN-robotCANN-robot成员
12 天前 添加了label:resolved