| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: TensorRedirect README 补充 GEIR 调用示例 (fixes #2503) Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !4442 merge tensor-redirect-geir-example into master fix: TensorRedirect README 补充 GEIR 调用示例 (fixes #2503) Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 修改说明 修复 Issue #2503:TensorRedirect README 调用说明缺少 GEIR 调用 cpp 示例。 ### 变更内容 1. 新增 conversion/tensor_redirect/examples/test_geir_tensor_redirect.cpp — GEIR 图模式调用示例,展示通过 GE API 创建包含 TensorRedirect 单算子的计算图、初始化环境、构建会话并执行图推理的完整流程 2. 更新 conversion/tensor_redirect/README.md 调用说明表格,补充示例文件链接 ### gitcode-bot 审查意见修复 - P1: GenOnesData 缓冲区从 int32_t* 改为 uint8_t* 按字节分配,按 dtype 分别填充,修复 8 字节类型未初始化内存读取 - P2: GenOnesData 添加 nullptr 检查,修复空指针崩溃 - P2: GenOnesData 添加 delete[] pData,修复内存泄漏 - P2: WriteDataToFile 添加 fopen nullptr 检查 + fwrite 返回值检查 ### 关联Issue Fixes #2503 See merge request: cann/ops-math!4442 | 7 天前 | |
fix: TensorRedirect 交付件规范对齐(issue #4553),并删除 AddV2 不可达的混合 dtype 组合 Co-authored-by: raoliang_sac<raoliang4@huawei.com> Co-authored-by: Claude<noreply@anthropic.com> # message auto-generated for no-merge-commit merge: !4505 merge fix/review-and-issue-4553 into master fix: TensorRedirect 交付件规范对齐(issue #4553),并删除 AddV2 不可达的混合 dtype 组合 Created-by: raoliang_sac Commit-by: raoliang_sac;Claude Merged-by: cann-robot Description: ## 描述 本 PR 包含三部分改动,均针对 conversion/tensor_redirect 与 math/add_v2 两个新增算子。 ### 一、TensorRedirect 对齐 issue #4553 的两条交付件规范 issue 提出两条要求,TensorRedirect **两条都不满足**: 1. **InferDataType 须交付在 op_graph 目录**(仅图场景使用);InferShape 图与算子双用,保留在 op_host。 - 原实现把 InferDataType4TensorRedirect 和 InferShape 一起注册在 op_host/tensor_redirect_infershape.cpp。 - 现新增 op_graph/tensor_redirect_graph_infer.cpp 承载 InferDataType,op_host 只保留 IMPL_OP_INFERSHAPE(TensorRedirect).InferShape(...)。 - 顺带修复:InferDataType 原先丢弃 SetOutputDataType 返回值无条件返回 SUCCESS,现改为透传。 2. **原型从 legacy 挪出后须补防重定义宏**。 - canndev ops/built-in/op_proto/inc/ops_proto_legacy.h:13857 确实存在 REG_OP(TensorRedirect),且已用 OPS_PROTO_DEF_TENSORREDIRECT 包裹;本仓 op_graph/tensor_redirect_proto.h 无守卫。 - 已实测:构造同时包含两份定义的 TU,加守卫前报 error: redefinition of 'class ge::op::TensorRedirect',加守卫后编译通过。 - 现补同名守卫 OPS_PROTO_DEF_TENSORREDIRECT,与 legacy 侧配对。 > AddV2 这两条**本来就满足**,未作改动:InferDataType 一直在 op_graph/add_v2_graph_infer.cpp;AddV2 不在 ops_proto_legacy.h 中(仅在 elewise_calculation_ops.h),按 issue 条件不需要加守卫。 **两个算子的 REG_OP 均未改动**,与 canndev 保持逐字符一致(忽略空白后比对:AddV2 vs elewise_calculation_ops.h:1390;TensorRedirect vs elewise_calculation_ops.h:3779 及 ops_proto_legacy.h:13857)。 ### 二、代码检视报告问题修复 | 级别 | 问题 | 修复 | |---|---|---| | P1 | TensorRedirect Tiling 不拒绝负维与 shape 乘积溢出,负 numel 可穿透到 DoTiling 产生 usedCoreNum == 0 / SetBlockDim(0) | 逐维拒绝 < 0;GetShapeSize() 后拦截溢出哨兵 kInvalidDimValue,且置于 numel == 0 判断之前 | | P1 | TensorRedirect PrecisionReduceFlag(true) 与 bit-exact 语义冲突:allow_mix_precision 下允许把 FP32 节点降为 FP16,破坏 README 声明的逐 bit 相等(含负零 / NaN payload / 非规格化数) | 改为 PrecisionReduceFlag(false) | | P1 | AddV2 注册的 4 个混合 dtype 组合在 GE 图通路上不可达 | 删除,详见下 | | P2 | 文档与实现不一致 | docs/zh/op_list.md 删除 add_v2 已不存在的 bool logical_or 声明;README 删除混合精度组合表 | **关于 AddV2 的 4 个混合 dtype 组合(FP16+FP32、FP32+FP16、BF16+FP32、FP32+BF16):** canonical AddV2 契约要求 x1/x2 同 dtype —— canndev ops/built-in/op_proto/elewise_calculation_ops.cc:475 的 AddV2Verify 调用 CheckTwoInputDtypeSame,原型注释也写明 x2: A tensor of the same dtype as "x1"。既然本仓 REG_OP 与 canndev 保持一致,OpDef 里注册异类型组合就与自身原型契约矛盾。 已实测复现:FP16+FP32 离线构图被 Verifier 拒绝(The AddV2_0 op dtype is not same, type1:DT_FLOAT16, type2:DT_FLOAT),FP16+FP16 对照组构图成功。本算子无 ACLNN,因此这 4 个已编译 binary 对公开调用方实际不可达。 删除范围(REG_OP 不动): - add_v2_def.cpp:x1/x2/y 的 DataType 列表 13 → 9 组同 dtype,ADD_V2_FORMAT_LIST 同步收缩 - add_v2_binary.json:删除 4 个混合 binary,13 → 9 - add_v2_graph_infer.cpp:删除 34×34 类型提升表,InferDataType 改为 y 与 x1 同 dtype,并显式拒绝异类型输入 - add_v2_tiling_arch35.cpp:IsMixedDtype 与 4 个混合分支改为 CheckDtype 前置校验 - add_v2.cpp / add_v2_dag.h:删除 isMixDtype 分支与 AddMixDtypeCompute 模板 - tests/assets/golden.py:删除已不注册的 bool logical_or 死分支;对异类型输入直接抛错,避免静默按 x1.dtype 生成错误标杆 ### 三、AddV2 支持空 Tensor 上板回归时补的空张量用例暴露出一个既有能力缺口:**AddV2 对 numel == 0 的输入一律 OPTILING_FAILURE**,9 种 dtype × 4 种空场景 36/36 全挂。根因是 ATVOSS 的 BroadcastBaseTiling 在合轴之后显式拒绝 0 元素(broadcast_tiling.h 的 "tensor check is empty, check failed"),空 Tensor 根本落不到 DoTiling。 > 对比:同批提交的 TensorRedirect 本来就支持(Tiling 里有 HandleEmptyTensor 早返回,README 也声明了"支持空Tensor")。AddV2 此前既没实现也没声明。 按 math/select 的既有惯例另开一条自定义模板分支承接: - add_v2_struct_arch35.h:新增 userDef 模板键(0 常规 / 1 空 Tensor),空分支复用 BRC_TEMP_SCH_CUSTOM_MODE_KEY_SEL 的 schMode 999;并补 AddV2EmptyTilingData —— opc 靠 kernel 里的 GET_TILING_DATA_WITH_STRUCT 反推每个模板实例的 tiling 结构体大小,自定义分支不引用任何结构体会导致编译期 tiling_struct_size 未定义。 - add_v2.cpp:kernel 增加 userDef 模板参数,userDef == 1 时直接返回。 - add_v2_tiling_arch35.cpp:抽出 SetWorkspace(),新增 HandleEmptyTensor();按输出 y 的元素数判空,blockDim = 1、tilingKey 走自定义分支。判空**之前**先拦截 GetShapeSize() 的溢出哨兵(负值),否则负的 numel 会被当成非空穿透到 DoTiling。 - 常规通路的 tilingKey 统一补 userDef = 0,编码后取值不变(仍为 8),原有 UT 的 expectTilingKey 无需调整。 ## 关联的Issue - https://gitcode.com/cann/ops-nn/issues/4553 —— INTrainingReduceV2 / NormalizeBBox / SGD 原型重定义与 inferdatatype 放置问题(本 PR 按同一规范修正 ops-math 侧的 TensorRedirect) ## 测试 ### 单元测试 - ./build.sh -u --ophost --soc=ascend950 --ops=add_v2:**22/22 通过**(10 条 tiling,含新增 4 条空 Tensor;12 条 infershape)。 - op_host 全量 UT 75/75 通过(前两个 commit 时验证)。 ### 上板回归(Ascend950PR,TTK kernel 模式) 全部以 --binary-only(-d=false -b=release)+ --pc=1 串行执行,**只采信 BIN_* 列**(bin_compile_s = BINARY_MATCH 才算真正匹配到部署的 .o,而非 JIT 现编兜底)。 | 算子 | 用例数 | BINARY_MATCH | 精度通过率 | |---|---:|---:|---:| | AddV2 | 1735 | 1735 | **100.00%** | | TensorRedirect | 900 | 900 | **100.00%** | | **合计** | **2635** | **2635** | **100.00%** | 其中 36 条空 Tensor 用例全部 BINARY_MATCH + 100%,tiling_key = 65550 (0x1000e)、block_dim = 1,确认走的是新增的自定义分支(改动前为 36/36 INVALID_TILING)。 ### 负向对照 add_v2_removed_mixed_dtype.csv 12 条(已删除的 4 组混合 dtype)如期 **全部 BINARY_MATCH_FAILURE**。历史交付件里这 4 组是 BINARY_MATCH + 100% PASS —— 前后翻转,可作为"部署的确实是本 PR 代码"的直接证据。 ### 编译 - ./build.sh --pkg --soc=ascend950 --ops=add_v2,tensor_redirect:AddV2 产出 **9** 个 binary(原 13),TensorRedirect **4** 个,无残留混合 dtype binary。 - 原型防重定义:构造同时包含 legacy 与本仓两份 REG_OP(TensorRedirect) 的 TU,加守卫前编译失败、加守卫后通过。 ### 需要评审者注意的测试局限(如实说明) 1. 本 PR 为 TensorRedirect 新增的 4 个负维 / 溢出 UT,**在打补丁前也是通过的** —— 当前 UT faker 构造这类 context 时本就返回 GRAPH_FAILED(并非因为走到了新增的显式校验)。这些用例锁定了契约,但**不能证明新增守卫本身生效**;真实 GE 通路的行为需由 GEIR 测试覆盖。 2. 两个算子的 InferDataType **均无单元覆盖** —— 仓内 UT harness 只有 InferShape executor,没有 InferDataType 的对应设施,本 PR 未为此新造 harness。AddV2 新增的"x1/x2 异类型返回 GRAPH_FAILED"这条也因此未被测到。 3. TensorRedirect 的 900 条回归是在**前一版**代码上跑的,本次 AddV2 改动后未复跑。依据:conversion/tensor_redirect 源码相对该版本零改动,且重新编译产出的 4 个 binary 配置 json 与已部署版本**逐字段一致**(仅豁免随构建变化的 sha256;.o 本身构建不可复现,MD5 不具可比性)。 4. 性能仅有 TTK 采集的 cycle 数,未做三方对标。 ## 文档更新 - math/add_v2/README.md:删除混合精度组合表;x2/y 描述改为"与 x1 一致";约束说明补充"输入 x1 和 x2 的数据类型需相同" - docs/zh/op_list.md:删除 add_v2 条目中已不存在的"bool 输入按 logical_or 处理";描述补充"支持空Tensor" - math/add_v2/README.md:约束说明补充"支持空Tensor。当输出y的元素个数为0时,算子不下发有效计算,直接返回成功。" ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:交付件目录规范对齐(issue #4553)、删除不可达的 dtype 注册组合 See merge request: cann/ops-math!4505 | 3 天前 | |
fix: TensorRedirect 交付件规范对齐(issue #4553),并删除 AddV2 不可达的混合 dtype 组合 Co-authored-by: raoliang_sac<raoliang4@huawei.com> Co-authored-by: Claude<noreply@anthropic.com> # message auto-generated for no-merge-commit merge: !4505 merge fix/review-and-issue-4553 into master fix: TensorRedirect 交付件规范对齐(issue #4553),并删除 AddV2 不可达的混合 dtype 组合 Created-by: raoliang_sac Commit-by: raoliang_sac;Claude Merged-by: cann-robot Description: ## 描述 本 PR 包含三部分改动,均针对 conversion/tensor_redirect 与 math/add_v2 两个新增算子。 ### 一、TensorRedirect 对齐 issue #4553 的两条交付件规范 issue 提出两条要求,TensorRedirect **两条都不满足**: 1. **InferDataType 须交付在 op_graph 目录**(仅图场景使用);InferShape 图与算子双用,保留在 op_host。 - 原实现把 InferDataType4TensorRedirect 和 InferShape 一起注册在 op_host/tensor_redirect_infershape.cpp。 - 现新增 op_graph/tensor_redirect_graph_infer.cpp 承载 InferDataType,op_host 只保留 IMPL_OP_INFERSHAPE(TensorRedirect).InferShape(...)。 - 顺带修复:InferDataType 原先丢弃 SetOutputDataType 返回值无条件返回 SUCCESS,现改为透传。 2. **原型从 legacy 挪出后须补防重定义宏**。 - canndev ops/built-in/op_proto/inc/ops_proto_legacy.h:13857 确实存在 REG_OP(TensorRedirect),且已用 OPS_PROTO_DEF_TENSORREDIRECT 包裹;本仓 op_graph/tensor_redirect_proto.h 无守卫。 - 已实测:构造同时包含两份定义的 TU,加守卫前报 error: redefinition of 'class ge::op::TensorRedirect',加守卫后编译通过。 - 现补同名守卫 OPS_PROTO_DEF_TENSORREDIRECT,与 legacy 侧配对。 > AddV2 这两条**本来就满足**,未作改动:InferDataType 一直在 op_graph/add_v2_graph_infer.cpp;AddV2 不在 ops_proto_legacy.h 中(仅在 elewise_calculation_ops.h),按 issue 条件不需要加守卫。 **两个算子的 REG_OP 均未改动**,与 canndev 保持逐字符一致(忽略空白后比对:AddV2 vs elewise_calculation_ops.h:1390;TensorRedirect vs elewise_calculation_ops.h:3779 及 ops_proto_legacy.h:13857)。 ### 二、代码检视报告问题修复 | 级别 | 问题 | 修复 | |---|---|---| | P1 | TensorRedirect Tiling 不拒绝负维与 shape 乘积溢出,负 numel 可穿透到 DoTiling 产生 usedCoreNum == 0 / SetBlockDim(0) | 逐维拒绝 < 0;GetShapeSize() 后拦截溢出哨兵 kInvalidDimValue,且置于 numel == 0 判断之前 | | P1 | TensorRedirect PrecisionReduceFlag(true) 与 bit-exact 语义冲突:allow_mix_precision 下允许把 FP32 节点降为 FP16,破坏 README 声明的逐 bit 相等(含负零 / NaN payload / 非规格化数) | 改为 PrecisionReduceFlag(false) | | P1 | AddV2 注册的 4 个混合 dtype 组合在 GE 图通路上不可达 | 删除,详见下 | | P2 | 文档与实现不一致 | docs/zh/op_list.md 删除 add_v2 已不存在的 bool logical_or 声明;README 删除混合精度组合表 | **关于 AddV2 的 4 个混合 dtype 组合(FP16+FP32、FP32+FP16、BF16+FP32、FP32+BF16):** canonical AddV2 契约要求 x1/x2 同 dtype —— canndev ops/built-in/op_proto/elewise_calculation_ops.cc:475 的 AddV2Verify 调用 CheckTwoInputDtypeSame,原型注释也写明 x2: A tensor of the same dtype as "x1"。既然本仓 REG_OP 与 canndev 保持一致,OpDef 里注册异类型组合就与自身原型契约矛盾。 已实测复现:FP16+FP32 离线构图被 Verifier 拒绝(The AddV2_0 op dtype is not same, type1:DT_FLOAT16, type2:DT_FLOAT),FP16+FP16 对照组构图成功。本算子无 ACLNN,因此这 4 个已编译 binary 对公开调用方实际不可达。 删除范围(REG_OP 不动): - add_v2_def.cpp:x1/x2/y 的 DataType 列表 13 → 9 组同 dtype,ADD_V2_FORMAT_LIST 同步收缩 - add_v2_binary.json:删除 4 个混合 binary,13 → 9 - add_v2_graph_infer.cpp:删除 34×34 类型提升表,InferDataType 改为 y 与 x1 同 dtype,并显式拒绝异类型输入 - add_v2_tiling_arch35.cpp:IsMixedDtype 与 4 个混合分支改为 CheckDtype 前置校验 - add_v2.cpp / add_v2_dag.h:删除 isMixDtype 分支与 AddMixDtypeCompute 模板 - tests/assets/golden.py:删除已不注册的 bool logical_or 死分支;对异类型输入直接抛错,避免静默按 x1.dtype 生成错误标杆 ### 三、AddV2 支持空 Tensor 上板回归时补的空张量用例暴露出一个既有能力缺口:**AddV2 对 numel == 0 的输入一律 OPTILING_FAILURE**,9 种 dtype × 4 种空场景 36/36 全挂。根因是 ATVOSS 的 BroadcastBaseTiling 在合轴之后显式拒绝 0 元素(broadcast_tiling.h 的 "tensor check is empty, check failed"),空 Tensor 根本落不到 DoTiling。 > 对比:同批提交的 TensorRedirect 本来就支持(Tiling 里有 HandleEmptyTensor 早返回,README 也声明了"支持空Tensor")。AddV2 此前既没实现也没声明。 按 math/select 的既有惯例另开一条自定义模板分支承接: - add_v2_struct_arch35.h:新增 userDef 模板键(0 常规 / 1 空 Tensor),空分支复用 BRC_TEMP_SCH_CUSTOM_MODE_KEY_SEL 的 schMode 999;并补 AddV2EmptyTilingData —— opc 靠 kernel 里的 GET_TILING_DATA_WITH_STRUCT 反推每个模板实例的 tiling 结构体大小,自定义分支不引用任何结构体会导致编译期 tiling_struct_size 未定义。 - add_v2.cpp:kernel 增加 userDef 模板参数,userDef == 1 时直接返回。 - add_v2_tiling_arch35.cpp:抽出 SetWorkspace(),新增 HandleEmptyTensor();按输出 y 的元素数判空,blockDim = 1、tilingKey 走自定义分支。判空**之前**先拦截 GetShapeSize() 的溢出哨兵(负值),否则负的 numel 会被当成非空穿透到 DoTiling。 - 常规通路的 tilingKey 统一补 userDef = 0,编码后取值不变(仍为 8),原有 UT 的 expectTilingKey 无需调整。 ## 关联的Issue - https://gitcode.com/cann/ops-nn/issues/4553 —— INTrainingReduceV2 / NormalizeBBox / SGD 原型重定义与 inferdatatype 放置问题(本 PR 按同一规范修正 ops-math 侧的 TensorRedirect) ## 测试 ### 单元测试 - ./build.sh -u --ophost --soc=ascend950 --ops=add_v2:**22/22 通过**(10 条 tiling,含新增 4 条空 Tensor;12 条 infershape)。 - op_host 全量 UT 75/75 通过(前两个 commit 时验证)。 ### 上板回归(Ascend950PR,TTK kernel 模式) 全部以 --binary-only(-d=false -b=release)+ --pc=1 串行执行,**只采信 BIN_* 列**(bin_compile_s = BINARY_MATCH 才算真正匹配到部署的 .o,而非 JIT 现编兜底)。 | 算子 | 用例数 | BINARY_MATCH | 精度通过率 | |---|---:|---:|---:| | AddV2 | 1735 | 1735 | **100.00%** | | TensorRedirect | 900 | 900 | **100.00%** | | **合计** | **2635** | **2635** | **100.00%** | 其中 36 条空 Tensor 用例全部 BINARY_MATCH + 100%,tiling_key = 65550 (0x1000e)、block_dim = 1,确认走的是新增的自定义分支(改动前为 36/36 INVALID_TILING)。 ### 负向对照 add_v2_removed_mixed_dtype.csv 12 条(已删除的 4 组混合 dtype)如期 **全部 BINARY_MATCH_FAILURE**。历史交付件里这 4 组是 BINARY_MATCH + 100% PASS —— 前后翻转,可作为"部署的确实是本 PR 代码"的直接证据。 ### 编译 - ./build.sh --pkg --soc=ascend950 --ops=add_v2,tensor_redirect:AddV2 产出 **9** 个 binary(原 13),TensorRedirect **4** 个,无残留混合 dtype binary。 - 原型防重定义:构造同时包含 legacy 与本仓两份 REG_OP(TensorRedirect) 的 TU,加守卫前编译失败、加守卫后通过。 ### 需要评审者注意的测试局限(如实说明) 1. 本 PR 为 TensorRedirect 新增的 4 个负维 / 溢出 UT,**在打补丁前也是通过的** —— 当前 UT faker 构造这类 context 时本就返回 GRAPH_FAILED(并非因为走到了新增的显式校验)。这些用例锁定了契约,但**不能证明新增守卫本身生效**;真实 GE 通路的行为需由 GEIR 测试覆盖。 2. 两个算子的 InferDataType **均无单元覆盖** —— 仓内 UT harness 只有 InferShape executor,没有 InferDataType 的对应设施,本 PR 未为此新造 harness。AddV2 新增的"x1/x2 异类型返回 GRAPH_FAILED"这条也因此未被测到。 3. TensorRedirect 的 900 条回归是在**前一版**代码上跑的,本次 AddV2 改动后未复跑。依据:conversion/tensor_redirect 源码相对该版本零改动,且重新编译产出的 4 个 binary 配置 json 与已部署版本**逐字段一致**(仅豁免随构建变化的 sha256;.o 本身构建不可复现,MD5 不具可比性)。 4. 性能仅有 TTK 采集的 cycle 数,未做三方对标。 ## 文档更新 - math/add_v2/README.md:删除混合精度组合表;x2/y 描述改为"与 x1 一致";约束说明补充"输入 x1 和 x2 的数据类型需相同" - docs/zh/op_list.md:删除 add_v2 条目中已不存在的"bool 输入按 logical_or 处理";描述补充"支持空Tensor" - math/add_v2/README.md:约束说明补充"支持空Tensor。当输出y的元素个数为0时,算子不下发有效计算,直接返回成功。" ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [x] 其他,请描述:交付件目录规范对齐(issue #4553)、删除不可达的 dtype 注册组合 See merge request: cann/ops-math!4505 | 3 天前 | |
feat: TensorRedirect 算子 Ascend950 arch35 实现(无 aclnn 接口) Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !4392 merge tensor-redirect-no-aclnn into master feat: TensorRedirect 算子 Ascend950 arch35 实现(无 aclnn 接口) Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 背景 Issue #2329 要求在 Ascend950 arch35 平台实现 TensorRedirect 算子。 ## 功能 - 11 dtype (FP16/FP32/INT8/UINT8/INT16/UINT16/INT32/UINT32/INT64/UINT64/BF16) - ND format, 1D~8D - 4 TilingKey (schMode: 1/2/4/8 bytes) - bit-exact 纯拷贝,atol=rtol=0 - REG_OP 与 canndev 完全一致(11 dtype,无属性) - 无 aclnn 接口(aclnn_exclude),与 canndev A2 保持一致 ## 测试 - 53 UT (op_host tiling + infershape) - 500 泛化用例 (kernel mode, 100% PASS) - 50 精度用例 (bit-exact) - 200 性能用例 ## Issue Closes #2329 See merge request: cann/ops-math!4392 | 9 天前 | |
test: update AddV2 and TensorRedirect golden specs Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !4540 merge fix/add-v2-tensor-redirect-golden into master test: update AddV2 and TensorRedirect golden specs Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 描述 按照新的golden规范更新AddV2和TensorRedirect: - AddV2增加TestSpec注册,kernel与GEIR共用 add_v2入口,并配置PyTorch三方标杆和分dtype精度标准。 - 新增TensorRedirect golden,使用torch.clone实现逐bit拷贝,并覆盖全部11种支持的数据类型。 - 保留仓库兼容的__golden__入口,与TestSpec共用同一计算实现。 - 两个算子均不注册ACLNN和e2e通路,与ACLNNTYPE aclnn_exclude配置保持一致。 本PR描述仅体现上述golden修改;前置PR尚未合入产生的其他diff不属于本PR说明范围。 ## 关联的Issue #2559 ## 测试 - TTK TestSpec loader和validator检查通过。 - AddV2改造前后11个代表用例逐位一致,覆盖广播、标量、空Tensor、整数边界、complex64和BF16。 - TensorRedirect完成11种dtype共33个用例的逐位一致性验证,覆盖连续、非连续及空Tensor,并验证NaN payload、负零、Inf和非规格化数。 - pre-commit全部检查通过。 - git diff --check通过。 ## 文档更新 不涉及文档更新。 ## 类型标签 - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [x] 其他,请描述:测试与golden规范更新 See merge request: cann/ops-math!4540 | 2 天前 | |
feat: TensorRedirect 算子 Ascend950 arch35 实现(无 aclnn 接口) Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !4392 merge tensor-redirect-no-aclnn into master feat: TensorRedirect 算子 Ascend950 arch35 实现(无 aclnn 接口) Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 背景 Issue #2329 要求在 Ascend950 arch35 平台实现 TensorRedirect 算子。 ## 功能 - 11 dtype (FP16/FP32/INT8/UINT8/INT16/UINT16/INT32/UINT32/INT64/UINT64/BF16) - ND format, 1D~8D - 4 TilingKey (schMode: 1/2/4/8 bytes) - bit-exact 纯拷贝,atol=rtol=0 - REG_OP 与 canndev 完全一致(11 dtype,无属性) - 无 aclnn 接口(aclnn_exclude),与 canndev A2 保持一致 ## 测试 - 53 UT (op_host tiling + infershape) - 500 泛化用例 (kernel mode, 100% PASS) - 50 精度用例 (bit-exact) - 200 性能用例 ## Issue Closes #2329 See merge request: cann/ops-math!4392 | 9 天前 | |
fix: TensorRedirect README 补充 GEIR 调用示例 (fixes #2503) Co-authored-by: raoliang_sac<raoliang4@huawei.com> # message auto-generated for no-merge-commit merge: !4442 merge tensor-redirect-geir-example into master fix: TensorRedirect README 补充 GEIR 调用示例 (fixes #2503) Created-by: raoliang_sac Commit-by: raoliang_sac Merged-by: cann-robot Description: ## 修改说明 修复 Issue #2503:TensorRedirect README 调用说明缺少 GEIR 调用 cpp 示例。 ### 变更内容 1. 新增 conversion/tensor_redirect/examples/test_geir_tensor_redirect.cpp — GEIR 图模式调用示例,展示通过 GE API 创建包含 TensorRedirect 单算子的计算图、初始化环境、构建会话并执行图推理的完整流程 2. 更新 conversion/tensor_redirect/README.md 调用说明表格,补充示例文件链接 ### gitcode-bot 审查意见修复 - P1: GenOnesData 缓冲区从 int32_t* 改为 uint8_t* 按字节分配,按 dtype 分别填充,修复 8 字节类型未初始化内存读取 - P2: GenOnesData 添加 nullptr 检查,修复空指针崩溃 - P2: GenOnesData 添加 delete[] pData,修复内存泄漏 - P2: WriteDataToFile 添加 fopen nullptr 检查 + fwrite 返回值检查 ### 关联Issue Fixes #2503 See merge request: cann/ops-math!4442 | 7 天前 |
TensorRedirect
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | √ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | √ |
| Atlas 推理系列产品 | √ |
| Atlas 训练系列产品 | √ |
功能说明
-
算子功能:将输入张量
x的数据完整拷贝到输出张量outputX,即逐元素恒等映射。本接口不做任何算术运算、类型转换、广播、归约或layout变换,仅按元素的bit位模式原样搬运,因此输出与输入逐bit严格相等(bit-exact)。NaN、Inf、负零(-0.0)、非规格化数均原样透传,不做规范化。使用场景:图优化 / 引用重定向场景下,将某节点的输出数据搬运到独立的目标张量。本接口的语义与
aclnnTensorMove等价,区别仅在于对应不同的IR算子(TensorRedirect)。 -
计算公式:
outputXi=xioutputX_i = x_i outputXi=xi
其中 iii 遍历 xxx 的全部元素。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 待拷贝的源张量。支持空Tensor,仅支持连续Tensor,rank取值范围 [1, 8]。 | FLOAT、FLOAT16、BFLOAT16、INT8、UINT8、INT16、UINT16、INT32、UINT32、INT64、UINT64 | ND |
| outputX | 输出 | 拷贝结果张量。数据类型、shape、数据格式均需与x严格一致。 | 与x保持一致 | ND |
约束说明
- x与outputX的数据类型必须完全一致,本接口不做数据类型推导或转换。
- x与outputX的shape必须完全一致(逐维相等),维度范围为1-8维,不涉及broadcast。
- x与outputX的内存地址不允许重叠(非in-place),重叠时结果未定义。
- 仅支持连续Tensor,数据格式支持ND。
- 精度:恒等拷贝,输出与输入逐bit严格相等(bit-exact,rtol=atol=0)。浮点类型的NaN、Inf、负零(-0.0)及非规格化数均按bit位模式原样透传。
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_tensor_redirect | 通过算子IR构图方式调用TensorRedirect算子。 |