Pull Request已成功合入, 合并人@CANN-robot
(感谢 BartonFang 的贡献)变更摘要
本 PR 用于修复 9.2.0-beta.2 中 scatter_elements_v2 legacy 内核(tilingKey=110)在宽行、每行仅一个 scatter 元素且 include_self=true 场景下的性能回退。根因是旧实现对所有 reduction 模式统一启用 hit-count 簿记(每 chunk 全量初始化/维护 countLocal,代价 O(row×chunk)),而 include_self=true 的 add/mul/min/max 语义上并不需要命中计数。修改将 scatter_elements_v2.h 中的 NeedHitCount() 判定收紧为仅在 include_self=false、SCATTER_MODE_MEAN、fp16/bf16 cast 路径下返回 true,并让 ScatterSetValue 仅在需要时读写 countLocal,在恢复性能(回退前约 1.8ms 基线)的同时保留 min/max/mean 等既有功能。
主要改动
- 收紧
NeedHitCount()判定: 命中计数需求从"所有 reduction 模式"收窄为includeSelf == 0 || mode == SCATTER_MODE_MEAN || IsCastFloatType(),非 reduce 模式直接返回 false,使include_self=true的 add/mul/min/max 等模式不再进入命中计数逻辑。 ScatterSetValue条件化命中计数簿记: 将countLocal.GetValue/SetValue及useUpdateOnly的首次命中判断整体包入if (NeedHitCount())分支,跳过每 chunk 的countLocal清零/维护,消除宽行场景的主要热点。- 保留 cast 精度修复路径:
NeedHitCount()中保留IsCastFloatType()条件,fp16/bf16 的 fp32 中间累加 + 单次写回路径仍走原 hit-count 逻辑,不影响既有精度修复行为。


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| index | ✅ 陈兴宇, 陈琦 (2/2) | ✅ 陈兴宇 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
bartonfang, thanks for your pull request. All authors of the commits have signed the CLA. 👍


您好,pr合入已准备就绪,请尽快联系committer进行检视,谢谢!


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


您好,pr合入已准备就绪,请尽快联系committer进行检视,谢谢!


/lgtm
/approve


背景
在 9.2.0-beta.2 上复现用户场景 [4096,64640] fp32、dim≈1、index[4096,1](每行仅一个 scatter 元素、include_self=true、reduce=add)出现性能回退:总耗时 21603us,其中 ScatterElementsV2 19855us(回退前基线约 1.8ms)。!10043 通过整体回退 #6460/#6624/#7736/#8714 验证性能可恢复,但同时移除了 min/max/mean 等新功能。本 PR 定位到真正的热点并做正向修复,保留上述 4 个 PR 的功能。
根因
该簿记机制由 #6460(Add min, max, and mean modes to the scatter_reduce operator, d382188b4)引入:该 PR 把 arch22 legacy 内核从单一 MODE 模板的 add 实现重写为通用的运行时 mode reduce 内核,新增 countLocal/InitHitCount/ReduceValue 以支持 min/max/mean 与 include_self=false 语义,同时把原先直接累加的 add 路径也并入了 hit-count 路径。重写后的内核:
宽行(64640)+ 每行只有 1 个元素需要更新的场景下,countLocal 的全量初始化/维护 O(row×chunk) 成为绝对热点。而 hit count 仅在以下场景必需:
include_self=true 的 add/mul/min/max 每个位置都有确定初值 self、命中同权归约,结果与“第几次命中”无关,计数是纯写不读的死开销。另外同批 #6624 仅放宽 host 侧 cache-op xDim1 保护(扩大暴露面),#7736(AICPU 拦截新 mode)与 #8714(文档)与本热点无直接关系。性能劣化本质不是新增 min/max/mean 功能的固有代价,而是通用化把 include_self=true 的 sum 也并入了 hit-count 内核,因此可以按本 PR 方式正向修复,无需整体回退。
修改
index/scatter_elements_v2/op_kernel/scatter_elements_v2.h(两个 commit,共 ~35 行变更)
最终逻辑:
仅影响 legacy kernel 内部簿记与 buffer 分配,不改 tiling、接口与运算语义。
验证(910B 实机 ATK,同 [4096,64640]/每行 1 命中场景)
性能(performance_device,--performance_data 300,100,80)
fp16 数据说明:#6460 的计数簿记同样拖累 fp16/bf16 原 add 路径(保留计数时 21.2ms),本次一并修复。
正确性
相关:!10043(回退验证,证明性能问题成立);本 PR 为正向修复方案,可替代整体回退。