| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(broadcast): 修复 Collapse 链路 dtypeSize 断链导致的未初始化读取 Co-authored-by: zzz2048<zhuhanhan@huawei.com> # message auto-generated for no-merge-commit merge: !6557 merge fix/broadcast-dtypesize into master fix(broadcast): 修复 Collapse 链路 dtypeSize 断链导致的未初始化读取 Created-by: zzz2048 Commit-by: zzz2048 Merged-by: cann-robot Description: ## 问题一(dtypeSize 断链,UB) IsBroadcastTemplateNonContiguousSupport(math/common/op_api/broadcast_util.cpp)数据流中,CollectInput 正确填充的 ct.dtypeSize 在后续链路丢失: 1. PaddedInput 结构无 dtypeSize 字段——PadSingleInput 处丢失 2. BuildCollapsedTensor 未赋值——CollapseSingleTensor 处丢失 ClassifySingleInput 消费 ct.dtypeSize 计算 dimLimit(NLast 场景 a/b 门限)与 inputSize(场景 c 单核判定),读到的是**未初始化栈值(UB)**,门限判定与 opbase 决策树镜像(broadcast_tiling.h 逐输入取真实 dtypeSize 的同构逻辑)脱节。 ## 问题二(sub-bit 标记编码) opdev::TypeSize 对 INT4/UINT1/INT2/UINT2/FLOAT4/FLOAT6/HIFLOAT4 返回 kDataTypeSizeBitOffset+位宽 标记编码(如 INT4=1004)而非真实字节宽,直接参与 dimLimit = CACHE_LINE/dtypeSize 计算得 0,NLast 判定恒真污染。HIFLOAT4 已在 conversion 族算子(strided_slice_v3/zeros_like/as_strided)落地,broadcast 系接入后即触达。 ## 修复 - PaddedInput 增加 dtypeSize 字段并透传;BuildCollapsedTensor 参数化赋值;输出侧 ct 置 0 防御 - CollectInput 对 sub-bit 标记编码按 1 字节近似解码(与 ge::GetSizeByDataType 语义对齐),不新增公共接口,零 ops-base 版本依赖 ## 验证(Ascend 950PR) div/greater/greater_equal 三算子 24 例(覆盖 NLast a/b/c、Base 兜底、expand、转置、>4 维、连续分支),基线/修复两轮:精度 **48/48 PASS**,分流与性能零变化(纯 UB 消除 + 前置防御)。 关联的Issue:#3757 See merge request: cann/ops-math!6557 | 16 天前 | |
feat: 抽取 broadcast_util 统一非连续广播门限,div/realdiv/greater/greater_equal 接入并扩大非连续支持 Co-authored-by: zzz2048<zhuhanhan@huawei.com> # message auto-generated for no-merge-commit merge: !4935 merge nc-2803 into master feat: 抽取 broadcast_util 统一非连续广播门限,div/realdiv/greater/greater_equal 接入并扩大非连续支持 Created-by: zzz2048 Commit-by: zzz2048 Merged-by: cann-robot Description: ## 描述 新增共享工具 math/common/op_api/broadcast_util(namespace op),集中实现广播类算子的非连续支持门限判定 IsBroadcastTemplateNonContiguousSupport,div / realdiv / greater / greater_equal 四个算子的 op_api 层 统一接入,替换原先各自分散的 IsRegBase + IsAiCoreSupport 简单组合判定。 ### 改动内容 1. **新增 broadcast_util.cpp/.h** - 对外接口:IsBroadcastTemplateNonContiguousSupport(inputs, outputShape) - 维度折叠:PadSingleInput 补维、ComputeBroadcastFlags 广播标记、 ComputeBroadcastCollapsePlan 合轴决策(KEEP/MERGE/ABSORB,含 IsAxesPairJointContiguous 相邻轴联合连续性校验)、CollapseSingleTensor 折叠执行 - 门限判定 CheckNonContiguousSupport:对齐 opbase broadcast_tiling 的 schMode 301-305 模板选择逻辑——广播轴 / 合轴后超 4D → NonContiguousBase(304/305);末两轴转置且 ≤3D → LastTranspose(303);末轴大且连续 / 小末轴大步幅 / 单核小数据三场景 → NLast(301/302); dimLimit 按各输入自身 dtype 计算(cache_line / dtype_size),与 opbase 决策树逐输入 判定一致;304 与 305 的细分选择交由 opbase tiling 按切分自定,host 侧不模拟 UB 容量切分;输出末轴 > 8192 时 NDDMA 效率下降,回退 Contiguous 转换路径(LastTranspose 与 NonContiguousBase 场景共用该门限,8192 为当前调优值) - 全连续输入短路跳过折叠分析;各判定分支注释标注最终 schMode 2. **realdiv.cpp/.h**:IsRealDivSupportNonContiguous 签名从 (self) 扩展为 (self, other, outputShape);other==nullptr(divs 标量路径)过 IsRegBase/IsAiCoreSupport 门限后直接放行;双 tensor 路径走广播模板门限。 3. **aclnn_div.cpp**: - HandleMixDataTypeDiv:mix-dtype 路径仅在 910B/910_93 使能,与 RegBase 非连续门限 芯片互斥,保持原有 Contiguous 处理不变 - HandleNotMixDataTypeDiv:拆分 CastDivInput / SelectDivInputByNC 辅助函数消除 self/other 重复处理;需 Cast 输入沿用 Cast 产物,不需 Cast 输入按门限结果选择 非连续直通(CreateView)或转连续(Contiguous) - divs 标量路径 other 传 nullptr 4. **greater.cpp / greater_equal.cpp/.h**:IsGreaterSupportNonContiguous / IsGreaterEqualSupportNonContiguous 委托 IsBroadcastTemplateNonContiguousSupport (greater 单输入;greater_equal 双输入且 other 可为 nullptr,新增 other dtype 联合检查)。 5. **aclnn_ge_tensor.cpp**:抽取 CastInput / SelectByNC / PrepareBinaryOpInputs 辅助函数, 消除 self/other 处理重复代码。 6. **构建接入**:新增 math/common/CMakeLists.txt(GLOB 编入 opapi obj); cmake/func.cmake 的 check_compiled_ops 增加 COMMON_DIRS="common" 白名单过滤公共目录; opbase.cmake 的 OPBASE_TAG_ID 更新至 opbase master 最新(f09beaf7,含 303 并行度门限)。 7. **UT**:test_aclnn_real_div.cpp 适配 IsRealDivSupportNonContiguous 新签名。 ### 改动原因 - 各算子非连续判定逻辑分散重复(IsRegBase + IsAiCoreSupport 简单组合),无法区分 广播/转置等细分场景,与 opbase 广播模板实际能力不匹配 - 收敛到统一门限后降低维护成本,同时使非连续放行条件与 opbase 广播模板能力精确对齐 ## 关联的Issue #2866 ## 测试 - 精度:二级冒烟 + 算子泛化通过 - 批量测试性能效果: | 接口 | 用例数 | 平均性能提升 | |------|--------|--------------| | aclnnAdds | 484 | 9.4% | | aclnnGeTensor | 656 | 21.5% | | aclnnGtScalar | 856 | 29% | | aclnnDiv | 601 | 54.5% | > **表注**: 批量测试统计口径为各接口非连续形态用例合入前后的平均性能提升比例。 ## 文档更新 无 ## 类型标签 - [ ] Bug修复 - [x] 新特性 - [x] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4935 | 2 个月前 |