已关闭
[Requirement|需求建议]: 【社区任务】AngleV2算子支持bf16实现贡献 #1493
Nice try创建于  5月8日关闭于  8月13日
Nice try
Nice try成员
5月8日 创建

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

一、 需求背景

1.1 需求来源

通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。

1.2 背景介绍

Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 x<0x < 0 时,其角度为 π\pi;当 x0x \ge 0 时,其角度为 00。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。

1.2.1 TBE 算子现状分析

  • 说明:在系统的 TBE 算子库中,未找到对应 AngleV2 的 TBE 源码。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。
  • 算子的核心逻辑基于 Ascend C 现有实现进行拓展。

1.2.2 核心计算逻辑分析

针对 bf16 这种实数数据类型,其数学计算公式如下:
y={π,if x<00,if x0y = \begin{cases} \pi, & \text{if } x < 0 \\ 0, & \text{if } x \ge 0 \end{cases}

在硬件实现上,由于是对 element-wise 张量进行处理,可以通过向量比较指令(如 Cmp)生成掩码(Mask),再结合向量选择或数学运算(如乘以 π\pi)得出最终结果。

二、 需求分析

2.1 外部组件依赖

不涉及。

2.2 内部适配模块

适配 aclnn 接口调用框架,修改 Host 侧代码以分发 bf16 类型,并修改 Kernel 侧代码以实例化 bf16 相关的计算逻辑。

2.3 需求模块设计

2.3.1 Ascend C 算子原型

根据框架侧定义,算子原型如下:

名称 类别 数据类型 format shape
x 输入 float16, float32, complex64, bool, uint8, int8, int16, int32, int64, bf16 ND all
y 输出 float16, float32, float32, float32, float32, float32, float32, float32, float32, bf16 ND all

2.3.2 Ascend C 算子相关约束

  1. bf16 输入对应的输出类型严格为 bf16
  2. 算子需满足泛化数据场景的支持,输入 Shape 无强限制,作为一维向量处理。

三、 需求详细设计

3.1 使能方式

上层框架 涉及的框架勾选
TF训练/推理
Pytorch训练/推理
ATC推理
Aclnn直调
OPAT调优
SGAT子图切分

3.2 需求总体设计

3.2.1 Host侧设计

3.2.1.1 分核策略
采取均分满核策略。由于计算逻辑属于 element-wise 纯向量操作,将输入张量 x 的所有元素视作 1D 数据展开。根据 x 的元素总数与硬件可用核心数(coreNum)进行切分,无法整除的部分通过尾块分配策略优先分配给前置大核。

3.2.1.2 数据分块和内存优化策略

  • 空间复用:开启 DOUBLE_BUFFER 进行双缓冲流水线设计,隐藏 MTE2 和 MTE3 的访存开销。
  • UB(Unified Buffer)空间主要划分为 x 的输入缓冲、y 的输出缓冲以及用于存放 π\pi 常量的辅助标量/向量空间。

3.2.1.3 tilingKey规划策略
当前计算无复杂属性导致的静态分支,可以复用已有的 Tiling 结构,确保 bf16 类型的单元素位宽(2 Bytes)正确参与 tileDataNum 的计算即可。

3.2.2 Kernel侧设计

3.2.2.1 kernel侧实现描述

  • Init:接收 Host 侧下发的 Tiling 数据,初始化 TPipe,分配 VECINVECOUTTQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。
  • Process
    1. CopyIn:使用 DataCopybf16 数据从 Global Memory 搬运至 Local Memory。
    2. Compute:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 x<0x < 0;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Castbf16。结合常数 π\pi (3.14159263.1415926) 计算得出 y
    3. CopyOut:将计算结果 y 从 Local Memory 搬运至 Global Memory。

3.2.2.2 Ascend C 实现流程图

以下为 Ascend C 侧算子执行流程图:

image.png

3.3 支持硬件

  • Atlas A2 训练系列产品
  • Atlas A3 系列产品

3.4 算子约束限制

  • 输入 x 和输出 y 的 Shape 必须严格保持一致。
  • 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。

四、 特性交叉分析

不涉及。

五、 可维可测分析

5.1 精度标准/性能标准

验收标准 描述 来源
精度标准 算子计算精度需满足 AscendOpTest 工具默认阈值。 任务书要求
性能标准 bf16 性能需和 fp16 数据类型持平。 任务书要求

5.2 兼容性分析

本需求为在现有 aclnnAngleV2 算子中追加类型支持,不破坏原有接口签名与调用规范。原有针对 float16float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。

💡 备注(选填)

likedislike
Nice try
Nice try成员
5月8日 评论:

/assign @Nice_try

likedislike
CANN-robotCANN-robot成员
5月8日 将 Nice_try 设为负责人
Nice tryNice try成员
5月8日 关联了pull request:【社区任务】AngleV2算子支持bf16实现贡献
llimwang成员
7月30日 评论:

该 Issue 已超过 20 天未更新,先行关闭以便归档;如仍需跟进请评论或重新打开。

likedislike
Lllimwang成员
7月30日 关闭了 issue
Nice try
Nice try成员
7月30日 评论:

关联pr还在等待合入,需要再打开,麻烦重新打开下,我这边没有权限重新打开issue
@llimwang

likedislike
Nice tryNice try成员
7月30日 issue状态由 进行中 改变为 已完成
CANN-robotCANN-robot成员
7月30日 添加了label:Accepted
Nice tryNice try成员
7月30日 issue类型由 任务 改变为 需求
Nice tryNice try成员
7月30日 issue类型由 需求 改变为 任务
Ssongkai111成员
8月1日 issue类型由 任务 改变为 需求
Ssongkai111成员
8月1日 issue类型由 需求 改变为 缺陷
Ssongkai111成员
8月1日 issue状态由 已完成 改变为 修复中
Ssongkai111成员
8月1日 重新打开了 issue
Ssongkai111成员
8月1日 issue类型由 缺陷 改变为 任务
Ssongkai111成员
8月1日 issue类型由 任务 改变为 需求
songkai111成员
8月1日 评论:

@Nice try 你好,已打开

likedislike
CANN-robotCANN-robot成员
8月13日 关闭了 issue
CANN-robotCANN-robot成员
8月13日 添加了label:resolved