| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
docs目录基本概念md文件名改为英文 Co-authored-by: chenjiao<chenjiao31@huawei.com> # message auto-generated for no-merge-commit merge: !4182 merge master into master docs目录基本概念md文件名改为英文 Created-by: gitcode-chenjiao Commit-by: chenjiao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> docs目录基本概念md文件名改为英文: 避免link中的中文字符引发的跳转异常,例如两段式接口.md变成%E4%B8%A4%E6%AE%B5%E5%BC%8F%E6%8E%A5%E5%8F%A3.md,不易于维护,可能导致其他平台跳转有问题。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> [#2283](https://gitcode.com/cann/ops-math/issues/2283) ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ok ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> docs/zh/context所有md和对应的link ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4182 | 3 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 | |
doc-tools md低错清理 Co-authored-by: gitcode-chenjiao<chenjiao31@huawei.com> # message auto-generated for no-merge-commit merge: !3914 merge master into master doc-tools md低错清理 Created-by: gitcode-chenjiao Commit-by: gitcode-chenjiao Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> doc-tools md低错清理 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> [#2168](https://gitcode.com/cann/ops-math/issues/2168) ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> doc-tools工具已检测 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> all md ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3914 | 3 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 | |
feat(sort_with_index): 910b的sort_with_index实现 Co-authored-by: zhaohujie<zhaohujie@huawei.com> # message auto-generated for no-merge-commit merge: !3082 merge feat/sort_with_index-pr into master feat(sort_with_index): 910b的sort_with_index实现 Created-by: zhaohujie Commit-by: zhaohujie Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 新增 Ascend910B 原生 AscendC SortWithIndex 算子(experimental/math/sort_with_index/),补齐该算子在 Atlas A2(910B)上的可用性(原 math/sort_with_index 仅 ascend950/arch35) - 排序核:Concat/Sort/Extract + 大轴核内 MrgSort;支持 4 组 dtype、descending、stable、空/标量/单元素边界、NaN/±Inf 极值。 - 性能优化:利用 AscendC Sort 的位置稳定性,将 int32 索引直接融入 Sort 索引通道(省去 position 通道 + Gather),并收窄尾部同步屏障——单核相对优化前提升约 12–16%,相对生产 Sort 内核近持平(见下表)。 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/1765 ## 测试 全部在真实 NPU(Ascend910B3)上验证,重排算子按精确比对(values bitwise + isnan-aware、indices 精确, rtol=atol=0): - **算子级 ST(C++)**:89/89 通过(85 正向 + 4 负向优雅拒绝),覆盖 4 组 dtype × 多 shape(rank 0–8)× 升/降 × stable × 边界(空/标量/轴长1)× 极值(NaN 落开头、±Inf、全相等 ties、±0)。 - **op_host UT**:33/33 通过(全 dtype TilingKey + SIZE_MODE 0/1/2 + dtype 感知 padLen + 异常分支 + infershape)。 - **PyTorch ST**:89/89 通过(torch_npu 真实 NPU,与 C++ ST 交叉验证一致)。 - **泛化/扩面 + 模糊 + 确定性**(ATK 测试框架,真实 NPU):扩面精度 160/160;极值 58/58;模糊 168 次 NPU 执行 0 崩溃 0 精度逃逸 + 超上限优雅拒绝;确定性 accuracy_dc 通过(bitwise 可复现)。 - **性能**:msprof 满频 device 采集,与生产 Sort 内核做 A/B(见下表)。 ## 精度对比(vs CPU golden / torch.sort) 判据:重排算子 rtol=atol=0 —— values bitwise(有限值位型精确;NaN 行按 isnan,910B 升序 Muls(-1) 翻 NaN 符号位仍为 NaN)+ sorted_index 整型精确 + 3 个结构性不变量(双置换性 + 单调性)。golden 为 910B NaN-开头语义(np.lexsort,等价 C++ std::stable_sort),**独立于 torch.sort 的 NaN-末尾约定**。 | 用例 / dtype | 代表 shape | 判据(standard.acc) | max_diff / 误差 | 结果 | |---|---|---|---|---| | float16 | [3008](近单 tile 上限) | bitwise + idx 精确 + 不变量 | 0.0(位型一致) | ✅ | | float32 | [256,256] / [2816] | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | bfloat16 | [2816](位型跟随搬移) | bitwise + idx 精确 + 不变量 | 0.0 | ✅ | | int32 | [2560](\|x\|≤2²⁴) | equal(整型精确) | 0.0 | ✅ | | extreme:NaN/±Inf/±0/全相等 | [8] | isnan-aware + permutation 不变量 | NaN↔NaN 等价 | ✅ | | 边界:空 tensor [0]/[3,0]/[0,8] | — | 返回空 | — | ✅ | | 负向:shape 不匹配 / axis 非末轴 / axis 越界 / 轴长超上限 | — | 优雅拒绝(RuntimeError) | — | ✅(4/4) | **总体**:**89/89 通过(100.0%)**,精度达标 **Pass**(优化后重测,test.py Real 模式,4 组 dtype 基础/多 rank(0–8)/近上限轴长/空 tensor/extreme/确定性,golden 自测 12 项全过)。另:第 3 节 19 个性能 shape 上自定义 kernel 与 torch.sort 排序值 **逐元素一致(vals_eq=True,19/19)** —— 等价性对**真实基线**二次确认。 ## 性能对比(vs 默认基线 torch.sort,真机 device 内核耗时 µs,优化后) 加速比 = 基线 / 新算子(>1 ⇒ 自定义更快)。**保留全部测点,含劣势行并注明根因。** | dtype | shape (行×N) | 新算子 device(µs) | 基线 device(µs)〔Sort+Cast〕 | 加速比(基线/新) | 备注 | |---|---|---|---|---|---| | **int32** | 1 × 2048 | 5.63 | 246.25 | **43.76×** | 内置 int32 排序极慢 | | **int32** | 1 × 2560 | 5.93 | 305.85 | **51.61×** | — | | **int32** | 1024 × 256 | 23.74 | 5531.03 | **232.97×** | 内置 5.5 ms | | **int32** | 4096 × 256 | 82.30 | 21963.63 | **266.88×** | 内置 **22 ms** | | float16 | 1 × 2048 | 6.94 | 4.99 | 0.72× | 单行小数据,内置极快 | | float16 | 1 × 3008 | 6.77 | 8.10 | 1.20× | 略快 | | float16 | 256 × 256 | 9.05 | 13.26 | 1.46× | 领先 | | float16 | 1024 × 256 | 23.44 | 21.42 | 0.91× | 近平(优化前 0.60×) | | float16 | 4096 × 256 | 80.36 | 45.11 | 0.56× | 大批量劣势(优化前 0.48×) | | float16 | 4096 × 128 | 60.02 | 30.15 | 0.50× | 大批量劣势(优化前 0.39×) | | float32 | 1 × 2048 | 5.47 | 5.03 | 0.92× | 同量级 | | float32 | 1 × 2816 | 6.39 | 7.40 | 1.16× | 略快 | | float32 | 256 × 256 | 9.09 | 12.69 | 1.40× | 领先 | | float32 | 1024 × 256 | 22.86 | 20.31 | 0.89× | 近平(优化前 0.58×) | | float32 | 4096 × 256 | 78.73 | 49.11 | 0.62× | 大批量劣势(优化前 0.52×) | | bfloat16 | 1 × 2048 | 5.73 | 7.11 | 1.24× | 略快 | | bfloat16 | 1 × 2816 | 6.65 | 9.06 | 1.36× | 略快 | | bfloat16 | 1024 × 256 | 23.49 | 42.99 | 1.83× | 领先(内置含重 Cast) | | bfloat16 | 4096 × 256 | 80.97 | 74.31 | 0.92× | 近平(优化前 0.64×) | **总体(device 内核口径,优化后)**: - **int32(4 测点)**:43.76× / 51.61× / 232.97× / 266.88×,平均 **≈149×**,全面量级领先。 - **float(fp16+fp32+bf16,15 测点)**:加速比 0.50×–1.83×,平均 **≈1.05×(跨过同量级)**;单行/小批 **1.1–1.5×**,大批量(≥1024 行)**0.50–0.92×**(优化前为 0.39–1.06×)。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> - 更新/新增 experimental/math/sort_with_index/README.md(算子说明、产品支持、参数、约束、调用)。 - 更新/新增 experimental/math/sort_with_index/docs/aclnnSortWithIndex.md(aclnn API 参考 + 调用示例)。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3082 | 4 个月前 |
SortWithIndex
本算子为
experimental/math/sort_with_index(Atlas A2 训练系列产品/Atlas A2 推理系列产品,即 Ascend 910B 原生 AscendC 实现)。 L0 语义真值源:math/sort_with_index/(仅适配 Ascend 950PR/DT,arch35 kernel);本 experimental 实现新增 910B 原生支持。
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | × |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | × |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | × |
说明:本 experimental 工程仅声明
AddConfig("ascend910b", ...)(见op_host/sort_with_index_def.cpp),首版仅适配 Atlas A2 训练系列产品/Atlas A2 推理系列产品(Ascend 910B)。Ascend 950 上的 SortWithIndex 由真值源math/sort_with_index(arch35 kernel)提供,不在本工程范围内。
功能说明
-
算子功能:沿指定轴
axis对输入张量x进行排序,输出排序后的数值张量y,并将输入索引张量index按与x相同的排序顺序同步重排,输出sorted_index。等价于torch.sort(x, dim=axis, descending=descending, stable=stable),但索引来源为外部传入的index(而非内部生成的0..N-1)。 -
计算逻辑:设排序轴(最后一维)上一维切片长度为 NNN,排序得到一个 0..N−10..N-10..N−1 的置换 ppp,满足:
升序(descending=false):
x[p0]≤x[p1]≤⋯≤x[pN−1]x[p_0] \le x[p_1] \le \cdots \le x[p_{N-1}] x[p0]≤x[p1]≤⋯≤x[pN−1]
降序(descending=true):
x[p0]≥x[p1]≥⋯≥x[pN−1]x[p_0] \ge x[p_1] \ge \cdots \ge x[p_{N-1}] x[p0]≥x[p1]≥⋯≥x[pN−1]
输出:
yk=x[pk],sorted_indexk=index[pk]y_k = x[p_k], \quad sorted\_index_k = index[p_k] yk=x[pk],sorted_indexk=index[pk]
-
稳定性:
stable=true时相等元素保持原相对顺序(ties 中原始位置较小者在前);stable=false时 ties 顺序未定义。 -
特殊值(910B 实测语义,见“约束说明”):NaN 升序、降序均落序列开头;$+\infty > $ 有限数 $ > -\infty$(升序 +∞+\infty+∞ 在 NaN 之后的末尾、−∞-\infty−∞ 在 NaN 之后的开头)。
参数说明
表格列出本算子定义(
op_host/sort_with_index_def.cpp/op_graph/sort_with_index_exp_proto.h)声明的参数。910B 首版 dtype 范围见表后“约束说明”。
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 待排序的数值张量,对应公式中的 x。 | FLOAT16、FLOAT、BFLOAT16、INT32 | ND |
| index | 输入 | 跟随 x 排序的原始索引张量,shape 需与 x 一致,对应公式中的 index。 | INT32 | ND |
| axis | 可选属性 |
|
INT | - |
| descending | 可选属性 |
|
BOOL | - |
| stable | 可选属性 |
|
BOOL | - |
| y | 输出 | 排序后的数值张量,dtype/shape 与 x 一致,对应公式中的 y。 | FLOAT16、FLOAT、BFLOAT16、INT32 | ND |
| sorted_index | 输出 | 跟随排序后的索引张量,dtype/shape 与 index 一致,对应公式中的 sorted_index。 | INT32 | ND |
约束说明
本算子在 Atlas A2 训练系列产品/Atlas A2 推理系列产品(Ascend 910B)上实现,存在以下特有约束:
-
dtype 组合(4 组,按位置对齐):910B 首版仅支持 4 组
(value, index)组合,index与sorted_index均为 INT32:x(value) index y sorted_index FLOAT16 INT32 FLOAT16 INT32 FLOAT INT32 FLOAT INT32 BFLOAT16 INT32 BFLOAT16 INT32 INT32 INT32 INT32 INT32 -
index 仅支持 INT32:910B 首版不支持 INT64 index。这是框架硬限制——非 RegBase(DAV_2201)的 SortWithIndex 算子族在 910B 上运行时强制
sorted_index = int32,int64 binary 无法经 aclnn 匹配到,故对外不暴露 int64-index。INT64-index 留待 Ascend 950 RegBase。 -
INT32 value 值域:INT32 输入须满足
|x| ≤ 2^24(INT32 value 经浮点排序通路,超出该范围 Cast 后丢精度,排序结果可能不正确)。 -
排序轴(最后一维)长度 N 上限:910B 首版单行排序在核内单 tile 完成,N 有 dtype 相关上限(随运行时可用 UB 取值,约值如下)。超界时 tiling 优雅拒绝(返回
GRAPH_FAILED、清晰报错,非板上崩溃),不写死阈值。x(value) 安全 N 上限(约) FLOAT16 ~3008 FLOAT ~2816 BFLOAT16 ~2816 INT32 ~2560 若业务需支持大轴(N ≫ 3000),需后续迭代的 GM workspace 多块归并方案,不在 910B 首版范围。
-
NaN 落位(910B 实测,区别于 torch/原 spec 末尾约定):NaN 视为大于任何数值参与排序,但升序、降序下均落序列开头(实现走
Muls(-1)升序路径 + 硬件降序 Sort 不反转名次,NaN 自然落 rank0)。NaN 行的数值比对按isnan比较(升序会翻 NaN 符号位,bit 不一致但仍是 NaN)。 -
特殊值:±∞\pm\infty±∞ 正常参与排序(升序 +∞+\infty+∞ 排末尾、−∞-\infty−∞ 排开头);±0\pm 0±0 视为相等(ties)。
-
shape 约束:x 与 index 的 shape 必须一致;y、sorted_index 的 shape 分别与 x、index 一致;rank 范围 [0, 8]。
-
axis 约束:当前仅支持沿最后一维排序(axis 取值为 -1 或 rank-1),其余取值优雅拒绝(参数校验 161002)。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| aclnn 调用 | test_aclnn_sort_with_index | 通过两段式 aclnn 接口(aclnnSortWithIndexGetWorkspaceSize + aclnnSortWithIndex)调用算子。一键编译运行见 examples/run.sh(已固化独立 vendor + ASCEND_CUSTOM_OPP_PATH 规避系统 built-in SortWithIndex)。 |
| 图模式调用 | test_geir_sort_with_index | 通过算子 IR(sort_with_index_exp_proto.h)构图方式调用 SortWithIndex 算子。 |
运行前置:本算子为 experimental 自定义算子包,需先构建并安装算子包,再用独立 vendor +
ASCEND_CUSTOM_OPP_PATH覆盖 CANN 自带的系统 built-inSortWithIndex:source ${ASCEND_HOME_PATH}/../set_env.sh # 或 CANN 安装目录的 set_env.sh # 1. 构建独立 vendor 自定义算子包 bash build.sh --pkg --experimental --soc=ascend910b --ops=sort_with_index --vendor_name=sort_with_index_custom -j16 # 2. 安装到用户路径(不写系统目录) ./build_out/cann-ops-math-sort_with_index_custom_linux-*.run --install-path=$HOME/swi_opp --quiet # 3. 指向自定义 vendor 根,覆盖系统 built-in export ASCEND_CUSTOM_OPP_PATH=$HOME/swi_opp/vendors/sort_with_index_custom_math export LD_LIBRARY_PATH=$ASCEND_CUSTOM_OPP_PATH/op_api/lib:$LD_LIBRARY_PATH # 4. 一键编译并运行 aclnn 示例 cd experimental/math/sort_with_index/examples && bash run.sh