| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat(frame): 加入混合容差精度测试 Co-authored-by: Twoliges<202383290096@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !283 merge feat/new-test-standard into master feat(frame): 加入混合容差精度测试 Created-by: Twoliges Commit-by: Twoliges Merged-by: cann-robot Description: ## 描述 对齐生态算子开源精度标准 ( opbase/docs/zh/ops_precision_standard/experimental_standard.md),在精度验证框架中新增 MIXED_TOLERANCE 策略,落地新标准的逐元素混合容差 + 通过率 + 绝对误差硬上限方案。 ### 核心公式(experimental_standard.md § 2.1) - **每元素通过条件**:|actual - golden| ≤ atol + rtol × |golden| - **每元素硬上限**:|actual - golden| ≤ max(fixedLimit, 32 × ULP_at_|golden|) - **整体通过条件**:matched_ratio ≥ 0.99,且所有元素都独立通过硬上限 每个元素独立计算自己的 ULP 和 max(fixedLimit, 32·ULP),而非用全局最大 ULP 作为统一限。 ### 特殊值处理 - NaN==NaN / INF==INF ← 由基类 PrecisionStrategy::shouldSkip 拦截,**计入总数,算 pass** - 其余含特殊值的对(如 INF vs 5.0, NaN vs 1.0, +INF vs -INF)← **直接 fail**,不进入公式计算(避免 INF-INF, NaN×rtol 等未定义行为) - 标量路径 verifyScalar 与向量路径 processElement 行为完全一致(同样有 isnan||isinf 守卫) ### test/frame/types.h 改动 - PrecisionMode 枚举新增 MIXED_TOLERANCE - VerifyConfig.mode 默认值由 PrecisionMode::ABS 改为 PrecisionMode::MIXED_TOLERANCE - 新增 6 个字段:mixedAtol、mixedRtol、mixedRequiredMatchedRatio、mixedMaxAbsErrorLimit、mixedMantissaBits、mixedEmin ### test/frame/verify.h 改动 **新增 MixedToleranceStrategy 类**(verify.h:312): - 构造签名:(absTol, relTol, reqRatio, fixedLimit, mantissaBits, emin) - processElement 内:每元素独立 tolLimit = atol + rtol·|g|,独立 ulpLimit = max(fixedLimit, 32·ULP_at_|g|) - reportResult:pass = (matchedRatio ≥ reqRatio) AND !maxAbsErrorLimitFailed **扩展 Verifier 类**: - createStrategy switch 新增 MIXED_TOLERANCE 分支 - verifyScalar 新增 MIXED_TOLERANCE 分支,含 isnan||isinf 守卫 + 双闸(diff ≤ tolLimit AND diff ≤ maxAbsErrorLimit) **新增辅助函数**(按调用方所需暴露): | 函数 | 说明 | |---|---| | getMantissaBits(aclDataType) | 按 dtype 返回 mantissa 位数 | | getEmin(aclDataType) | 按 dtype 返回 IEEE 754 定义的 EMIN(各 dtype 各异,非恒为 -14) | | getUlpsAt(magnitude, mantissaBits, emin) | 2^(floor(log2\|x\|)-m),x=0 用正确 EMIN | | getMixedToleranceDefaults(aclDataType) | 返回 rtol/atol/fixed/m/emin 五元组 | | applyMixedTolerance(cfg, dtype, float*, size_t) | **向量场景**:填配置 + 按最大有限 golden 算 32·ULP limit | | applyMixedTolerance(cfg, dtype, float) | **标量场景 overload**:填配置 + 按单个 golden 算 32·ULP limit | ### 阈值表(experimental_standard.md § 2.2) | dtype | rtol | atol | fixed limit | mantissa bits | EMIN | |---|---|---|---|---|---| | FP16 | 2^-9 (1.95e-3) | 2^-9 (1.95e-3) | 1e-1 | 10 | -14 | | BF16 | 2^-6 (1.56e-2) | 2^-6 (1.56e-2) | 1e-0 | 7 | -126 | | FP32 | 2^-10 (9.77e-4) | 2^-16 (1.53e-5) | 1e-2 | 23 | -126 | | FP8_E4M3FN | 2^-2 (0.25) | 2^-4 (0.0625) | 1e-0 | 3 | -6 | | FP8_E5M2 | 2^-1 (0.5) | 2^-3 (0.125) | 1e-1 | 2 | -14 | ### 使用方法 **向量场景**: cpp VerifyConfig cfg; applyMixedTolerance(cfg, ACL_BF16, goldenPtr, count); // 一行填配置 EXPECT_TRUE(Verifier::verifyVector(actualPtr, goldenPtr, count, stride, cfg, caseId)); **标量场景**: cpp VerifyConfig cfg; applyMixedTolerance(cfg, ACL_FLOAT16, goldenVal); // 单参数 overload EXPECT_TRUE(Verifier::verifyScalar(actualVal, goldenVal, cfg, caseId)); 两个 overload 的签名对 caller 完全无感:内部自动处理 mantissaBits / emin / per-element ULP 等细节。 ### 兼容性 - 旧策略(MERE_MARE / ABS / REL / COMBINED / EXACT / INTEGER)及旧辅助函数(getMereThreshold / getMareMultiplier)全部保留 - 显式写 cfg.mode = PrecisionMode::MERE_MARE 的旧调用不受影响 - VerifyConfig 默认 mode 改为 MIXED_TOLERANCE,未显式设置 mode 的旧调用会自动走新模式(需 review) ## 关联的Issue https://gitcode.com/cann/ops-blas/issues/312 ## 文档更新 本次 PR 未修改文档文件。test/frame/types.h 与 test/frame/verify.h 中的新增枚举值、字段、函数已通过代码注释说明。存量文档(docs/zh/develop/st_develop_guide.md、agent/skills/blas-ST-develop/SKILL.md、仓库根 README.md)的同步更新在未来进一步实现。 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!283 | 2 个月前 | |
Feat: 新增面向arch35的aclblasRotEx接口 Co-authored-by: Twoliges<202383290096@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !216 merge aclblasRotEx into master Feat: 新增面向arch35的aclblasRotEx接口 Created-by: Twoliges Commit-by: Twoliges Merged-by: cann-robot Description: ## 描述 ### 概述 新增 aclblasRotEx 算子(Givens Rotation Extended),面向 Ascend950(arch35, DAV_3510)实现。该算子对向量 x 和 y 中对应位置的元素对应用 Givens 旋转: x[k] = c * x[k] + s * y[j] y[j] = -s * x[k] + c * y[j] 支持 executionType=FP32,x/y/cs 为 FP32 / FP16 / BF16。 ### Tiling 策略 - **SIMD 路径**(连续步长):模分发负载均衡多核切分,TPipe/TQue 4 队列流水线,纯 FP32 用 Muls+Axpy 直接计算,混合精度用 Cast -> midBuf(4 x float)-> 计算 -> Cast 回写 - **SIMT 路径**(离散步长):grid-stride loop,signed incx/incy 联合 kx/ky 完成正反向寻址,decltype 自动推导计算精度类型 ### Kernel 结构 - rotex_kernel 入口内根据 TilingKey 运行时分支:Key0=SIMD S 组,Key2=SIMT 路径 - SimdKernelS:三段式流水线(CopyIn -> Compute -> CopyOut),原始 x 值通过 FreeTensor 时序保护 - SimtKernel:通用模板,直接 GM 指针按 stride 访问 ### 参数校验 完整参数校验覆盖:handle/n/x/y/c/s/incx/incy 空指针和非法值、executionType 和数据类型组合 NOT_SUPPORTED 判定。 ## 关联的Issue 关联 Issue 将在此 PR 创建前同步创建。 ## 测试 - **ST 测试通过率**: 100%(49 测试全部通过,位精确) - **测试构成**: 1 TEST_F(NullHandle)+ 48 CSV 驱动用例 - **覆盖场景**: FP32/BF16/FP16 混合精度、正负 stride、单元/非单元步长、边界 n=0/1、大 shape n=1048576、特殊旋转角度(恒等/全旋转/符号翻转/零旋转)、非 2 次幂/质数 n、异常输入(nullptr/非法 incx/incy/不支持数据类型)、xType!=yType NOT_SUPPORTED ### 性能数据 | 路径 | 场景 | 大 shape 耗时 | 带宽 | |------|------|--------------|------| | SIMD FP32 连续 | incx=1, incy=1, n=1048576 | 59.37 us | 263.20 GB/s | | SIMD FP16 混合精度 | incx=1, incy=1, n=1048576 | 69.95 us | 111.68 GB/s | | SIMT 离散 | incx=2, incy=3, n=1048576 | 21.46 us | 728.27 GB/s | ## 文档更新 - blas/rotex/README.md — 算子 README(接口说明、参数说明、调用示例、编译运行步骤) - include/cann_ops_blas.h — 新增 aclblasRotEx API 声明 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!216 | 3 个月前 | |
Feat: 新增面向arch35的aclblasRotEx接口 Co-authored-by: Twoliges<202383290096@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !216 merge aclblasRotEx into master Feat: 新增面向arch35的aclblasRotEx接口 Created-by: Twoliges Commit-by: Twoliges Merged-by: cann-robot Description: ## 描述 ### 概述 新增 aclblasRotEx 算子(Givens Rotation Extended),面向 Ascend950(arch35, DAV_3510)实现。该算子对向量 x 和 y 中对应位置的元素对应用 Givens 旋转: x[k] = c * x[k] + s * y[j] y[j] = -s * x[k] + c * y[j] 支持 executionType=FP32,x/y/cs 为 FP32 / FP16 / BF16。 ### Tiling 策略 - **SIMD 路径**(连续步长):模分发负载均衡多核切分,TPipe/TQue 4 队列流水线,纯 FP32 用 Muls+Axpy 直接计算,混合精度用 Cast -> midBuf(4 x float)-> 计算 -> Cast 回写 - **SIMT 路径**(离散步长):grid-stride loop,signed incx/incy 联合 kx/ky 完成正反向寻址,decltype 自动推导计算精度类型 ### Kernel 结构 - rotex_kernel 入口内根据 TilingKey 运行时分支:Key0=SIMD S 组,Key2=SIMT 路径 - SimdKernelS:三段式流水线(CopyIn -> Compute -> CopyOut),原始 x 值通过 FreeTensor 时序保护 - SimtKernel:通用模板,直接 GM 指针按 stride 访问 ### 参数校验 完整参数校验覆盖:handle/n/x/y/c/s/incx/incy 空指针和非法值、executionType 和数据类型组合 NOT_SUPPORTED 判定。 ## 关联的Issue 关联 Issue 将在此 PR 创建前同步创建。 ## 测试 - **ST 测试通过率**: 100%(49 测试全部通过,位精确) - **测试构成**: 1 TEST_F(NullHandle)+ 48 CSV 驱动用例 - **覆盖场景**: FP32/BF16/FP16 混合精度、正负 stride、单元/非单元步长、边界 n=0/1、大 shape n=1048576、特殊旋转角度(恒等/全旋转/符号翻转/零旋转)、非 2 次幂/质数 n、异常输入(nullptr/非法 incx/incy/不支持数据类型)、xType!=yType NOT_SUPPORTED ### 性能数据 | 路径 | 场景 | 大 shape 耗时 | 带宽 | |------|------|--------------|------| | SIMD FP32 连续 | incx=1, incy=1, n=1048576 | 59.37 us | 263.20 GB/s | | SIMD FP16 混合精度 | incx=1, incy=1, n=1048576 | 69.95 us | 111.68 GB/s | | SIMT 离散 | incx=2, incy=3, n=1048576 | 21.46 us | 728.27 GB/s | ## 文档更新 - blas/rotex/README.md — 算子 README(接口说明、参数说明、调用示例、编译运行步骤) - include/cann_ops_blas.h — 新增 aclblasRotEx API 声明 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!216 | 3 个月前 | |
Feat: 新增面向arch35的aclblasRotEx接口 Co-authored-by: Twoliges<202383290096@nuist.edu.cn> # message auto-generated for no-merge-commit merge: !216 merge aclblasRotEx into master Feat: 新增面向arch35的aclblasRotEx接口 Created-by: Twoliges Commit-by: Twoliges Merged-by: cann-robot Description: ## 描述 ### 概述 新增 aclblasRotEx 算子(Givens Rotation Extended),面向 Ascend950(arch35, DAV_3510)实现。该算子对向量 x 和 y 中对应位置的元素对应用 Givens 旋转: x[k] = c * x[k] + s * y[j] y[j] = -s * x[k] + c * y[j] 支持 executionType=FP32,x/y/cs 为 FP32 / FP16 / BF16。 ### Tiling 策略 - **SIMD 路径**(连续步长):模分发负载均衡多核切分,TPipe/TQue 4 队列流水线,纯 FP32 用 Muls+Axpy 直接计算,混合精度用 Cast -> midBuf(4 x float)-> 计算 -> Cast 回写 - **SIMT 路径**(离散步长):grid-stride loop,signed incx/incy 联合 kx/ky 完成正反向寻址,decltype 自动推导计算精度类型 ### Kernel 结构 - rotex_kernel 入口内根据 TilingKey 运行时分支:Key0=SIMD S 组,Key2=SIMT 路径 - SimdKernelS:三段式流水线(CopyIn -> Compute -> CopyOut),原始 x 值通过 FreeTensor 时序保护 - SimtKernel:通用模板,直接 GM 指针按 stride 访问 ### 参数校验 完整参数校验覆盖:handle/n/x/y/c/s/incx/incy 空指针和非法值、executionType 和数据类型组合 NOT_SUPPORTED 判定。 ## 关联的Issue 关联 Issue 将在此 PR 创建前同步创建。 ## 测试 - **ST 测试通过率**: 100%(49 测试全部通过,位精确) - **测试构成**: 1 TEST_F(NullHandle)+ 48 CSV 驱动用例 - **覆盖场景**: FP32/BF16/FP16 混合精度、正负 stride、单元/非单元步长、边界 n=0/1、大 shape n=1048576、特殊旋转角度(恒等/全旋转/符号翻转/零旋转)、非 2 次幂/质数 n、异常输入(nullptr/非法 incx/incy/不支持数据类型)、xType!=yType NOT_SUPPORTED ### 性能数据 | 路径 | 场景 | 大 shape 耗时 | 带宽 | |------|------|--------------|------| | SIMD FP32 连续 | incx=1, incy=1, n=1048576 | 59.37 us | 263.20 GB/s | | SIMD FP16 混合精度 | incx=1, incy=1, n=1048576 | 69.95 us | 111.68 GB/s | | SIMT 离散 | incx=2, incy=3, n=1048576 | 21.46 us | 728.27 GB/s | ## 文档更新 - blas/rotex/README.md — 算子 README(接口说明、参数说明、调用示例、编译运行步骤) - include/cann_ops_blas.h — 新增 aclblasRotEx API 声明 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-blas!216 | 3 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 2 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 |