ArgMaxGrad 在 Ascend950/arch35 上按不带 D 的原型交付后,轴下标(A2 由融合 pass 传入的 assist 张量)改为内核自生成。当前实现存在两个可优化点:
colsPerChunk
BUFFER_NUM
另外 UB 记账采用「先按每元素字节数估一个段长,再回头断言没超」的写法,一旦记账口径与内核 InitBuffer 不一致就会静默踩 UB(本算子此前的 UB 越界缺陷即出于此)。
InitBuffer
昇腾算子 arch35(Ascend950)迁移交付线自验发现,非外部用户反馈。
Ascend950PR 实测(ttk -d false -b release,--run 12):
ttk -d false -b release
--run 12
inner>1
inner==1
同时 UB 记账改为按容量反解后,段长由「Total() <= ubSize 的最大整宽解」直接求出,消除了记账口径与 InitBuffer 不一致导致静默踩 UB 的一类风险。
Total() <= ubSize
AssistSrc
ARANGE
Reg::Arange(reg, kStart + 车道偏移)
SCALAR
Reg::Duplicate
UB
i32BufBytes
UbLayout
SolveColsPerChunk
关联 PR:https://gitcode.com/cann/ops-nn/pull/9546
Backgroud(背景信息)
ArgMaxGrad 在 Ascend950/arch35 上按不带 D 的原型交付后,轴下标(A2 由融合 pass 传入的 assist 张量)改为内核自生成。当前实现存在两个可优化点:
colsPerChunk)被压小。BUFFER_NUM固定为 1,双缓冲未开启,MTE2 搬入 → V 计算 → MTE3 搬出完全串行;实测大形状每核也只有 3~8 段,没有任何流水重叠。另外 UB 记账采用「先按每元素字节数估一个段长,再回头断言没超」的写法,一旦记账口径与内核
InitBuffer不一致就会静默踩 UB(本算子此前的 UB 越界缺陷即出于此)。Origin(信息来源)
昇腾算子 arch35(Ascend950)迁移交付线自验发现,非外部用户反馈。
Benefit / Necessity (价值/作用)
Ascend950PR 实测(
ttk -d false -b release,--run 12):inner>1的三档(逐行直算 / 紧排铺 tile / 按行补齐),inner==1基本持平。同时 UB 记账改为按容量反解后,段长由「
Total() <= ubSize的最大整宽解」直接求出,消除了记账口径与InitBuffer不一致导致静默踩 UB 的一类风险。Design(设计方案)
AssistSrc:ARANGE:inner==1 时本段沿被选轴连续,Reg::Arange(reg, kStart + 车道偏移)一条指令生成;SCALAR:inner>1 的单行段整段同一个 k,Reg::Duplicate进寄存器;UB:仅保留「一个寄存器块跨多行」的紧排/补齐两档(k 在寄存器内算不出闭式,仍需物化)。i32BufBytes按档记账:inner==1 或逐行直算档记 0。BUFFER_NUM从 1 提到 2,使 MTE2 与 V 重叠;fp16 每元素占用 ~8.1B → ~4.1B → ~8.2B,UB 总量基本持平。UbLayout(字段与InitBuffer调用一一对应)+SolveColsPerChunk二分反解。关联 PR:https://gitcode.com/cann/ops-nn/pull/9546