DivV3(带模式的除法 / DivMod)
产品支持情况
| 产品 |
是否支持 |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 |
√ |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 |
√ |
功能说明
- 算子功能:根据
mode 参数完成不同舍入模式的除法计算,对应官方 aclnnDivMod 语义。
- 计算公式:
- mode=0 (RealDiv):$$ y = x1 / x2 $$
- mode=1 (TruncDiv):$$ y = \text{trunc}(x1 / x2) $$
- mode=2 (FloorDiv):$$ y = \lfloor x1 / x2 \rfloor $$
- 本算子使用原生 Ascend C LocalTensor 手写流水线实现(CopyIn / Compute / CopyOut 三级流水),
而非高级 DAG/BroadcastSch 模板,用于学习和对比低级实现方式。
参数说明
| 参数名 |
输入/输出/属性 |
描述 |
数据类型 |
数据格式 |
| x1 |
输入 |
被除数张量 |
见下方 |
ND |
| x2 |
输入 |
除数张量 |
见下方 |
ND |
| mode |
属性 |
舍入模式:0=RealDiv, 1=Trunc, 2=Floor |
int32 |
- |
| y |
输出 |
除法计算的结果 |
见下方 |
ND |
数据类型支持
- Atlas A2 训练系列产品/Atlas A2 推理系列产品:
- Atlas A3 训练系列产品/Atlas A3 推理系列产品:
- FLOAT32、FLOAT16、BFLOAT16、INT32、INT16
数据格式
广播策略
- 广播操作在 aclnn 接口层(op_api)通过调用
l0op::BroadcastTo 完成。
- Kernel 层假设输入 x1、x2 已经是广播后的同形状张量,执行逐元素计算。
- 输入 shape 需满足 NumPy 广播规则,输出 shape 为广播后的 shape。
实现架构
aclnnDivV3 (op_api 层)
├── 参数检查 (dtype / shape / format)
├── Contiguous 转换
├── BroadcastTo 广播对齐
├── l0op::DivV3 → kernel 调度
│ └── DivV3 kernel (手写流水线)
│ ├── CopyIn: GM → UB (DataCopyPad)
│ ├── Compute: 根据 mode 分支计算
│ │ ├── mode=0: Div
│ │ ├── mode=1: Div → Trunc (或 Cast CAST_TRUNC)
│ │ └── mode=2: Div → Floor
│ └── CopyOut: UB → GM (DataCopyPad)
└── ViewCopy 输出
Kernel 内部类型转换策略
| 输入类型 |
计算路径 |
| float32 |
直接 Div,按 mode 执行 Floor/Trunc |
| float16 |
Cast → float32 → Div+mode → Cast 回 float16 |
| bfloat16 |
Cast → float32 → Div+mode → Cast 回 bfloat16 |
| int32 |
Cast → float32 → Div+mode → Cast 回 int32 |
| int16 |
Cast → float32 → Div+mode → Cast 回 int16 |
相比 DivV2 的改进
- 新增 mode 属性:支持三种除法模式,覆盖 DivMod 完整语义
- DataCopyPad:尾块搬运使用 DataCopyPad 避免非对齐数据丢失
- 成员变量初始化:所有基础类型成员变量声明时初始化为 0
- op_api 层广播:在 aclnn 层完成广播,kernel 只做逐元素计算
- 完善边界处理:增加 Floor 模式的 tmpBuf 支持(Floor 指令需要额外缓冲区)
调用说明
| 调用方式 |
样例代码 |
说明 |
| aclnn接口 |
test_div_v3 |
通过 aclnnDivV3 接口调用 DivV3 算子 |