已关闭
[Requirement|需求建议]: 新增mod算子Ascend C实现 #1928
ava创建于  6月10日关闭于  6月18日
ava
ava
6月10日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

一、背景信息 (必填)

TBE转Ascend C 功能实现

二、价值/作用 (必填)

三、设计方案 (必填)

3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)
3.2 总体设计

Mod 算子提供 aclnnFmodTensor / aclnnInplaceFmodTensor / aclnnFmodScalar / aclnnInplaceFmodScalar 四个 aclnn 接口,计算语义为:

out = self - other * trunc(self / other)

当前 CI/UT 已验证 op_api / op_host / op_kernel 三段均可通过,出包也已通过。

3.2.1 算子支持的数据类型

接口侧 dtype 支持范围按当前 op_api 逻辑:

  • Ascend910B / Ascend910_93 / RegBase:DOUBLE、BF16、FLOAT16、FLOAT32、INT32、INT64、INT8、UINT8
  • Ascend910 / Ascend310P:DOUBLE、FLOAT16、FLOAT32、INT32、INT64、INT8、UINT8
  • 不支持 complex:COMPLEX64 / COMPLEX128 会直接报不支持
3.2.2 host侧设计

host 侧包含 op_def / infershape / tiling:

  • op_def 注册 Mod,输入 x1/x2、输出 y,格式均为 ND,当前 AddConfig("ascend910b")。

  • infershape 输出 shape 固定跟随 self,即 out.shape == self.shape。

  • op_api 负责更严格的参数校验:

    • tensor-tensor 场景要求 other 可 broadcast 到 self
    • out shape 必须等于 self shape
    • 维度数不超过 8
    • dtype promote 后必须在支持列表内
  • tiling 侧按 self 总元素数做多核切分:

    • 最小每核 1024 元素
    • UB 预留 1024 字节和 tiling data 空间
    • workspace 固定设置为 32MB
    • tiling data 下发 needCoreNum / usableUbSize / perCoreDataCount / tailDataCoreNum / lastCoreDataCount
  • tiling 同时识别三类 other 形态:

    • scalar
    • same shape
    • broadcast shape,并记录 input2Shape / input2Stride
3.2.3 kernel侧设计

kernel 采用模板化实现,tiling key 选择实际 dtype 模板:

  • FP32 / FP16 / BF16 / INT32 分支分别实例化

  • 多核按 host tiling 下发的 blockIdx / perCoreDataCount / tailCoreNum 处理各自数据段

  • 数据搬运使用 DataCopyPad

  • scalar other 场景:只搬一个元素到 UB,再 Duplicate 成当前 tile

  • same-shape 场景:x1/x2 按相同 offset 连续搬运

  • broadcast 场景:根据 input2Stride 计算 other offset,并尽量按连续段搬运,避免整 tensor materialize

  • 浮点路径:

    • FP16/BF16 先 cast 到 FP32 计算
    • FP32 直接计算
    • 核心计算为 Div -> Trunc -> Mul -> Sub
  • INT32 路径:

    • high performance 模式下 cast 到 FP32 快速计算再 cast 回 INT32
    • 另有 high precision 分支逻辑,但当前性能路径主要使用 high performance
3.3 支持硬件

3.4 算子约束限制

  • 当前 kernel 直接计算 dtype 仅支持 BF16 / FLOAT16 / FLOAT32 / INT32。
  • DOUBLE / INT64 / INT8 / UINT8 依赖 op_api cast 到可计算 dtype,存在额外 cast 开销。
  • 不支持 complex dtype。
  • 只支持 ND 格式。
  • tensor-tensor 场景要求 other 可广播到 self,且广播结果必须等于 self.shape。

💡 备注(选填)

likedislike
ava
ava
6月10日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
6月10日 将 tieyutong 设为负责人
avaava
6月10日 关联了pull request:新增mod算子Ascend C实现
CANN-robotCANN-robot成员
6月18日 关闭了 issue
CANN-robotCANN-robot成员
6月18日 添加了label:resolved