| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
【社区任务】AngleV2算子支持bf16实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !2643 merge dev-angle_v2 into master 【社区任务】AngleV2算子支持bf16实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。 ### 1.2 背景介绍 Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 $x < 0$ 时,其角度为 $\pi$;当 $x \ge 0$ 时,其角度为 $0$。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。 #### 1.2.1 TBE 算子现状分析 - **说明**:在系统的 TBE 算子库中,**未找到对应 AngleV2 的 TBE 源码**。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。 - 算子的核心逻辑基于 Ascend C 现有实现进行拓展。 #### 1.2.2 核心计算逻辑分析 针对 bf16 这种实数数据类型,其数学计算公式如下: $y = \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,分配 VECIN、VECOUT 的 TQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。 - **Process**: 1. **CopyIn**:使用 DataCopy 将 bf16 数据从 Global Memory 搬运至 Local Memory。 2. **Compute**:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 $x < 0$;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Cast 回 bf16。结合常数 $\pi$ ($3.1415926$) 计算得出 y。 3. **CopyOut**:将计算结果 y 从 Local Memory 搬运至 Global Memory。 **3.2.2.2 Ascend C 实现流程图** 以下为 Ascend C 侧算子执行流程图:  ### 3.3 支持硬件 - Atlas A2 训练系列产品 - Atlas A3 系列产品 ### 3.4 算子约束限制 - 输入 x 和输出 y 的 Shape 必须严格保持一致。 - 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。 ## 四、 特性交叉分析 不涉及。 ## 五、 可维可测分析 ### 5.1 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |---|---|---| | 精度标准 | 算子计算精度需满足 AscendOpTest 工具默认阈值。 | 任务书要求 | | 性能标准 | **bf16 性能需和 fp16 数据类型持平。** | 任务书要求 | ### 5.2 兼容性分析 本需求为在现有 aclnnAngleV2 算子中**追加类型支持**,不破坏原有接口签名与调用规范。原有针对 float16、float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/1493 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [.] 文档更新 - [ ] 其他,请描述:AngleV2算子新增bf16支持 See merge request: cann/ops-math!2643 | 1 个月前 | |
增加A2 A3新算子支持 Co-authored-by: slx2008<shaolixin@huawei.com> # message auto-generated for no-merge-commit merge: !448 merge master into master 增加A2 A3新算子支持 Created-by: songkai111 Commit-by: slx2008 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!448 | 8 个月前 | |
【社区任务】AngleV2算子支持bf16实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !2643 merge dev-angle_v2 into master 【社区任务】AngleV2算子支持bf16实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。 ### 1.2 背景介绍 Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 $x < 0$ 时,其角度为 $\pi$;当 $x \ge 0$ 时,其角度为 $0$。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。 #### 1.2.1 TBE 算子现状分析 - **说明**:在系统的 TBE 算子库中,**未找到对应 AngleV2 的 TBE 源码**。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。 - 算子的核心逻辑基于 Ascend C 现有实现进行拓展。 #### 1.2.2 核心计算逻辑分析 针对 bf16 这种实数数据类型,其数学计算公式如下: $y = \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,分配 VECIN、VECOUT 的 TQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。 - **Process**: 1. **CopyIn**:使用 DataCopy 将 bf16 数据从 Global Memory 搬运至 Local Memory。 2. **Compute**:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 $x < 0$;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Cast 回 bf16。结合常数 $\pi$ ($3.1415926$) 计算得出 y。 3. **CopyOut**:将计算结果 y 从 Local Memory 搬运至 Global Memory。 **3.2.2.2 Ascend C 实现流程图** 以下为 Ascend C 侧算子执行流程图:  ### 3.3 支持硬件 - Atlas A2 训练系列产品 - Atlas A3 系列产品 ### 3.4 算子约束限制 - 输入 x 和输出 y 的 Shape 必须严格保持一致。 - 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。 ## 四、 特性交叉分析 不涉及。 ## 五、 可维可测分析 ### 5.1 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |---|---|---| | 精度标准 | 算子计算精度需满足 AscendOpTest 工具默认阈值。 | 任务书要求 | | 性能标准 | **bf16 性能需和 fp16 数据类型持平。** | 任务书要求 | ### 5.2 兼容性分析 本需求为在现有 aclnnAngleV2 算子中**追加类型支持**,不破坏原有接口签名与调用规范。原有针对 float16、float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/1493 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [.] 文档更新 - [ ] 其他,请描述:AngleV2算子新增bf16支持 See merge request: cann/ops-math!2643 | 1 个月前 | |
【社区任务】AngleV2算子支持bf16实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !2643 merge dev-angle_v2 into master 【社区任务】AngleV2算子支持bf16实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。 ### 1.2 背景介绍 Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 $x < 0$ 时,其角度为 $\pi$;当 $x \ge 0$ 时,其角度为 $0$。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。 #### 1.2.1 TBE 算子现状分析 - **说明**:在系统的 TBE 算子库中,**未找到对应 AngleV2 的 TBE 源码**。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。 - 算子的核心逻辑基于 Ascend C 现有实现进行拓展。 #### 1.2.2 核心计算逻辑分析 针对 bf16 这种实数数据类型,其数学计算公式如下: $y = \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,分配 VECIN、VECOUT 的 TQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。 - **Process**: 1. **CopyIn**:使用 DataCopy 将 bf16 数据从 Global Memory 搬运至 Local Memory。 2. **Compute**:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 $x < 0$;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Cast 回 bf16。结合常数 $\pi$ ($3.1415926$) 计算得出 y。 3. **CopyOut**:将计算结果 y 从 Local Memory 搬运至 Global Memory。 **3.2.2.2 Ascend C 实现流程图** 以下为 Ascend C 侧算子执行流程图:  ### 3.3 支持硬件 - Atlas A2 训练系列产品 - Atlas A3 系列产品 ### 3.4 算子约束限制 - 输入 x 和输出 y 的 Shape 必须严格保持一致。 - 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。 ## 四、 特性交叉分析 不涉及。 ## 五、 可维可测分析 ### 5.1 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |---|---|---| | 精度标准 | 算子计算精度需满足 AscendOpTest 工具默认阈值。 | 任务书要求 | | 性能标准 | **bf16 性能需和 fp16 数据类型持平。** | 任务书要求 | ### 5.2 兼容性分析 本需求为在现有 aclnnAngleV2 算子中**追加类型支持**,不破坏原有接口签名与调用规范。原有针对 float16、float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/1493 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [.] 文档更新 - [ ] 其他,请描述:AngleV2算子新增bf16支持 See merge request: cann/ops-math!2643 | 1 个月前 | |
【社区任务】AngleV2算子支持bf16实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !2643 merge dev-angle_v2 into master 【社区任务】AngleV2算子支持bf16实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。 ### 1.2 背景介绍 Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 $x < 0$ 时,其角度为 $\pi$;当 $x \ge 0$ 时,其角度为 $0$。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。 #### 1.2.1 TBE 算子现状分析 - **说明**:在系统的 TBE 算子库中,**未找到对应 AngleV2 的 TBE 源码**。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。 - 算子的核心逻辑基于 Ascend C 现有实现进行拓展。 #### 1.2.2 核心计算逻辑分析 针对 bf16 这种实数数据类型,其数学计算公式如下: $y = \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,分配 VECIN、VECOUT 的 TQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。 - **Process**: 1. **CopyIn**:使用 DataCopy 将 bf16 数据从 Global Memory 搬运至 Local Memory。 2. **Compute**:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 $x < 0$;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Cast 回 bf16。结合常数 $\pi$ ($3.1415926$) 计算得出 y。 3. **CopyOut**:将计算结果 y 从 Local Memory 搬运至 Global Memory。 **3.2.2.2 Ascend C 实现流程图** 以下为 Ascend C 侧算子执行流程图:  ### 3.3 支持硬件 - Atlas A2 训练系列产品 - Atlas A3 系列产品 ### 3.4 算子约束限制 - 输入 x 和输出 y 的 Shape 必须严格保持一致。 - 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。 ## 四、 特性交叉分析 不涉及。 ## 五、 可维可测分析 ### 5.1 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |---|---|---| | 精度标准 | 算子计算精度需满足 AscendOpTest 工具默认阈值。 | 任务书要求 | | 性能标准 | **bf16 性能需和 fp16 数据类型持平。** | 任务书要求 | ### 5.2 兼容性分析 本需求为在现有 aclnnAngleV2 算子中**追加类型支持**,不破坏原有接口签名与调用规范。原有针对 float16、float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/1493 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [.] 文档更新 - [ ] 其他,请描述:AngleV2算子新增bf16支持 See merge request: cann/ops-math!2643 | 1 个月前 | |
【社区任务】AngleV2算子支持bf16实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !2643 merge dev-angle_v2 into master 【社区任务】AngleV2算子支持bf16实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。 ### 1.2 背景介绍 Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 $x < 0$ 时,其角度为 $\pi$;当 $x \ge 0$ 时,其角度为 $0$。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。 #### 1.2.1 TBE 算子现状分析 - **说明**:在系统的 TBE 算子库中,**未找到对应 AngleV2 的 TBE 源码**。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。 - 算子的核心逻辑基于 Ascend C 现有实现进行拓展。 #### 1.2.2 核心计算逻辑分析 针对 bf16 这种实数数据类型,其数学计算公式如下: $y = \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,分配 VECIN、VECOUT 的 TQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。 - **Process**: 1. **CopyIn**:使用 DataCopy 将 bf16 数据从 Global Memory 搬运至 Local Memory。 2. **Compute**:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 $x < 0$;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Cast 回 bf16。结合常数 $\pi$ ($3.1415926$) 计算得出 y。 3. **CopyOut**:将计算结果 y 从 Local Memory 搬运至 Global Memory。 **3.2.2.2 Ascend C 实现流程图** 以下为 Ascend C 侧算子执行流程图:  ### 3.3 支持硬件 - Atlas A2 训练系列产品 - Atlas A3 系列产品 ### 3.4 算子约束限制 - 输入 x 和输出 y 的 Shape 必须严格保持一致。 - 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。 ## 四、 特性交叉分析 不涉及。 ## 五、 可维可测分析 ### 5.1 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |---|---|---| | 精度标准 | 算子计算精度需满足 AscendOpTest 工具默认阈值。 | 任务书要求 | | 性能标准 | **bf16 性能需和 fp16 数据类型持平。** | 任务书要求 | ### 5.2 兼容性分析 本需求为在现有 aclnnAngleV2 算子中**追加类型支持**,不破坏原有接口签名与调用规范。原有针对 float16、float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/1493 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [.] 文档更新 - [ ] 其他,请描述:AngleV2算子新增bf16支持 See merge request: cann/ops-math!2643 | 1 个月前 | |
剥离math下op_host/op_api到op_api Co-authored-by: yue-ma<mayue54@huawei.com> # message auto-generated for no-merge-commit merge: !4246 merge master into master 剥离math下op_host/op_api到op_api Created-by: yue-ma Commit-by: yue-ma Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 本次变更主要对 math 目录下多个算子的目录结构进行扁平化整理:将原先嵌套在 op_host/op_api/ 中的 API 实现文件直接提升到 op_api/ 层级 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/2392 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> UT/ST通过 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-math!4246 | 1 个月前 | |
【社区任务】AngleV2算子支持bf16实现贡献 Co-authored-by: Nice_try<nicetryzzw@163.com> # message auto-generated for no-merge-commit merge: !2643 merge dev-angle_v2 into master 【社区任务】AngleV2算子支持bf16实现贡献 Created-by: Nice_try Commit-by: Nice_try Merged-by: cann-robot Description: ## 一、 需求背景 ### 1.1 需求来源 通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C 算子库,为现有的 aclnnAngleV2 算子增加对 bfloat16 (bf16) 数据类型的支持。 ### 1.2 背景介绍 Angle 算子主要用于计算复数的辐角(相位角)或实数的角度。对于实数输入,当 $x < 0$ 时,其角度为 $\pi$;当 $x \ge 0$ 时,其角度为 $0$。当前 aclnnAngleV2 算子已支持多种数据类型,但缺少对 bf16 的支持。需要在原有代码框架下进行再开发,补齐 bf16 功能。 #### 1.2.1 TBE 算子现状分析 - **说明**:在系统的 TBE 算子库中,**未找到对应 AngleV2 的 TBE 源码**。因此,本设计文档不涉及 TBE 侧的实现逻辑对比,也无需提供 TBE 侧的实现流程图。 - 算子的核心逻辑基于 Ascend C 现有实现进行拓展。 #### 1.2.2 核心计算逻辑分析 针对 bf16 这种实数数据类型,其数学计算公式如下: $y = \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,分配 VECIN、VECOUT 的 TQue,并申请计算所需的临时 TBuf(若向量比较指令需要临时掩码空间)。 - **Process**: 1. **CopyIn**:使用 DataCopy 将 bf16 数据从 Global Memory 搬运至 Local Memory。 2. **Compute**:对于 bf16 类型,若硬件原生支持 bf16 的向量比较指令,则直接比较 $x < 0$;若当前架构 API 对 bf16 存在局限,可通过 Cast 指令先转换为 float32 进行掩码计算和赋值,完成后再 Cast 回 bf16。结合常数 $\pi$ ($3.1415926$) 计算得出 y。 3. **CopyOut**:将计算结果 y 从 Local Memory 搬运至 Global Memory。 **3.2.2.2 Ascend C 实现流程图** 以下为 Ascend C 侧算子执行流程图:  ### 3.3 支持硬件 - Atlas A2 训练系列产品 - Atlas A3 系列产品 ### 3.4 算子约束限制 - 输入 x 和输出 y 的 Shape 必须严格保持一致。 - 考虑到内存对齐要求,每次搬运的数据长度必须满足 32 Bytes(对于 bf16 为 16 个元素)的整数倍。 ## 四、 特性交叉分析 不涉及。 ## 五、 可维可测分析 ### 5.1 精度标准/性能标准 | 验收标准 | 描述 | 来源 | |---|---|---| | 精度标准 | 算子计算精度需满足 AscendOpTest 工具默认阈值。 | 任务书要求 | | 性能标准 | **bf16 性能需和 fp16 数据类型持平。** | 任务书要求 | ### 5.2 兼容性分析 本需求为在现有 aclnnAngleV2 算子中**追加类型支持**,不破坏原有接口签名与调用规范。原有针对 float16、float32 等数据类型的逻辑均保持不动,对上层框架及现有业务完全向后兼容。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-math/issues/1493 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [.] 文档更新 - [ ] 其他,请描述:AngleV2算子新增bf16支持 See merge request: cann/ops-math!2643 | 1 个月前 |
AngleV2
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR/Ascend 950DT | × |
| Atlas A3 训练系列产品/Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品/Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | × |
| Atlas 推理系列产品 | × |
| Atlas 训练系列产品 | √ |
| Kirin X90 处理器系列产品 | √ |
| Kirin 9030 处理器系列产品 | √ |
功能说明
-
算子功能:计算输入张量逐元素的角度(单位:弧度)。
-
计算公式:
outputi=angle(inputi)output_i=angle(input_i) outputi=angle(inputi)
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 待进行angle计算的入参,公式中的inputi。 | FLOAT16, FLOAT, COMPLEX64, BOOL, UINT8, INT8, INT16, INT32, INT64, BFLOAT16 | ND |
| y | 输出 | 待进行angle计算的出参,公式中的outputi。 | FLOAT16, FLOAT, BFLOAT16 | ND |
- Kirin X90/Kirin 9030 处理器系列产品: 不支持COMPLEX。
约束说明
无
调用说明
| 调用方式 | 调用样例 | 说明 |
|---|---|---|
| 图模式调用 | test_geir_angle_v2 | 通过算子IR构图方式调用AngleV2算子。 |