| Files | Last commit | Last update |
|---|---|---|
fix(AccumulateNV2): fp32累加引入Inf/NaN扩充实数分治与缩放域TwoSum补偿求和 Co-authored-by: gcw_YBIAEfqJ<wangweidong15@huawei.com> # message auto-generated for no-merge-commit merge: !7117 merge fix/accumulate-nv2-inf-twosum into master fix(AccumulateNV2): fp32累加引入Inf/NaN扩充实数分治与缩放域TwoSum补偿求和 Created-by: gcw_YBIAEfqJ Commit-by: gcw_YBIAEfqJ Merged-by: cann-robot Description: ## 问题背景 issue #2(AccumulateNV2 精度问题,https://gitcode.com/wangyueting/changwei_liuyi/issues/2)修复(PR !6584,TF 同构顺序求和)后,L1 功能精度套件仍存在一类**顺序固有歧义**失败: - 输入含**有限极值(±fp32max=3.4028235e38)**与 **±Inf** 的混合时,fp32 顺序求和的部分和先溢出为 ∓Inf,再与反号 Inf 相撞产生 NaN; - golden(cross_check Promote → TF fp64)与竞品(TF GPU,AddN 内部 fp64 累加)均给出数学确定值 ±Inf,NPU 成为三方中唯一 NaN 方 → cross_check FAIL。 - 实测失败用例(TTK,Ascend950PR + CANN 9.3.0,三方比对): AccumulateNV2_L1_174 / L1_275 / L1_bound_185 / L1_418(另有 L1_227 见已知限制)。 ## 修复方案(仅 fp32 SIMT 路径;fp16/int 路径不动) **1. Inf/NaN 扩充实数分治(ACCUMULATE_NV2_CLASSIFY_SPECIAL 宏)** - 整数位域检查(__float_as_uint;aicore 禁 double 运算、Vector 无 fp64 Add,故全程无 fp64 算术); - 语义:NaN sticky 主导;+Inf 与 −Inf 并存 → NaN;单侧 Inf 直接钉死输出(有限 + Inf = Inf,有限部分无论多大均不改变结果); - 被分类值置换为 0.0f 后进入累加 → 补偿链**只可能见到有限操作数**。issue #2 原缺陷(TwoSum 直接消费 Inf,Inf − Inf 污染 correction)的路径在本实现中结构性不可达。 **2. 有限值累加:x2⁻⁸ 缩放域 TwoSum 补偿链** - 缩放域保证 N ≤ 256 时最坏部分和(inputNum × fp32max × 2⁻⁸)不越 fp32 范围,TwoSum 的精确分解恒等式全程成立(无中间溢出破坏); - 输出 (sum + corr) × 2⁸:补偿值单次舍入 + 精确指数平移回,真和超 fp32 范围时自动 ±Inf; - 与 golden(TF fp64 顺序和折叠到输出 dtype)在边界用例上逐位一致; - 缩放因子为精确 2 的幂,N ≤ 256 为本方案硬安全边界(当前 MAX_INPUT_NUM=40,余量 6 倍)。 ## 验证结果 环境:Ascend950PR + CANN 9.3.0,TTK kernel 模式动态编译,cross_check L1(NPU vs TF CPU golden(fp64) vs TF GPU 竞品三方比对)。 | 验证项 | 结果 | |---|---| | Inf 碰撞用例 174 / 275 / bound_185 / 418 | FAIL → **4/4 PASS** | | issue #2 原始场景(全+Inf N=2/N=10、全−Inf、Inf+(−Inf) 混合、NaN 主导、有限溢出后遇 Inf、fp16 promote Inf) | **7/7 PASS** | | 普通 fp32 用例抽测(007/012/032) | PASS | ## 已知限制 L1_227(全有限 ±fp32max、和经正负抵消回到 fp32 范围内):NaN 已全部消除(原 9 → 0)、±Inf 位点与 golden 13901/13901 含符号一致、GPU 溢出位点上与 golden 逐位精确一致(1018/1018)、mare/mere/rmse 三比值达标(1.0/1.0001/0.868),仅**小值域误差计数比 25:12=2.08 超限 2.0**(差 1 个位点)。本质是 fp32 双分量(等效 ~48 位)与竞品内部 fp64(52 位)在「大数精确相消到零」位点上的硬件能力差:small_value_atol=2⁻³⁰ 绝对阈值要求 ~138 位精度,arch35 无 fp64 加法,属精度边界而非实现缺陷。建议后续在 TestSpec tolerance 为大数相消场景放宽 small_value_atol,或将此类用例定为 known limitation。 ## 设计取舍说明 issue #2 曾明确「放弃补偿、保持 TF 同构」以维持 cross_check 比值公平(NPU 与竞品误差同源)。本 PR 在**带 Inf/NaN 输入的边界场景**上放弃了该原则(golden/竞品在此类场景已非朴素 fp32 语义,NPU 对齐它们才可能通过三方判定);普通有限值场景 NPU 会比朴素顺序求和更接近 golden(比值变小,不引入 FAIL)。若 maintainers 坚持 TF 同构,可仅采纳第 1 部分(Inf/NaN 分治),第 2 部分可再议。 See merge request: cann/ops-math!7117 | 9 days ago | |
fix(AccumulateNV2): P1缺陷整改+broadcast收回+fp16性能优化+golden精度标准落位 Co-authored-by: gcw_YBIAEfqJ<wangweidong15@huawei.com> # message auto-generated for no-merge-commit merge: !6584 merge fix/accumulate-nv2-remediation into master fix(AccumulateNV2): P1缺陷整改+broadcast收回+fp16性能优化+golden精度标准落位 Created-by: gcw_YBIAEfqJ Commit-by: gcw_YBIAEfqJ Merged-by: cann-robot Description: ## 概述 AccumulateNV2 算子验证整改全量提交(15 个 commit,基于 cann/ops-math master 干净分支,不含其他算子改动)。 ## 修复内容 ### P1 功能缺陷 - **dtype 一致性校验**(7f5b5cd8b):图路径/aclnn 第一段/tiling 三层补齐 161002 校验 - **fp32 极值 NaN**(7f5b5cd8b→6cbebfe2e):守卫式 TwoSum → TF 竞品同构顺序求和(N≤9 顺序、N>9 余数优先 8 分块,复现 TF AddN 舍入) - **N 参数校验**(7f5b5cd8b):Host 侧 N==输入数一致性 - **broadcast 收回**(ebb6bdce3):算子本体同 shape 强校验;aclnnSum 接口层保留 BroadcastTo 对齐 ### 死代码清理(4e840cb20,-242 行) - TilingData 删 needBroadcast/rank/outputShape/inputStrides 四个死字段(2632B→32B) - SIMT 路径收敛为 float 专用;删 GetBroadcastInputOffset 与全部广播死分支 - 入口模板以 UT_SOC_VERSION 守护,修复 UT 构建回归(fbd2dd9f2 连带) ### 性能优化(MTE bound 归一化后 NPU 优 A100 1.68x) - fp16 SIMT 地址提升(c4ca3f64e,+3%) - **fp16 非广播路径切换 Vector 管线 half 累加**(502dd93b6):中位加速 7.60x,吞吐 203→1615GB/s(峰值 2140),67 例三方比对 67/67 PASS ### golden 精度标准(2b074c737、743c3606a) - fp16 分路径:kernel 直连=numpy 顺序 half 累加(Vector Add 链同构);aclnnSum=fp32 promote - TestSpec 落位 tolerance:浮点 cross_check L1 / 整数 binary_equal L2 - kernel 直连参考移除 broadcast 对齐块(同 shape 契约) ### 文档(5c09ec3d0、4976fa638、fbd2dd9f2、72e543b8a) - README/aclnnSum 7 项修正;-1/-2 动态维语义声明;文件命名规范;格式规范清理 ## 验证(Ascend950PR / CANN 9.3.0) - UT:op_kernel 10/10、op_host 20/20 - TTK:fp16 大 shape 67/67;混合 dtype 26/26(另 10 例 rank-0 挂已知 CANN 框架 bug 的 Dyn/Cst 编译,Binary 全 100%) - v4 全量扫描:kernel L1 150 例 Binary 对 golden 零精度失败 - 性能无回归(清理前后中位持平) ## 关联的Issue [3870](https://gitcode.com/cann/ops-math/issues/3870) ## 测试 已通过对应算子的构建、UT 与 TTK 精度验证。 ## 文档更新 包含相关 README / 接口文档更新。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!6584 | 20 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 9 days ago | ||
| 20 days ago |