reduce_var / ReduceStdV2 共享的 AR 两趟(two-pass)规约路径在 ascend950(arch35)上存在两点可优化项:
reduceCntEachGroupR[MAX_CORE_COUNT]
PadLessVL
RNum > VL
CalcInnerUbRCnt()
CalcGroupReduceCnt()
VFMeanVarTwoPassAR
Aclnn 直调(ReduceVar 算子),不涉及框架侧改动。
float16 / bfloat16 / float32
ReduceVarTilingData::reduceCntEachGroupR[MAX_CORE_COUNT]
MAX_CORE_COUNT
SetReduceCntEachGroupR
ComputeInnerUbRCnt
Init()
groupReduceCnt_
tMeanTensor_
partBufLocal
meanBuf
dichotomyAddLocal
Ascend950(arch35)
💡 备注(选填) 对应代码改动见关联 PR。
/assign @andong_hw
一、背景信息 (必填)
reduce_var / ReduceStdV2 共享的 AR 两趟(two-pass)规约路径在 ascend950(arch35)上存在两点可优化项:
reduceCntEachGroupR[MAX_CORE_COUNT](56 核逐 group 数组,结构体 1376B),且 tiling 侧承担逐 group 的 R 元素数计算,存在冗余;PadLessVL风格实现,在RNum > VL的大 R 场景性能不佳。二、价值/作用 (必填)
CalcInnerUbRCnt()/CalcGroupReduceCnt()),phase2 按需计算真实规约 R 元素数,不再依赖逐 group 数组;VFMeanVarTwoPassAR按 R 大小分三档(LessVL / LessTwoVL / Common),大 R 场景实测 bf16 (8192,256) 约 -19%、fp16 (362,512) 约 -6%~-8%,其余 ±2% 内无回退;AR/group 场景精度全部通过。三、设计方案 (必填)
3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)
Aclnn 直调(ReduceVar 算子),不涉及框架侧改动。
3.2 总体设计
3.2.1 算子支持的数据类型
float16 / bfloat16 / float32
3.2.2 host侧设计
ReduceVarTilingData::reduceCntEachGroupR[MAX_CORE_COUNT]与MAX_CORE_COUNT;SetReduceCntEachGroupR/ComputeInnerUbRCnt及相关成员;3.2.3 kernel侧设计
Init()中闭式计算当前核所在 group 的groupReduceCnt_;phase2 按需计算每个 group 的真实规约 R 元素数;VFMeanVarTwoPassAR三段分档:LessVL(RNum<=VL,原实现)/ LessTwoVL(VL<RNum<=2VL,纯寄存器、无 LocalMemBar)/ Common(RNum>2VL,quotient 对半生成 partial、每个 scope 一次 LocalMemBar、var 用 DIST_BRC_B32 广播 mean);tMeanTensor_作partBufLocal,meanBuf独占dichotomyAddLocal;3.3 支持硬件
Ascend950(arch35)
3.4 算子约束限制
💡 备注(选填)
对应代码改动见关联 PR。