| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
perf: 非连续广播场景直通优化,expand 广播输入不再强制转连续,广播场景性能提升 1.4~3.6 倍 Co-authored-by: zzz2048<zhuhanhan@huawei.com> # message auto-generated for no-merge-commit merge: !5522 merge fix/div-broadcast-input-gate into master perf: 非连续广播场景直通优化,expand 广播输入不再强制转连续,广播场景性能提升 1.4~3.6 倍 Created-by: zzz2048 Commit-by: zzz2048 Merged-by: cann-robot Description: ## 描述 PR #4935 引入的 broadcast_util 将 stride=0 的 expand 广播输入(dim != 1 且 stride == 0)归类 needsNonContiguousBase,当合轴后输出末轴超过 8192 (NON_CONTIGUOUS_LAST_DIM_LIMIT)时整体回退 Contiguous 转换路径,导致 aclnn 层转连续时按广播倍数放大数据量(如 aclnnDiv 广播场景 input1 按 96 倍 放大 6.4MB -> 615MB),div/real_div/greater/greater_equal 四算子的广播场景 普遍性能回退。 本 PR 修复该场景: 1. expand 广播输入单独立类 isBroadcastInput,不再归入 needsNonContiguousBase 2. 跳读形态且存在广播输入时直通:内核广播拷贝优于转连续 3. 分类循环 needsNonContiguousBase 分支不再提前退出,广播豁免判定 与输入顺序无关 转置/纯跳读形态的大末轴门限拦截(PR #4935 既有收益)完整保留。 ## 关联的Issue 关联 PR:https://gitcode.com/cann/ops-math/merge_requests/4935 ## 测试 ### 1. 广播场景性能(C++ 直调 vendor 包,B1 Ascend 950PR,run=10 稳态) **aclnnDiv 典型 case**(input0 [1,96,4,736,544] 连续,input1 展开形广播, FLOAT): | 路径 | 耗时 | |---|---| | master(转连续物化) | 26927us | | 本 PR(内核广播拷贝直通) | 12146us(**2.22 倍提升**) | **四算子泛化 42 case**(每个算子 10 个形态 + 高维补充): | 算子 | 广播场景 | master(us) | 本 PR(us) | 提升 | |---|---|---|---|---| | aclnnDiv | 展开广播大末轴 | 28089 | 12050 | 2.33 倍 | | aclnnDiv | 末轴跳读+广播 | 52176 | 18081 | 2.89 倍 | | aclnnDiv | 外轴跳读+广播 | 44141 | 12407 | 3.56 倍 | | aclnnGreaterEqual | 展开广播大末轴 | 35528 | 21885 | 1.62 倍 | | aclnnGreater | 展开广播大末轴 | 37022 | 35764 | 稳态一致 | | aclnnDiv | 8 维跳读+广播(高维) | 1068641 | 759460 | 1.41 倍 | | aclnnAdds | 展开广播(对照组,未接入 broadcast_util) | 两版一致 | 一致 | 不受影响 | > 注:aclnnGreater 各广播场景稳态耗时两版一致(3%~5% 内)。greater 输出为 > bool(1 字节)且单 float 输入,转连续放大数据量本身较小,豁免收益弱于 > div/greater_equal(双 float 输入、4 字节),属预期行为,无回归。 ### 2. 门限既有收益保留(非广播场景零回归) | 场景 | master(us) | 本 PR(us) | 一致性 | |---|---|---|---| | 转置+广播混合(末轴>8192) | 46445 | 45677 | 门限拦截保留 | | 纯转置大末轴 | 28552 | 28424 | 门限拦截保留 | | 纯末轴跳读大末轴 | 38973 | 38826 | 门限拦截保留 | | 连续输入 / 末轴≤8192 / NLast | 逐 case 一致 | 一致 | 零变化 | ### 3. 顺序无关性 混合输入(末轴跳读在前 + expand 广播在后)实测直通 18081us,广播在前 同为直通,两顺序行为一致(分类循环完整扫描所有输入)。 ## 文档更新 无 ## 类型标签 - [x] Bug修复 - [x] 性能优化 - [ ] 新特性 - [ ] 文档更新 - [ ] 其他 See merge request: cann/ops-math!5522 | 17 天前 | |
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 | 23 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 17 天前 | ||
| 23 天前 |