已关闭
[Requirement|需求建议]: 【社区任务】AngleV2算子支持bf16实现贡献 #1493
Nice try创建于 5月8日关闭于 8月13日
5月8日 将 Nice_try 设为负责人
5月8日 关联了pull request:【社区任务】AngleV2算子支持bf16实现贡献
7月30日 issue状态由 进行中 改变为 已完成
7月30日 添加了label:Accepted
7月30日 issue类型由 任务 改变为 需求
7月30日 issue类型由 需求 改变为 任务
8月1日 issue类型由 任务 改变为 需求
8月1日 issue类型由 需求 改变为 缺陷
8月1日 issue状态由 已完成 改变为 修复中
8月1日 重新打开了 issue
8月1日 issue类型由 缺陷 改变为 任务
8月1日 issue类型由 任务 改变为 需求
songkai111
8月1日 评论:
8月1日 评论:
@Nice try 你好,已打开


8月13日 关闭了 issue
8月13日 添加了label:resolved
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<0 时,其角度为 π;当 x≥0 时,其角度为 0。当前
aclnnAngleV2算子已支持多种数据类型,但缺少对bf16的支持。需要在原有代码框架下进行再开发,补齐bf16功能。1.2.1 TBE 算子现状分析
1.2.2 核心计算逻辑分析
针对
bf16这种实数数据类型,其数学计算公式如下:y={π,0,if x<0if x≥0
在硬件实现上,由于是对 element-wise 张量进行处理,可以通过向量比较指令(如
Cmp)生成掩码(Mask),再结合向量选择或数学运算(如乘以 π)得出最终结果。二、 需求分析
2.1 外部组件依赖
不涉及。
2.2 内部适配模块
适配 aclnn 接口调用框架,修改 Host 侧代码以分发
bf16类型,并修改 Kernel 侧代码以实例化bf16相关的计算逻辑。2.3 需求模块设计
2.3.1 Ascend C 算子原型
根据框架侧定义,算子原型如下:
2.3.2 Ascend C 算子相关约束
bf16输入对应的输出类型严格为bf16。三、 需求详细设计
3.1 使能方式
3.2 需求总体设计
3.2.1 Host侧设计
3.2.1.1 分核策略
采取均分满核策略。由于计算逻辑属于 element-wise 纯向量操作,将输入张量
x的所有元素视作 1D 数据展开。根据x的元素总数与硬件可用核心数(coreNum)进行切分,无法整除的部分通过尾块分配策略优先分配给前置大核。3.2.1.2 数据分块和内存优化策略
DOUBLE_BUFFER进行双缓冲流水线设计,隐藏 MTE2 和 MTE3 的访存开销。x的输入缓冲、y的输出缓冲以及用于存放 π 常量的辅助标量/向量空间。3.2.1.3 tilingKey规划策略
当前计算无复杂属性导致的静态分支,可以复用已有的 Tiling 结构,确保
bf16类型的单元素位宽(2 Bytes)正确参与tileDataNum的计算即可。3.2.2 Kernel侧设计
3.2.2.1 kernel侧实现描述
TPipe,分配VECIN、VECOUT的TQue,并申请计算所需的临时TBuf(若向量比较指令需要临时掩码空间)。DataCopy将bf16数据从 Global Memory 搬运至 Local Memory。bf16类型,若硬件原生支持bf16的向量比较指令,则直接比较 x<0;若当前架构 API 对bf16存在局限,可通过Cast指令先转换为float32进行掩码计算和赋值,完成后再Cast回bf16。结合常数 π (3.1415926) 计算得出y。y从 Local Memory 搬运至 Global Memory。3.2.2.2 Ascend C 实现流程图
以下为 Ascend C 侧算子执行流程图:
3.3 支持硬件
3.4 算子约束限制
x和输出y的 Shape 必须严格保持一致。bf16为 16 个元素)的整数倍。四、 特性交叉分析
不涉及。
五、 可维可测分析
5.1 精度标准/性能标准
bf16性能需和fp16数据类型持平。5.2 兼容性分析
本需求为在现有
aclnnAngleV2算子中追加类型支持,不破坏原有接口签名与调用规范。原有针对float16、float32等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。💡 备注(选填)