| Files | Last commit | Last update |
|---|---|---|
feat(pooling): add GlobalLpPool operator Co-authored-by: weixin_51153241<fanjie43@huawei.com> # message auto-generated for no-merge-commit merge: !6398 merge feature/add-global-lp-pool into master feat(pooling): add GlobalLpPool operator Created-by: weixin_51153241 Commit-by: weixin_51153241 Merged-by: cann-robot Description: ## 算子说明 Global LP Pool — 计算输入张量空间维度的 Lp 范数: y = (sum(|x|^p))^(1/p), keepdims=True ## 支持规格 - 输入: 4D (NCHW) 或 5D (NCD0D1D2) - DTypes: FP32, FP16, BF16 - 属性: p (float, 默认 2.0) - 架构: ascend950/arch35 - 接口: aclnn_exclude (直调) ## 文件清单 (20 files) - op_kernel/ — VF 级 kernel 实现 (双缓冲 + 二分归约树 + |x|^p + (1/p) root) - op_host/ — Tiling (ubFactor, 多核切分, cacheBuf 约束, empty tensor 分支) - op_graph/ — Proto 定义 - tests/ — Tiling 单测 (5 用例: 4D/5D/大通道/空张量) - README.md — 算子说明 See merge request: cann/ops-nn!6398 | 4 months ago | |
docs(global_lp_pool): 补充 GlobalLpPool proto 注释 DEPRECATED/EXPERIMENTAL 警告 Co-authored-by: andong_hw<andong2@huawei.com> # message auto-generated for no-merge-commit merge: !11819 merge fix-global-lp-pool-proto-deprecated into master docs(global_lp_pool): 补充 GlobalLpPool proto 注释 DEPRECATED/EXPERIMENTAL 警告 Created-by: andong_hw Commit-by: andong_hw Merged-by: cann-robot Description: ## 描述 补充 pooling/global_lp_pool/op_graph/global_lp_pool_proto.h 中 GlobalLpPool 算子原型注释,增加如下告警标识,与 common/inc/op_graph/op_nn_proto_extend.h 中同名算子的注释保持一致: * @par Restrictions: * Warning: THIS FUNCTION IS DEPRECATED. * Warning: THIS FUNCTION IS EXPERIMENTAL. Please do not use. ## 关联的Issue 关联 Issue #6559(Closes #6559) ## 测试 纯注释改动,不涉及算子实现与编译逻辑;已通过仓库 pre-commit 全部检查(trailing-whitespace、end-of-file、clang-format、codespell、OAT 开源合规扫描)。 ## 文档更新 更新了 pooling/global_lp_pool/op_graph/global_lp_pool_proto.h 的算子原型注释。 ## 类型标签 - [x] 文档更新 ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!11819 | 30 days ago | |
fix(global_lp_pool): 补齐 tiling 异常/维护日志并消除魔法数字 Co-authored-by: andong_hw<andong2@huawei.com> # message auto-generated for no-merge-commit merge: !11954 merge fix-global-lp-pool-tiling-log into master fix(global_lp_pool): 补齐 tiling 异常/维护日志并消除魔法数字 Created-by: andong_hw Commit-by: andong_hw Merged-by: cann-robot Description: ## 描述 跟进 PR #11881(已合入)的 review 意见("很多魔鬼数字"、异常缺少日志),对 GlobalLpPool arch35 tiling 做可维护性整改(无计算路径变化): 1. **异常路径全量补日志**:GetPlatformInfoFromCtx / GetShapeAttrsInfo / ComputeAUbFactor / ComputeRUbFactor / ExpandAIfRFullyLoaded / ComputeAraTiling / ComputeNormalTiling / ComputeEmptyTiling / FillAndLogTilingData / ComputeTiling 的每个失败分支均输出含参数与原因的日志( OP_LOGE 或 OP_LOGE_FOR_INVALID_{ARGUMENT,DTYPE,SHAPEDIM}_WITH_REASON),风格对齐 reduction 范式 example(euclidean_norm tiling)。 2. **维护性日志**:新增入口与路由打点(EMPTY_A/EMPTY_R/ARA/AR)、各切分阶段 OP_LOGD(platform/input/FusedAxis/ComputeRUbFactor/ExpandA);FillAndLogTilingData 由单行扩为全量 INFO dump(pattern / split / loop / multicore / ub / attr 分段)。 3. **消除魔法数字**:新增 host/kernel 共享命名常量 GLLP_MAX_AXIS_NUM / GLLP_AXIS_INTERVAL / GLLP_AXIS_NUM_AR / GLLP_AXIS_NUM_ARA(axisShape/axisStride 数组长度、A/R 规整间距、模式轴数统一引用),kernel isTailR 运行期判定改用 GLLP_AXIS_INTERVAL;host 侧 DIM_NUM_4D/5D、MAX_SHAPE_DIM、FP32_SIZE 命名化。 4. **消除硬编码 32B 元素数**:cacheLevelStride / EMPTY_A / EMPTY_R 原 BLOCK_F32 = 32/sizeof(float) 改为按平台 blockSize 计算。 ## 关联的Issue Closes #6680 ## 测试 - 构建:bash build.sh --pkg --soc=ascend950 --ops=global_lp_pool -j32 通过,本地安装验证; - 聚焦回归 97 条 GEIR 全 PASS:受影响(R==1 且 A<一个 block)24 条 24/24、workdir18 18/18、ST 30/30、L0 24/24、perf c_s_008 1/1(cst_perf_us 22.7us,修复前 252.4us); - 抽查在 ttk 72ab72b 与 4b161e1 两个版本下均 PASS;前序全量 913 条回归(功能集零回退)已在 #11881 完成。 ## 文档更新 无 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:可维护性整改(日志补齐 + 魔法数字消除),无行为变化 ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!11954 | 26 days ago | |
fix(global_lp_pool): 补齐 tiling 异常/维护日志并消除魔法数字 Co-authored-by: andong_hw<andong2@huawei.com> # message auto-generated for no-merge-commit merge: !11954 merge fix-global-lp-pool-tiling-log into master fix(global_lp_pool): 补齐 tiling 异常/维护日志并消除魔法数字 Created-by: andong_hw Commit-by: andong_hw Merged-by: cann-robot Description: ## 描述 跟进 PR #11881(已合入)的 review 意见("很多魔鬼数字"、异常缺少日志),对 GlobalLpPool arch35 tiling 做可维护性整改(无计算路径变化): 1. **异常路径全量补日志**:GetPlatformInfoFromCtx / GetShapeAttrsInfo / ComputeAUbFactor / ComputeRUbFactor / ExpandAIfRFullyLoaded / ComputeAraTiling / ComputeNormalTiling / ComputeEmptyTiling / FillAndLogTilingData / ComputeTiling 的每个失败分支均输出含参数与原因的日志( OP_LOGE 或 OP_LOGE_FOR_INVALID_{ARGUMENT,DTYPE,SHAPEDIM}_WITH_REASON),风格对齐 reduction 范式 example(euclidean_norm tiling)。 2. **维护性日志**:新增入口与路由打点(EMPTY_A/EMPTY_R/ARA/AR)、各切分阶段 OP_LOGD(platform/input/FusedAxis/ComputeRUbFactor/ExpandA);FillAndLogTilingData 由单行扩为全量 INFO dump(pattern / split / loop / multicore / ub / attr 分段)。 3. **消除魔法数字**:新增 host/kernel 共享命名常量 GLLP_MAX_AXIS_NUM / GLLP_AXIS_INTERVAL / GLLP_AXIS_NUM_AR / GLLP_AXIS_NUM_ARA(axisShape/axisStride 数组长度、A/R 规整间距、模式轴数统一引用),kernel isTailR 运行期判定改用 GLLP_AXIS_INTERVAL;host 侧 DIM_NUM_4D/5D、MAX_SHAPE_DIM、FP32_SIZE 命名化。 4. **消除硬编码 32B 元素数**:cacheLevelStride / EMPTY_A / EMPTY_R 原 BLOCK_F32 = 32/sizeof(float) 改为按平台 blockSize 计算。 ## 关联的Issue Closes #6680 ## 测试 - 构建:bash build.sh --pkg --soc=ascend950 --ops=global_lp_pool -j32 通过,本地安装验证; - 聚焦回归 97 条 GEIR 全 PASS:受影响(R==1 且 A<一个 block)24 条 24/24、workdir18 18/18、ST 30/30、L0 24/24、perf c_s_008 1/1(cst_perf_us 22.7us,修复前 252.4us); - 抽查在 ttk 72ab72b 与 4b161e1 两个版本下均 PASS;前序全量 913 条回归(功能集零回退)已在 #11881 完成。 ## 文档更新 无 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:可维护性整改(日志补齐 + 魔法数字消除),无行为变化 ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!11954 | 26 days ago | |
fix(global_lp_pool): 修复 UB 对齐崩溃,并按 reduction 范式修订 kernel 与 tiling Co-authored-by: fanjie43<fanjie43@huawei.com> # message auto-generated for no-merge-commit merge: !11081 merge fix/global-lp-pool-ub-align-crash into master fix(global_lp_pool): 修复 UB 对齐崩溃,并按 reduction 范式修订 kernel 与 tiling Created-by: weixin_51153241 Commit-by: andong_hw;fanjie43 Merged-by: cann-robot Description: ## 关联 Issue Closes #6151 ## 提交 | 提交 | 内容 | 规模 | |---|---|---| | e2b130632 | 修复 UB 对齐崩溃,并按 reduction 范式修订 kernel 与 tiling | +340 −282 | | bee940845…07a153425(5 笔,同步自 #11239) | 次正规数精度修复(FTZ_FALSE 档)+ golden 适配 TTK TestSpec + 文档 | +81 −28 | | **合计** | | **+421 −310** | --- ## 一、崩溃修复 ### 问题 执行该算子自带的 18 个 ST 用例,**7 个崩溃**: L0_002 / L0_004 / L0_010 / L0_011 / L0_012 / L0_013 / L0_014。 设备侧报错: error code = 340 The address for VEC to access UB is not aligned. subErrType: 0x4 aclnn 路径表现为 507035 vector core exception + ACLNN_EXECUTE_FAILED。 ### 根因 ZeroRowTailVf() 用 Reg::StoreAlign 清零每个 tmpBuf 行的尾部,起点直接取 rLen: cpp int64_t tailStart = rLen; int32_t off = r * rowStride + tailStart + c * VF_VL_F32; Reg::StoreAlign<float>(base + off, vz, mask); StoreAlign 要求目标起始地址 **32B 对齐**,而 rLen(最后一个不满 R 分块的有效元素数) 不保证是 8 个 fp32(= 32B)的整数倍。函数原有注释「For large shapes (rLen typically 8-aligned), StoreAlign at offset rLen is 32B-aligned → safe」的论断不成立。 触发条件只依赖 tiling 量,**与输入数据无关**: bisectionTail > 0 && R % rUbFactor != 0 && (R % rUbFactor) % 8 != 0 因此不同随机种子、不同运行下崩溃集合恒定不变。以 L0_002 为例: rUb = 14840,R % rUb = 1972,1972 % 8 = 4 → 命中。 ### 修复 删除 ZeroRowTailVf,改用 reduction 范式的标准写法,把 R 方向的 pad 清零 拆成两个语义清晰的 VF: - ClearInnerBurstTailPadVf —— 清 [validR, CeilAlign(validR, bsInput)), 起点用 FloorAlign(validR, 8) 保证对齐,越界部分用 mask 三段 ([validR%8, padEnd))精确裁剪 - ClearChunkExtensionVf —— 清 [CeilAlign(rLen, 8), rUbFactorAlign) - 统一入口 ClearRPadVf,在每次拷贝后、归约前调用 配套把 DataCopyPadExtParams 由 (true, 0, rightPad, 0) 改为 (false, 0, 0, 0) —— 拷贝时不再补零,pad 区域由上述 VF 显式清零。 **正确性**:[rLen, CeilAlign(rLen, 8)) 这 ≤7 个元素本来就是 0 (拷贝后未经修改、且 |0|^p == 0),跳过不影响任何有效数据。 rowStride = rUbFactorAlign_ 由 tiling 保证是 bsElem 的整数倍 (fp32 的 bsElem=8、fp16/bf16 为 16),配合 FloorAlign 后起点恒为 32B 对齐。 --- ## 二、范式修订 | 类别 | 改动 | |---|---| | pad 策略 | 见上,isPad=false + 显式清零 | | 归约路径 | ReduceSumOnTmp0 → ReduceSumToCache(改用 ReduceSum 5 参重载,传入 sharedTmpBuffer);DoCaching 改为就地读本层累加源 | | VF 融合 | GeneralPowerVf 的 Abs→Ln→Muls→Exp 由 4 段 UB 往返合成为单个寄存器链;删除 LocalMemBar 与手动 PipeBarrier<PIPE_V> | | tiling 预算 | 删除硬编码 MAX_INNER_A_INIT = 512,改用 Ops::Base::GetCacheLineSize(ctx);UB 预算公式修正、删除 VL padding;删除冗余的 cacheBuf 容量校验(该约束由构造保证) | | 工程规范 | 补 ws[0] = Ops::Base::GetWorkspaceSize(ctx)(原写死 0);空 tensor 场景 SetBlockDim 非零保护 | | 命名 | CopyInChunk→DoCopyInTile、CopyOutFn→CopyOut、DoCachingVf→DoCaching、CalcAUbFactor→ComputeAUbFactor 等 10 处,对齐 reduction 范式命名 | --- ## 三、验证 环境:Ascend950DT_9584 / CANN 9.2.0 / TTK 2.8.0,串行 --pc 1,固定 --seed 20250922。 | | 修改前(原始代码) | 修改后 | |---|---|---| | 崩溃 | **7 / 18** | **0 / 18** | | PASS | 8 / 18 | **16 / 18** | | 日志中 507035 / ACLNN_EXECUTE_FAILED | 各 12 处 | **各 0 处** | | 原先通过用例的回退 | — | **0**(结果逐位不变)| 崩溃的 7 个用例中,5 个(L0_002/004/010/011/012)直接转为 PASS, 另 2 个(L0_013/L0_014)转为数值 FAIL。 **剩余 2 个 FAIL 经核实均非算子缺陷**: - L0_001:输出真值 ≈2.2e6 超出 fp16 上限,NPU 输出 inf, 与官方 golden 语义(result.astype(input_dtype) → inf)一致; FAIL 由比对时 golden 被升精度到 fp32 保留有限值引入,属判定口径问题。 - L0_003:输出量级 ≈2050,bf16 在该量级 ULP=16; NPU 输出 2048 **恰为 golden 的正确 bf16 舍入**,实测误差 2.745 等于理论最优值。判据的绝对硬上限为 1.0,该量级下任何 bf16 实现都无法满足。 --- ## 四、影响范围 所有走 ZeroRowTailVf 路径的调用,即 bisectionTail > 0 且 R 的最后一个 不满分块长度不是 8 的倍数。tiling 依赖的确定性问题,大 shape 下同样会触发。 --- ## 五、同步自 #11239(次正规数精度) bee940845…07a153425 这 5 笔来自 [PR #11239](https://gitcode.com/cann/ops-nn/merge_requests/11239), 现一并合入本 PR,本 PR 与 #11239 指向同一提交树。 ### 问题 |x|^p 与 (Σ|x|^p)^(1/p) 计算链用 Reg::Ln/Exp/Sqrt 默认档,dav_3510 上默认档会把 次正规输入/输出冲刷成 0。当 p>1 且 |x|^p 落次正规区(如 p=16、|x|<0.00426), 或输入本身是次正规数时,中间量被刷成 0,输出退化为 0 或 1.0。 CPU / ONNX / torch 的 fp32 均保留次正规到 2^-149。 ### 修复 改用 FTZ_FALSE 档(文件级常量 kLnFtzFalse / kExpFtzFalse / kSqrtFtzFalse): Pre/Post 的 Ln、Exp 用 PRECISION_1ULP_FTZ_FALSE,p=2 分支的 Sqrt 用 PRECISION_0ULP_FTZ_FALSE。数据通路指令与 tiling 不变。 **关键点**:Exp 必须非原地(dst != src)。FTZ_FALSE 档内部先 vexp(dst,src)、 再按 src 重算次正规 lane;原地调用会读到已被冲刷的 src,得 exp(0)² = 1.0。 > 注:本 PR 早期版本曾试过 PRECISION_1ULP_FTZ_FALSE 并因「实测净负面(PASS 13→12)」 > 回退,当时归因有误 —— 真正的失败原因就是原地调用,非该档本身不可用。 ### 性能 一般路径(p ∉ {1,2})Pre 链指令数增加,R 较大的 shape 实测 +35%~96%(中位约 +40%); p=1 / p=2 路径不受影响。正确性优先,未引入守卫式优化。 ### 附带 - tests/assets/golden.py:新增 __spec__(TTK TestSpec)、空归约返回 0、 p == 0 显式 ValueError、补 np.errstate - 仓库 README.md:删去「p 取值范围建议为正浮点数(p>0)」一句(与 kernel 不再校验 p 一致) --- ## 六、关于流程 本 PR 的修订部分涉及归约路径与 tiling 预算的调整,按 CONTRIBUTING.md 属「修改代码流程」范畴。如需先走 Issue 方案讨论,请告知,我可以拆分处理。 See merge request: cann/ops-nn!11081 | 30 days ago | |
feat(pooling): add GlobalLpPool operator Co-authored-by: weixin_51153241<fanjie43@huawei.com> # message auto-generated for no-merge-commit merge: !6398 merge feature/add-global-lp-pool into master feat(pooling): add GlobalLpPool operator Created-by: weixin_51153241 Commit-by: weixin_51153241 Merged-by: cann-robot Description: ## 算子说明 Global LP Pool — 计算输入张量空间维度的 Lp 范数: y = (sum(|x|^p))^(1/p), keepdims=True ## 支持规格 - 输入: 4D (NCHW) 或 5D (NCD0D1D2) - DTypes: FP32, FP16, BF16 - 属性: p (float, 默认 2.0) - 架构: ascend950/arch35 - 接口: aclnn_exclude (直调) ## 文件清单 (20 files) - op_kernel/ — VF 级 kernel 实现 (双缓冲 + 二分归约树 + |x|^p + (1/p) root) - op_host/ — Tiling (ubFactor, 多核切分, cacheBuf 约束, empty tensor 分支) - op_graph/ — Proto 定义 - tests/ — Tiling 单测 (5 用例: 4D/5D/大通道/空张量) - README.md — 算子说明 See merge request: cann/ops-nn!6398 | 4 months ago | |
fix(global_lp_pool): 修复 UB 对齐崩溃,并按 reduction 范式修订 kernel 与 tiling Co-authored-by: fanjie43<fanjie43@huawei.com> # message auto-generated for no-merge-commit merge: !11081 merge fix/global-lp-pool-ub-align-crash into master fix(global_lp_pool): 修复 UB 对齐崩溃,并按 reduction 范式修订 kernel 与 tiling Created-by: weixin_51153241 Commit-by: andong_hw;fanjie43 Merged-by: cann-robot Description: ## 关联 Issue Closes #6151 ## 提交 | 提交 | 内容 | 规模 | |---|---|---| | e2b130632 | 修复 UB 对齐崩溃,并按 reduction 范式修订 kernel 与 tiling | +340 −282 | | bee940845…07a153425(5 笔,同步自 #11239) | 次正规数精度修复(FTZ_FALSE 档)+ golden 适配 TTK TestSpec + 文档 | +81 −28 | | **合计** | | **+421 −310** | --- ## 一、崩溃修复 ### 问题 执行该算子自带的 18 个 ST 用例,**7 个崩溃**: L0_002 / L0_004 / L0_010 / L0_011 / L0_012 / L0_013 / L0_014。 设备侧报错: error code = 340 The address for VEC to access UB is not aligned. subErrType: 0x4 aclnn 路径表现为 507035 vector core exception + ACLNN_EXECUTE_FAILED。 ### 根因 ZeroRowTailVf() 用 Reg::StoreAlign 清零每个 tmpBuf 行的尾部,起点直接取 rLen: cpp int64_t tailStart = rLen; int32_t off = r * rowStride + tailStart + c * VF_VL_F32; Reg::StoreAlign<float>(base + off, vz, mask); StoreAlign 要求目标起始地址 **32B 对齐**,而 rLen(最后一个不满 R 分块的有效元素数) 不保证是 8 个 fp32(= 32B)的整数倍。函数原有注释「For large shapes (rLen typically 8-aligned), StoreAlign at offset rLen is 32B-aligned → safe」的论断不成立。 触发条件只依赖 tiling 量,**与输入数据无关**: bisectionTail > 0 && R % rUbFactor != 0 && (R % rUbFactor) % 8 != 0 因此不同随机种子、不同运行下崩溃集合恒定不变。以 L0_002 为例: rUb = 14840,R % rUb = 1972,1972 % 8 = 4 → 命中。 ### 修复 删除 ZeroRowTailVf,改用 reduction 范式的标准写法,把 R 方向的 pad 清零 拆成两个语义清晰的 VF: - ClearInnerBurstTailPadVf —— 清 [validR, CeilAlign(validR, bsInput)), 起点用 FloorAlign(validR, 8) 保证对齐,越界部分用 mask 三段 ([validR%8, padEnd))精确裁剪 - ClearChunkExtensionVf —— 清 [CeilAlign(rLen, 8), rUbFactorAlign) - 统一入口 ClearRPadVf,在每次拷贝后、归约前调用 配套把 DataCopyPadExtParams 由 (true, 0, rightPad, 0) 改为 (false, 0, 0, 0) —— 拷贝时不再补零,pad 区域由上述 VF 显式清零。 **正确性**:[rLen, CeilAlign(rLen, 8)) 这 ≤7 个元素本来就是 0 (拷贝后未经修改、且 |0|^p == 0),跳过不影响任何有效数据。 rowStride = rUbFactorAlign_ 由 tiling 保证是 bsElem 的整数倍 (fp32 的 bsElem=8、fp16/bf16 为 16),配合 FloorAlign 后起点恒为 32B 对齐。 --- ## 二、范式修订 | 类别 | 改动 | |---|---| | pad 策略 | 见上,isPad=false + 显式清零 | | 归约路径 | ReduceSumOnTmp0 → ReduceSumToCache(改用 ReduceSum 5 参重载,传入 sharedTmpBuffer);DoCaching 改为就地读本层累加源 | | VF 融合 | GeneralPowerVf 的 Abs→Ln→Muls→Exp 由 4 段 UB 往返合成为单个寄存器链;删除 LocalMemBar 与手动 PipeBarrier<PIPE_V> | | tiling 预算 | 删除硬编码 MAX_INNER_A_INIT = 512,改用 Ops::Base::GetCacheLineSize(ctx);UB 预算公式修正、删除 VL padding;删除冗余的 cacheBuf 容量校验(该约束由构造保证) | | 工程规范 | 补 ws[0] = Ops::Base::GetWorkspaceSize(ctx)(原写死 0);空 tensor 场景 SetBlockDim 非零保护 | | 命名 | CopyInChunk→DoCopyInTile、CopyOutFn→CopyOut、DoCachingVf→DoCaching、CalcAUbFactor→ComputeAUbFactor 等 10 处,对齐 reduction 范式命名 | --- ## 三、验证 环境:Ascend950DT_9584 / CANN 9.2.0 / TTK 2.8.0,串行 --pc 1,固定 --seed 20250922。 | | 修改前(原始代码) | 修改后 | |---|---|---| | 崩溃 | **7 / 18** | **0 / 18** | | PASS | 8 / 18 | **16 / 18** | | 日志中 507035 / ACLNN_EXECUTE_FAILED | 各 12 处 | **各 0 处** | | 原先通过用例的回退 | — | **0**(结果逐位不变)| 崩溃的 7 个用例中,5 个(L0_002/004/010/011/012)直接转为 PASS, 另 2 个(L0_013/L0_014)转为数值 FAIL。 **剩余 2 个 FAIL 经核实均非算子缺陷**: - L0_001:输出真值 ≈2.2e6 超出 fp16 上限,NPU 输出 inf, 与官方 golden 语义(result.astype(input_dtype) → inf)一致; FAIL 由比对时 golden 被升精度到 fp32 保留有限值引入,属判定口径问题。 - L0_003:输出量级 ≈2050,bf16 在该量级 ULP=16; NPU 输出 2048 **恰为 golden 的正确 bf16 舍入**,实测误差 2.745 等于理论最优值。判据的绝对硬上限为 1.0,该量级下任何 bf16 实现都无法满足。 --- ## 四、影响范围 所有走 ZeroRowTailVf 路径的调用,即 bisectionTail > 0 且 R 的最后一个 不满分块长度不是 8 的倍数。tiling 依赖的确定性问题,大 shape 下同样会触发。 --- ## 五、同步自 #11239(次正规数精度) bee940845…07a153425 这 5 笔来自 [PR #11239](https://gitcode.com/cann/ops-nn/merge_requests/11239), 现一并合入本 PR,本 PR 与 #11239 指向同一提交树。 ### 问题 |x|^p 与 (Σ|x|^p)^(1/p) 计算链用 Reg::Ln/Exp/Sqrt 默认档,dav_3510 上默认档会把 次正规输入/输出冲刷成 0。当 p>1 且 |x|^p 落次正规区(如 p=16、|x|<0.00426), 或输入本身是次正规数时,中间量被刷成 0,输出退化为 0 或 1.0。 CPU / ONNX / torch 的 fp32 均保留次正规到 2^-149。 ### 修复 改用 FTZ_FALSE 档(文件级常量 kLnFtzFalse / kExpFtzFalse / kSqrtFtzFalse): Pre/Post 的 Ln、Exp 用 PRECISION_1ULP_FTZ_FALSE,p=2 分支的 Sqrt 用 PRECISION_0ULP_FTZ_FALSE。数据通路指令与 tiling 不变。 **关键点**:Exp 必须非原地(dst != src)。FTZ_FALSE 档内部先 vexp(dst,src)、 再按 src 重算次正规 lane;原地调用会读到已被冲刷的 src,得 exp(0)² = 1.0。 > 注:本 PR 早期版本曾试过 PRECISION_1ULP_FTZ_FALSE 并因「实测净负面(PASS 13→12)」 > 回退,当时归因有误 —— 真正的失败原因就是原地调用,非该档本身不可用。 ### 性能 一般路径(p ∉ {1,2})Pre 链指令数增加,R 较大的 shape 实测 +35%~96%(中位约 +40%); p=1 / p=2 路径不受影响。正确性优先,未引入守卫式优化。 ### 附带 - tests/assets/golden.py:新增 __spec__(TTK TestSpec)、空归约返回 0、 p == 0 显式 ValueError、补 np.errstate - 仓库 README.md:删去「p 取值范围建议为正浮点数(p>0)」一句(与 kernel 不再校验 p 一致) --- ## 六、关于流程 本 PR 的修订部分涉及归约路径与 tiling 预算的调整,按 CONTRIBUTING.md 属「修改代码流程」范畴。如需先走 Issue 方案讨论,请告知,我可以拆分处理。 See merge request: cann/ops-nn!11081 | 30 days ago |
GlobalLpPool
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR&950DT系列产品 | √ |
| Atlas A3系列产品 | √ |
| Atlas A2系列产品 | √ |
| Atlas 200I/500 A2推理产品 | × |
| Atlas推理系列产品 | × |
| Atlas训练系列产品 | × |
功能说明
- 算子功能:对输入张量的空间维度进行全局Lp池化计算,公式为
y = (sum(|x|^p))^(1/p),保持空间维度为1(keepdims=True)。支持4D(NCHW)和5D(NCD0D1D2)输入。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 待进行global_lp_pool计算的输入张量,4D(NCHW)或5D(NCD0D1D2)。 | FLOAT、FLOAT16、BFLOAT16 | ND |
| p | 属性 | Lp范数的指数p。默认值为2.0(即L2范数)。 | FLOAT | - |
| y | 输出 | 全局Lp池化结果。空间维度归约为1,与输入x同dtype。 | FLOAT、FLOAT16、BFLOAT16 | ND |
约束说明
- 输入张量维度仅支持4D(NCHW)或5D(NCD0D1D2)。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| 图模式接口 | test_geir_global_lp_pool | 通过算子IR构图方式调用GlobalLpPool算子。 |