| feat(experimental): replace div_mod with div_v3
Co-authored-by: wyb780310<wangyubo37@huawei.com>
# message auto-generated for no-merge-commit merge:
!1994 merge master into master
feat(experimental): replace div_mod with div_v3
Created-by: wyb780310
Commit-by: wyb780310
Merged-by: cann-robot
Description: ## 描述
本 PR 将experimental/math/div_v3, 用更清晰的 mode 属性来实现与官方 aclnnDivMod 对齐的除法语义。基于 div_mod PR 审视意见,对算子进行了完全重构:
主要改动如下:
- 重新定义算子语义为“带 mode 参数的除法”(单输出 y),覆盖:
- mode=0 (RealDiv):y = x1 / x2
- mode=1 (TruncDiv):y = trunc(x1 / x2)
- mode=2 (FloorDiv):y = floor(x1 / x2)
- 新增 mode 属性校验与分支计算逻辑(kernel 侧根据 mode 选择 Div/Trunc/Floor 路径)
- 新增数据类型支持:BFLOAT16 / INT32 / INT16(同时支持 FLOAT32 / FLOAT16)
- 在 op_api 层完成广播对齐:通过 l0op::BroadcastTo 将 x1/x2 广播到输出形状,kernel 侧按同形状逐元素计算
- kernel 实现使用手写 LocalTensor 流水线(CopyIn / Compute / CopyOut),并在关键向量计算之间加入同步:
- DataCopyPad:用于尾块/非对齐尾段的数据搬运,避免尾部数据丢失
- PipeBarrier<PIPE_V>:用于向量计算间的同步
- 平台支持信息:div_v3/README.md 标注支持 Atlas A2/A3(实际 AICore 配置以代码中的 ascend910b / ascend910_93 为准)
| # | 原问题 | 涉及文件 | div_v3 状态 | 解决位置 |
|---|--------|---------|------------|---------|
| 1 | typeSize 获取方式 | tiling.cpp | **已解决** | ge::TypeUtils::GetDataTypeLength (L114-115) |
| 2 | 魔鬼数字 32 | tiling.cpp | **已解决** | 用 Ops::Base::GetUbBlockSize(context) 代替 |
| 3 | 对齐计算用 CeilAlign | tiling.cpp | **已解决** | 整体 tiling 逻辑重构,手写公式替换为 Ops::Base::CeilDiv |
| 4 | 16M workspace 不需要 | tiling.cpp | **已解决** | 改用 GetLibApiWorkSpaceSize() (L72) |
| 5 | 核数写死为 8 | tiling.cpp | **已解决** | 动态计算 min(coreNum, blocksTotal) (L148-159) |
| 6 | ascend910_95 名称错误 | def.cpp | **已解决** | 删除,仅保留合法名称 (L53) |
| 7 | half 中间缓冲区无 DoubleBuffer | div_v3.h | **设计变更** | 中间缓冲区用 TBuf,IO 队列用 TQue 双缓冲 |
| 8 | Vector 计算间缺同步 | div_v3.h | **已解决** | 所有连续 Vector 指令间插入 PipeBarrier<PIPE_V>() |
| 9 | A3 也需要支持 | def.cpp + README | **已修复** | 新增 ascend950 配置 |
| 10 | 添加 bf16 支持 | def.cpp | **已解决** | 支持 5 种类型含 BF16 (L22) |
| 11 | infershape 误用 optiling 命名空间 | infershape.cpp | **已解决** | 移除 tiling_util.h 依赖 |
| 12 | 不支持广播 | aclnn_div_v3.cpp | **已解决** | op_api 层 BroadcastTo 完成广播 (L148-155) |
| 13 | GetNodeName 后重复算子名 | infershape.cpp | **已解决** | 日志不再重复添加算子名前缀 |
| 14 | 缺少 dtype 推导 | infershape.cpp | **设计覆盖** | def.cpp 位置对应自动推导(与 math/div 一致) |
| 15 | 缺少 -1/-2 shape 推导 | infershape.cpp | **已解决** | *yShape = *xShape 天然传递动态 shape |
## 关联的Issue
https://gitcode.com/cann/ops-math/issues/1151
## 测试
- 新增示例测试入口:
- examples/test_aclnn_div_v3.cpp:循环验证 mode=0/1/2(RealDiv/TruncDiv/FloorDiv),shape 使用 {4, 256}
- examples/test_geir_div_v3.cpp:以 GE 图方式构建 DivV3,设置 mode=2 (FloorDiv),并将输出写入 ./div_v3_output_*.bin
## 文档更新
- 新增 experimental/math/div_v3/README.md
- 新增 experimental/math/div_v3/docs/aclnnDivV3.md
## 类型标签
- [ ] Bug修复
- [x] 新特性
- [ ] 性能优化
- [x] 文档更新
- [ ] 其他,请描述:
See merge request: cann/ops-math!1994 | 2 个月前 |