| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
expint 算子开发 Co-authored-by: kangjiaming<1159380836@qq.com> # message auto-generated for no-merge-commit merge: !3864 merge expint into master expint 算子开发 Created-by: kangjiaming Commit-by: kangjiaming Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/2212 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3864 | 1 个月前 | |
[fix] 插件归位 Co-authored-by: nextyale<yaochen15@huawei.com> # message auto-generated for no-merge-commit merge: !4626 merge issue2302 into master [fix] 插件归位 Created-by: nextyale Commit-by: nextyale Merged-by: cann-robot Description: ## 描述 迁移算子插件到对应目录 ## 关联的Issue https://gitcode.com/cann/ops-math/issues/2302 ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述: 迁移插件 See merge request: cann/ops-math!4626 | 22 天前 | |
expint 算子开发 Co-authored-by: kangjiaming<1159380836@qq.com> # message auto-generated for no-merge-commit merge: !3864 merge expint into master expint 算子开发 Created-by: kangjiaming Commit-by: kangjiaming Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/2212 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3864 | 1 个月前 | |
fix expint bessel1e fill issue Co-authored-by: kangjiaming<1159380836@qq.com> # message auto-generated for no-merge-commit merge: !4439 merge feat/op-check-if-validation into master fix expint bessel1e fill issue Created-by: kangjiaming Commit-by: kangjiaming Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 描述 本 PR 为 bessel_i1e、expint、fill_diagonal_v2 三个算子的 Tiling(host 侧)代码统一补充 OP_CHECK_IF 输入合法性校验,修复异常输入无法在 Tiling 阶段提前拦截、报错信息不规范的问题。 修改前,上述算子在传入维数超过 8、不支持 dtype、dtype 不一致或输入输出 shape 不匹配时,不会在 Tiling 阶段失败,可能进入非法计算路径导致崩溃或结果错误,且报错信息缺少算子名/输入名/支持类型等可定位字段。 ### 改动内容 #### 1. conversion/fill_diagonal_v2/op_host/fill_diagonal_v2_tiling.cpp(+28) - 新增常量 MAX_DIM_NUM = 8。 - 在 Tiling4FillDiagonalV2 中新增校验: - x 维数 <= 8,否则 OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON 报错并返回 GRAPH_FAILED。 - x dtype 必须在支持列表 {DT_FLOAT16, DT_FLOAT, DT_DOUBLE, DT_UINT8, DT_BOOL, DT_INT8, DT_INT16, DT_INT32, DT_BF16, DT_INT64} 内,否则 OP_LOGE_WITH_INVALID_INPUT_DTYPE 报错。 - fill_value(输入 1)dtype 必须与 x dtype 一致,否则 OP_LOGE 报错。 #### 2. math/bessel_i1e/op_host/arch35/bessel_i1e_tiling_arch35.cpp(+12/-1) - 新增常量 MAX_DIM_NUM = 8。 - 在 GetShapeAttrsInfo 中新增 x 维数 <= 8 校验。 - 将原有 OP_LOGE(context, "invalid dtype") 替换为 OP_LOGE_WITH_INVALID_INPUT_DTYPE,报错包含算子名、输入名、实际 dtype 及支持列表 DT_FLOAT, DT_FLOAT16, DT_BFLOAT16。 #### 3. math/expint/op_host/arch35/expint_tiling_arch35.cpp(+19/-1) - 新增常量 MAX_DIM_NUM = 8。 - 在 GetShapeAttrsInfo 中新增校验: - x 维数 <= 8。 - 输入 x 与输出 y 的 shape size 一致,否则 OP_LOGE 报错。 - 将原有 OP_LOGE(context, "Expint: unsupported dtype=%d", ...) 替换为 OP_LOGE_WITH_INVALID_INPUT_DTYPE,报错包含算子名、输入名、实际 dtype 及支持列表 DT_FLOAT16, DT_FLOAT, DT_BFLOAT16。 #### 4. conversion/fill_diagonal_v2/tests/ut/op_host/test_fill_diagonal_v2_tiling.cpp(+34/-31) - 调整 UT 代码格式以通过 pre-commit 检查(test_fill_diagonal_v2_float 中第二个输入由 DT_FLOAT16 改为 DT_FLOAT,与新增加的 dtype 一致性校验保持一致;统一代码风格)。 ### 改动方法说明 统一采用 OP_CHECK_IF(condition, error_log, return_statement) 模式进行校验,配合规范化报错宏: - OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON:用于 shape 维数类错误,输出算子名、输入名、实际维数及原因。 - OP_LOGE_WITH_INVALID_INPUT_DTYPE:用于 dtype 类错误,输出算子名、输入名、实际 dtype 及支持列表。 - OP_LOGE:用于其他自定义校验(如 shape size 一致性、dtype 一致性)。 ## 关联的 Issue - 见 pr4439_issue.md:bessel_i1e / expint / fill_diagonal_v2 算子 Tiling 缺少输入校验。 ## 测试 - fill_diagonal_v2 UT:更新 test_fill_diagonal_v2_tiling.cpp,3 个用例(float / float_cube / float16)执行通过,校验新增的 dtype 一致性约束不破坏既有用例。 - CI:ci-pipeline-passed、api-check-passed 标签已通过。 - bessel_i1e、expint:本仓库无对应 UT 目录,通过二级冒烟/算子泛化验证。 ## 文档更新 无。本次仅修改 Tiling host 代码与 UT,不涉及对外接口或 README 变更。 ## 类型标签 - [x] Bug 修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: ## 提交记录 1. fix issue — 初始修复 2. revert: 只保留OP_CHECK_IF相关修改,恢复ASCENDC_TPL_SEL_PARAM等非OP_CHECK_IF改动 — 回退非 OP_CHECK_IF 改动,聚焦校验逻辑 3. feat: add OP_CHECK_IF validation for bessel_i1e/expint/fill_diagonal_v2 tiling — 主功能提交 4. fix: 修复 fill_diagonal_v2 tiling ut 代码格式以通过 pre-commit 检查 — 格式修复 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/2532 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4439 | 1 个月前 | |
fix expint bug Co-authored-by: kangjiaming<1159380836@qq.com> # message auto-generated for no-merge-commit merge: !4165 merge expint into master fix expint bug Created-by: kangjiaming Commit-by: kangjiaming Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 1. PR 概述 本 PR 修复了 expint(指数积分 Ei(x))算子在 Ascend950 上的多个计算正确性问题。 ## 2. PR 解决的问题 ### 2.1 exp(x) 浮点溢出 - **问题**:当输入 x 较大时, exp(x) 在 float32 下溢出为 inf,导致后续计算全部失效。 - **修复**:引入 EXP_CLAMP = 88.0f,将 x 钳位(clamp)到 88.0。因为 exp(88) ≈ 1.65e38 < FLT_MAX(3.4e38),而 exp(89) ≈ 4.49e38 > FLT_MAX,所以 88 是保证 exp(x) 不溢出的最大整数。 ### 2.2 对齐填充导致的除零 - **问题**:数据需按 64 元素对齐(CMP_ALIGN = 64),尾部不足部分填充 padding。padding 区域的值为未初始化内存,1/x 产生 inf/nan 污染结果。 - **修复**:新增 initBuf,在 CopyIn 中先将输入 buffer 预填充为 1.0f(保证 1/1.0 = 1.0 不产生 inf),再执行 DataCopyPad 覆盖有效区域。 ### 2.3 近零阈值判断不精确 - **问题**:原代码用 NEAR_ZERO_THRESHOLD = 1e-10f 通过 Abs(x) <= 1e-10 判断 x 是否为零,会将 1e-11 等小非零值误判为零并输出 -inf。 - **修复**:改为精确比较 x == 0.0f(CMPMODE::EQ),仅在 x 真正为零时返回 -inf。 ### 2.4 resultBuf 在 Ascend950 上的硬件兼容性问题 - **问题**:使用独立的 resultBuf 作为结果缓冲区在 Ascend950 上存在硬件问题。 - **修复**:直接使用 yLocal(输出队列张量)作为结果缓冲区,通过引用 LocalTensor<float>& result = yLocal 实现。 ### 2.5 FP16/BF16 Cast 溢出 - **问题**:float32 计算结果可能超出 FP16(max=65504)或 BF16(max≈3.39e38)的表示范围,直接 Cast 会产生 inf。 - **修复**:在 Cast 前增加钳位逻辑,将结果限制在目标 dtype 的最大可表示值以内。 ### 2.6 符号可见性 - **问题**:IMPL_OP_OPTILING(Expint) 未导出符号,可能导致动态链接时找不到算子注册。 - **修复**:添加 __attribute__((visibility("default")))。 ## 3. 代码检视发现的问题及修复 ### 3.1 魔鬼数字(Magic Numbers) | 位置 | 原始代码 | 修复 | |------|----------|------| | ProcessFp16Bf16 | 65504.0f | FP16_MAX_VALUE | | ProcessFp16Bf16 | 3.38953138927157e+38f | BF16_MAX_VALUE | | Compute (Interval 6) | 64.0f | INTERVAL_BOUND_64 | | Compute (Interval 5) | 32.0f | INTERVAL_BOUND_32 | | Compute (Interval 4) | 16.0f | INTERVAL_BOUND_16 | | Compute (Interval 3) | 8.0f | INTERVAL_BOUND_8 | | Compute (Interval 2) | 4.0f | INTERVAL_BOUND_4 | | Compute (Interval 1) | 2.0f | INTERVAL_BOUND_2 | 新增常量定义: - 文件级:FP16_MAX_VALUE、BF16_MAX_VALUE - 类内静态:INTERVAL_BOUND_2/4/8/16/32/64 ### 3.2 死代码(Dead Code) PR 将 ComputeRationalInterval、ComputeInterval1、ApplyBoundaries 三个函数的逻辑内联到 Compute 中,但未删除原函数定义和声明,导致 96 行死代码残留。 **修复**:删除三个函数的声明和定义。 ### 3.3 未使用的 resultBuf resultBuf 在 Compute 中已被 yLocal 引用替代,但成员变量声明和 InitBuffer 调用仍然保留,浪费 UB 内存。 **修复**: - 删除 resultBuf 成员变量 - 删除 pipe.InitBuffer(resultBuf, ...) 调用 - 将 tiling 文件中 BUFFER_NUM_FP16 从 10 更新为 9(减少一个 float buffer 计数) ### 3.4 initBuf 无条件分配 initBuf 仅在 T = float 路径使用(CopyIn 中的 if constexpr),FP16/BF16 路径不需要,但原先无条件分配。 **修复**:将 pipe.InitBuffer(initBuf, ...) 包裹在 if constexpr (std::is_same_v<T, float>) 中。 ### 3.5 变量作用域过大 CopyIn 中 alignedCount 在 if constexpr 块外声明,但仅在该块内使用。 **修复**:将 alignedCount 声明移入 if constexpr 块内。 ### 3.6 中文注释 PR 中新增了中文注释,与代码库英文注释风格不一致。 **修复**:将以下中文注释翻译为英文: - // EXP_CLAMP: 钳位 x 到 88.0f,防止 exp(x) 在 float32 下溢出 - // x == 0 → -inf (精确判断) - // 钳位 float32 结果到目标 dtype 范围,防止 Cast 溢出为 inf ### 3.7 声明与定义参数名不一致 Compute 函数声明中参数名为 xLocal,定义中为 xFp32,不一致。 **修复**:统一为 xFp32。 ## 4. 验证 ### 4.1 编译验证 bash bash build.sh --ops=expint --soc=ascend950 -j$(nproc) 结果:FP16、FP32、BF16 三种 dtype 的 kernel binary 全部编译成功。 ### 4.2 功能验证 bash bash build.sh --run_example expint graph --soc=ascend950 结果:在 Ascend950 NPU 上运行通过。 输入:4x4 全 2.0 的 float32 张量。 输出:全部为 4.954234,与 Ei(2) 的理论值 4.95423435600189 在 float32 精度下一致。 ## 5. 修改文件清单 | 文件 | 修改内容 | |------|----------| | math/expint/op_kernel/expint_kernel.h | 消除魔鬼数字、删除死代码、删除未使用的 resultBuf、initBuf 条件化、中文注释英文化、参数名统一 | | math/expint/op_host/arch35/expint_tiling_arch35.cpp | BUFFER_NUM_FP16 从 10 更新为 9 | 净减少 68 行代码。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/2383 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4165 | 1 个月前 | |
feat: 补充expint算子op_host infershape UT Co-authored-by: wangqi_ai<wangqi195@hisilicon.com> # message auto-generated for no-merge-commit merge: !4060 merge feat/ut_expint into master feat: 补充expint算子op_host infershape UT Created-by: wangqi_ai Commit-by: wangqi_ai Merged-by: cann-robot Description: ## 描述 补充expint算子的op_host infershape级别单元测试,覆盖以下场景: - 各数据类型测试 - 不同维度测试 - 异常场景测试:nullptr输入输出、shape不匹配等 ## 关联的Issue #2465 ## 测试 - 编译验证:bash build.sh -u --soc=ascend950 --ops=expint --noexec 编译通过 ## 文档更新 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:UT补充 **关联 Issue:** #2465 See merge request: cann/ops-math!4060 | 1 个月前 | |
expint 算子开发 Co-authored-by: kangjiaming<1159380836@qq.com> # message auto-generated for no-merge-commit merge: !3864 merge expint into master expint 算子开发 Created-by: kangjiaming Commit-by: kangjiaming Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/2212 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3864 | 1 个月前 | |
expint 算子开发 Co-authored-by: kangjiaming<1159380836@qq.com> # message auto-generated for no-merge-commit merge: !3864 merge expint into master expint 算子开发 Created-by: kangjiaming Commit-by: kangjiaming Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> https://gitcode.com/cann/ops-math/issues/2212 <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!3864 | 1 个月前 |
Expint
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | × |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | √ |
| Atlas 训练系列产品 | √ |
功能说明
-
算子功能:计算指数积分 Ei(x) = PV ∫_{-∞}^{x} (eᵗ/t) dt(柯西主值积分)。
-
计算公式:
Ei(x)=PV∫−∞xettdtEi(x) = PV \int_{-\infty}^{x} \frac{e^{t}}{t} \mathrm{d}t Ei(x)=PV∫−∞xtetdt
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 待进行指数积分计算的入参,公式中的x。 | BFLOAT16、FLOAT16、FLOAT | ND |
| y | 输出 | 指数积分计算的出参,公式中的Ei(x)。 | BFLOAT16、FLOAT16、FLOAT | ND |
约束说明
- 不支持DOUBLE(FP64)数据类型。
- 输入 x < 0 时输出为 NaN,x = 0 时输出为 -inf,x = +inf 时输出为 +inf。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_expint | 通过图模式调用Expint算子。 |