已合并
modified md files(for readability improvement) #655
gitee-duhuiping创建于 3月31日
modified md files(for readability improvement) #655
已合并
共 11 个文件变更+58-65
| @@ -12,10 +12,11 @@ aclnnStatus aclxxXxx(void *workspace, uint64_t workspaceSize, aclOpExecutor *exe | |||
| 12 | 其中“aclxx”表示算子接口前缀,如aclnn;而“Xxx”表示对应的算子类型,如Add算子。 | 12 | 其中“aclxx”表示算子接口前缀,如aclnn;而“Xxx”表示对应的算子类型,如Add算子。 |
| 13 | 13 | ||
| 14 | > 说明: | 14 | > 说明: |
| 15 | ->- workspace是指除输入/输出外,API在AI处理器上完成计算所需要的临时内存。 | 15 | +> |
| 16 | ->- 第二段接口aclxxXxx(...)不能重复调用,如下调用方式会出现异常: | 16 | +> - workspace是指除输入/输出外,API在AI处理器上完成计算所需要的临时内存。 |
| 17 | - ``` | 17 | +> - 第二段接口aclxxXxx(...)不能重复调用,如下调用方式会出现异常: |
| 18 | - aclxxXxxGetWorkspaceSize(...) | 18 | +> ```Cpp |
| 19 | - aclxxXxx(...) | 19 | +> aclxxXxxGetWorkspaceSize(...) |
| 20 | - aclxxXxx(...) | 20 | +> aclxxXxx(...) |
| 21 | - ``` | 21 | +> aclxxXxx(...) |
| 22 | +> ``` | ||
| @@ -13,6 +13,7 @@ aclTensor支持的数据类型参见[数据类型](数据类型.md),其中部 | |||
| 13 | >- 表中叉号(×)表示这两种类型不能进行推导计算。 | 13 | >- 表中叉号(×)表示这两种类型不能进行推导计算。 |
| 14 | 14 | ||
| 15 | **表 1** 数据类型推导关系 | 15 | **表 1** 数据类型推导关系 |
| 16 | + | ||
| 16 | | 数据类型 | f32 | f16 | f64 | bf16 | s8 | u8 | s16 | u16 | s32 | u32 | s64 | u64 | bool | c32 | c64 | c128 | | 17 | | 数据类型 | f32 | f16 | f64 | bf16 | s8 | u8 | s16 | u16 | s32 | u32 | s64 | u64 | bool | c32 | c64 | c128 | |
| 17 | | :------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | | 18 | | :------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | |
| 18 | | **f32** | f32 | f32 | f64 | f32 | f32 | f32 | f32 | × | f32 | × | f32 | × | f32 | c64 | c64 | c128 | | 19 | | **f32** | f32 | f32 | f64 | f32 | f32 | f32 | f32 | × | f32 | × | f32 | × | f32 | c64 | c64 | c128 | |
| @@ -118,7 +118,7 @@ endif() | |||
| 118 | Tiling一共需要三个交付件:```${op_name}_tiling.cpp``` ```${op_name}_tiling_key.h``` ```${op_name}_tiling_data.h``` | 118 | Tiling一共需要三个交付件:```${op_name}_tiling.cpp``` ```${op_name}_tiling_key.h``` ```${op_name}_tiling_data.h``` |
| 119 | 119 | ||
| 120 | > 说明: | 120 | > 说明: |
| 121 | - | 121 | +> |
| 122 | > 1. `${op_name}_tiling.cpp`放在`${op_name}/op_host`目录下; | 122 | > 1. `${op_name}_tiling.cpp`放在`${op_name}/op_host`目录下; |
| 123 | > 2. `${op_name}_tiling_key.h`和`${op_name}_tiling_data.h`放在`${op_name}/op_kernel`目录下; | 123 | > 2. `${op_name}_tiling_key.h`和`${op_name}_tiling_data.h`放在`${op_name}/op_kernel`目录下; |
| 124 | > 3. 如果`${op_name}_tiling.cpp`中需要引用`${op_name}_tiling_data.h`,请使用相对路径的方式,例如:`#incldue "../op_kernel/${op_name}_tiling_data.h"`。 | 124 | > 3. 如果`${op_name}_tiling.cpp`中需要引用`${op_name}_tiling_data.h`,请使用相对路径的方式,例如:`#incldue "../op_kernel/${op_name}_tiling_data.h"`。 |
| @@ -130,6 +130,7 @@ Tiling主要切分逻辑。 | |||
| 130 | 如需查看详细实现,请参考[add_example_tiling.cpp](../../../examples/add_example/op_host/add_example_tiling.cpp)。 | 130 | 如需查看详细实现,请参考[add_example_tiling.cpp](../../../examples/add_example/op_host/add_example_tiling.cpp)。 |
| 131 | 131 | ||
| 132 | > **样例中函数空实现说明:** | 132 | > **样例中函数空实现说明:** |
| 133 | +> | ||
| 133 | > 1. **TilingParse**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。 | 134 | > 1. **TilingParse**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。 |
| 134 | > 2. **CompileInfo**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。 | 135 | > 2. **CompileInfo**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。 |
| 135 | 136 | ||
| @@ -260,7 +261,7 @@ graph LR | |||
| 260 | Kernel一共需要两个交付件:```${op_name}.cpp``` ```${op_name}.h``` | 261 | Kernel一共需要两个交付件:```${op_name}.cpp``` ```${op_name}.h``` |
| 261 | 262 | ||
| 262 | > 说明: | 263 | > 说明: |
| 263 | - | 264 | +> |
| 264 | > 1. `${op_name}.cpp`为kernel的入口函数只能放在`${op_name}/op_kernel`目录下; | 265 | > 1. `${op_name}.cpp`为kernel的入口函数只能放在`${op_name}/op_kernel`目录下; |
| 265 | > 2. `${op_name}.h`文件可以按照不同SoC或模板放在对应目录下,例如:`${op_name}/op_kernel/arch32`、`${op_name}/op_kernel/arch35`或`${op_name}/op_kernel/impl`等目录下; | 266 | > 2. `${op_name}.h`文件可以按照不同SoC或模板放在对应目录下,例如:`${op_name}/op_kernel/arch32`、`${op_name}/op_kernel/arch35`或`${op_name}/op_kernel/impl`等目录下; |
| 266 | 267 | ||
| @@ -1,15 +1,17 @@ | |||
| 1 | -# 算子多平台适配指南 | 1 | +# 跨平台迁移指导 |
| 2 | 2 | ||
| 3 | 本指南介绍算子在多平台间迁移的适配要点与方案。以算子从Atlas A2系列迁移至Ascend 950系列为例,对比硬件架构差异项及所涉适配点,并提供相关算子适配样例。 | 3 | 本指南介绍算子在多平台间迁移的适配要点与方案。以算子从Atlas A2系列迁移至Ascend 950系列为例,对比硬件架构差异项及所涉适配点,并提供相关算子适配样例。 |
| 4 | 4 | ||
| 5 | - | ||
| 6 | ## 一、硬件架构及规格参数对比 | 5 | ## 一、硬件架构及规格参数对比 |
| 6 | + | ||
| 7 | ### Atlas A2 系列硬件架构 | 7 | ### Atlas A2 系列硬件架构 |
| 8 | + | ||
| 8 | <div align="center"> | 9 | <div align="center"> |
| 9 | <img src="../figures/Atlas A2硬件架构.png" width="900" alt="Atlas A2硬件架构" /> | 10 | <img src="../figures/Atlas A2硬件架构.png" width="900" alt="Atlas A2硬件架构" /> |
| 10 | </div> | 11 | </div> |
| 11 | 12 | ||
| 12 | ### Ascend 950 系列硬件架构 | 13 | ### Ascend 950 系列硬件架构 |
| 14 | + | ||
| 13 | <div align="center"> | 15 | <div align="center"> |
| 14 | <img src="../figures/Ascend 950硬件架构.png" width="900" alt="Ascend 950硬件架构" /> | 16 | <img src="../figures/Ascend 950硬件架构.png" width="900" alt="Ascend 950硬件架构" /> |
| 15 | </div> | 17 | </div> |
| @@ -45,27 +47,7 @@ | |||
| 45 | <td>23.5T</td> | 47 | <td>23.5T</td> |
| 46 | <td>54T</td> | 48 | <td>54T</td> |
| 47 | </tr> | 49 | </tr> |
| 48 | - <tr> | 50 | + |
| 49 | - <td rowspan="4">SOC</td> | ||
| 50 | - <td>L2 容量(MB)</td> | ||
| 51 | - <td>192</td> | ||
| 52 | - <td>128</td> | ||
| 53 | - </tr> | ||
| 54 | - <tr> | ||
| 55 | - <td>L2 带宽(read)</td> | ||
| 56 | - <td>4.4TB/s</td> | ||
| 57 | - <td>5.28TB/s</td> | ||
| 58 | - </tr> | ||
| 59 | - <tr> | ||
| 60 | - <td>跨Die带宽(单向有效带宽)</td> | ||
| 61 | - <td>180GB/s(1981)</td> | ||
| 62 | - <td>1.44TB/s(2Die)</td> | ||
| 63 | - </tr> | ||
| 64 | - <tr> | ||
| 65 | - <td>AICPU</td> | ||
| 66 | - <td>Linx910M 2GHz, 8C8T</td> | ||
| 67 | - <td>Linx816 1.5GHz, 8C16T</td> | ||
| 68 | - </tr> | ||
| 69 | <tr> | 51 | <tr> |
| 70 | <td rowspan="2">Memory</td> | 52 | <td rowspan="2">Memory</td> |
| 71 | <td>Memory 容量(GB)</td> | 53 | <td>Memory 容量(GB)</td> |
| @@ -79,7 +61,6 @@ | |||
| 79 | </tr> | 61 | </tr> |
| 80 | </table> | 62 | </table> |
| 81 | 63 | ||
| 82 | - | ||
| 83 | ## 二、硬件能力变更引入适配点 | 64 | ## 二、硬件能力变更引入适配点 |
| 84 | 65 | ||
| 85 | <table> | 66 | <table> |
| @@ -98,11 +79,11 @@ | |||
| 98 | <td>GM→L0A/L0B直连不再可用,需通过GM→L1→L0A/L0B完成;L1切块策略和MTE1/2流水需重构</td> | 79 | <td>GM→L0A/L0B直连不再可用,需通过GM→L1→L0A/L0B完成;L1切块策略和MTE1/2流水需重构</td> |
| 99 | </tr> | 80 | </tr> |
| 100 | <tr> | 81 | <tr> |
| 101 | - <td>ND DMA灵活数据搬运,支持随路ND->NZ转换</td> | 82 | + <td>ND DMA灵活数据搬运,支持随路ND->NZ转换</td> |
| 102 | <td>可用ND2NZ/DN2NZ在MTE2阶段完成格式转换,减少中间buffer和格式转换开销;需关注步长、对齐与NZ形状映射</td> | 83 | <td>可用ND2NZ/DN2NZ在MTE2阶段完成格式转换,减少中间buffer和格式转换开销;需关注步长、对齐与NZ形状映射</td> |
| 103 | </tr> | 84 | </tr> |
| 104 | <tr> | 85 | <tr> |
| 105 | - <td>支持Cube->Vector高效内部 数据通路:L1<->UB、L0C->UB、FIXP->UB</td> | 86 | + <td>支持Cube->Vector高效内部 数据通路:L1<->UB、L0C->UB、FIXP->UB</td> |
| 106 | <td>可在UB侧做中间累加/激活/融合(如切K累加、后处理),减少GM往返;对应同步与管线切分需调整</td> | 87 | <td>可在UB侧做中间累加/激活/融合(如切K累加、后处理),减少GM往返;对应同步与管线切分需调整</td> |
| 107 | </tr> | 88 | </tr> |
| 108 | <tr> | 89 | <tr> |
| @@ -138,10 +119,10 @@ | |||
| 138 | </tr> | 119 | </tr> |
| 139 | </table> | 120 | </table> |
| 140 | 121 | ||
| 141 | - | ||
| 142 | ## 三、推荐迁移步骤 | 122 | ## 三、推荐迁移步骤 |
| 123 | + | ||
| 143 | 1. 确认算子涉及的计算单元(Cube/Vector)和对应单元支持的数据类型是否在平台间存在差异。 | 124 | 1. 确认算子涉及的计算单元(Cube/Vector)和对应单元支持的数据类型是否在平台间存在差异。 |
| 144 | -2. 确认涉及的数据搬运单元(ND->NZ、GM<->Lx、集合通信等)是否在平台间存在差异。 | 125 | +2. 确认涉及的数据搬运单元(ND->NZ、GM<->Lx、集合通信等)是否在平台间存在差异。 |
| 145 | 3. 按硬件能力变更点逐项对照修改(Vector架构、Cube支持数据类型、L1/L0/UB大小、CCU通信等)。 | 126 | 3. 按硬件能力变更点逐项对照修改(Vector架构、Cube支持数据类型、L1/L0/UB大小、CCU通信等)。 |
| 146 | 4. 参考算子迁移样例调整/补齐 Atlas A2/Ascend 950 分支逻辑。 | 127 | 4. 参考算子迁移样例调整/补齐 Atlas A2/Ascend 950 分支逻辑。 |
| 147 | 128 | ||
| @@ -158,11 +139,13 @@ Ascend 950硬件新增同地址请求并行处理特性,不需要在各种分 | |||
| 158 | </div> | 139 | </div> |
| 159 | 140 | ||
| 160 | #### Tile尺寸大小调整 | 141 | #### Tile尺寸大小调整 |
| 142 | + | ||
| 161 | Atlas A2上L0C大小为128KB,Ascend 950提升到256KB,意味着单次可承载更大的累加结果块。迁移时可优先增大Tile块切分粒度或提高K方向单轮处理深度,以减少切块与切K轮次,降低循环控制和搬运开销。同时需要重新平衡L1/L0/UB容量预算,避免L0C放大后挤压A/B/scale缓冲导致流水断点。 | 143 | Atlas A2上L0C大小为128KB,Ascend 950提升到256KB,意味着单次可承载更大的累加结果块。迁移时可优先增大Tile块切分粒度或提高K方向单轮处理深度,以减少切块与切K轮次,降低循环控制和搬运开销。同时需要重新平衡L1/L0/UB容量预算,避免L0C放大后挤压A/B/scale缓冲导致流水断点。 |
| 162 | 144 | ||
| 163 | - | ||
| 164 | ### Vector向量计算类算子 | 145 | ### Vector向量计算类算子 |
| 146 | + | ||
| 165 | #### SIMT | 147 | #### SIMT |
| 148 | + | ||
| 166 | Ascend 950系列新增了SIMT单元。SIMT在处理非规整离散访问方面相比SIMD有较大优势,适合地址不连续、访存跨度变化大、分支路径不一致的场景(如scatter/gather、索引重排、稀疏更新等)。 | 149 | Ascend 950系列新增了SIMT单元。SIMT在处理非规整离散访问方面相比SIMD有较大优势,适合地址不连续、访存跨度变化大、分支路径不一致的场景(如scatter/gather、索引重排、稀疏更新等)。 |
| 167 | 150 | ||
| 168 | 迁移时建议优先识别"访存主导"且"向量化效率低"的算子子流程:若原有SIMD实现存在大量掩码分支、无效lane占比高、或需要复杂地址拼装,可将该部分改写为SIMT路径,通常可降低控制开销并提升有效访存吞吐。 | 151 | 迁移时建议优先识别"访存主导"且"向量化效率低"的算子子流程:若原有SIMD实现存在大量掩码分支、无效lane占比高、或需要复杂地址拼装,可将该部分改写为SIMT路径,通常可降低控制开销并提升有效访存吞吐。 |
| @@ -176,7 +159,8 @@ gather_v2算子根据合轴后的尾轴为单位进行gather,因此模板选 | |||
| 176 | **1. 编程模型差异** | 159 | **1. 编程模型差异** |
| 177 | 160 | ||
| 178 | SIMD实现采用传统的向量化编程模型,需显式管理UB缓冲区和流水队列: | 161 | SIMD实现采用传统的向量化编程模型,需显式管理UB缓冲区和流水队列: |
| 179 | -```cpp | 162 | + |
| 163 | +```Cpp | ||
| 180 | // SIMD: 使用队列机制管理数据缓冲 | 164 | // SIMD: 使用队列机制管理数据缓冲 |
| 181 | TQueBind<QuePosition::VECIN, QuePosition::VECOUT, BUFFER_NUM> inQueue_; | 165 | TQueBind<QuePosition::VECIN, QuePosition::VECOUT, BUFFER_NUM> inQueue_; |
| 182 | TBuf<QuePosition::VECCALC> indexBuf_; | 166 | TBuf<QuePosition::VECCALC> indexBuf_; |
| @@ -191,7 +175,8 @@ inQueue_.EnQue<int8_t>(xLocal); // 入队等待输出 | |||
| 191 | ``` | 175 | ``` |
| 192 | 176 | ||
| 193 | SIMT采用线程级并行模型,每个线程独立处理元素: | 177 | SIMT采用线程级并行模型,每个线程独立处理元素: |
| 194 | -```cpp | 178 | + |
| 179 | +```Cpp | ||
| 195 | // SIMT: 使用线程级并行,无需显式buffer管理 | 180 | // SIMT: 使用线程级并行,无需显式buffer管理 |
| 196 | __simt_vf__ LAUNCH_BOUND(2048) void GatherSimt(...) { | 181 | __simt_vf__ LAUNCH_BOUND(2048) void GatherSimt(...) { |
| 197 | for (INDEX_SIZE_T index = Simt::GetThreadIdx(); | 182 | for (INDEX_SIZE_T index = Simt::GetThreadIdx(); |
| @@ -217,10 +202,10 @@ __simt_vf__ LAUNCH_BOUND(2048) void GatherSimt(...) { | |||
| 217 | 202 | ||
| 218 | SIMD适合连续访问大块地址的场景,通过向量化指令高效处理连续数据; | 203 | SIMD适合连续访问大块地址的场景,通过向量化指令高效处理连续数据; |
| 219 | 204 | ||
| 220 | -SIMT适合离散访存,线程并行处理; | 205 | +SIMT适合离散访存,线程并行处理; |
| 221 | - | ||
| 222 | 206 | ||
| 223 | #### Regbase | 207 | #### Regbase |
| 208 | + | ||
| 224 | Ascend 950系列引入了Regbase编程范式,相比传统的Membase(Vector API)编程,Regbase更接近底层硬件的寄存器操作,提供更精细的向量化控制能力。 | 209 | Ascend 950系列引入了Regbase编程范式,相比传统的Membase(Vector API)编程,Regbase更接近底层硬件的寄存器操作,提供更精细的向量化控制能力。 |
| 225 | 210 | ||
| 226 | **特点** | 211 | **特点** |
| @@ -338,7 +323,9 @@ __VEC_SCOPE_ | |||
| 338 | 3. 混合使用:可在同一算子中结合两种范式,用Regbase处理核心计算逻辑,用Membase管理数据搬运 | 323 | 3. 混合使用:可在同一算子中结合两种范式,用Regbase处理核心计算逻辑,用Membase管理数据搬运 |
| 339 | 324 | ||
| 340 | ### Cube-Vector融合类算子 | 325 | ### Cube-Vector融合类算子 |
| 326 | + | ||
| 341 | #### MTE数据搬运路径变化 | 327 | #### MTE数据搬运路径变化 |
| 328 | + | ||
| 342 | Ascend 950新架构引入UB2L1 & L0C2UB间的直连通路,实现矩阵计算数据的快速搬移,旨在简化CV融合算子开发并提升性能。 | 329 | Ascend 950新架构引入UB2L1 & L0C2UB间的直连通路,实现矩阵计算数据的快速搬移,旨在简化CV融合算子开发并提升性能。 |
| 343 | <div align="center"> | 330 | <div align="center"> |
| 344 | <img src="../figures/Ascend950新增CV直连通路.png" width="700" alt="Ascend950新增CV直连通路" /> | 331 | <img src="../figures/Ascend950新增CV直连通路.png" width="700" alt="Ascend950新增CV直连通路" /> |
| @@ -353,7 +340,8 @@ Ascend 950新架构引入UB2L1 & L0C2UB间的直连通路,实现矩阵计算 | |||
| 353 | 启用L0C至UB(L0C2UB)直连通路,通过DataCopy接口,支持融合算子的矩阵计算结果直接搬入UB进行后续向量计算。 | 340 | 启用L0C至UB(L0C2UB)直连通路,通过DataCopy接口,支持融合算子的矩阵计算结果直接搬入UB进行后续向量计算。 |
| 354 | 341 | ||
| 355 | 对于切K或多阶段融合场景,可将"L0C搬回GM再读回UB"改为"L0C直达UB累加/后处理",降低GM往返带宽压力和时延。迁移时建议把中间结果归并、激活/量化前处理放到UB侧完成,并显式梳理MTE1/MTE2/MTE3与计算单元的事件同步顺序,确保跨单元流水连续,避免由于新增通路引入数据可见性或同步时序问题。关键使能接口定义可参考: | 342 | 对于切K或多阶段融合场景,可将"L0C搬回GM再读回UB"改为"L0C直达UB累加/后处理",降低GM往返带宽压力和时延。迁移时建议把中间结果归并、激活/量化前处理放到UB侧完成,并显式梳理MTE1/MTE2/MTE3与计算单元的事件同步顺序,确保跨单元流水连续,避免由于新增通路引入数据可见性或同步时序问题。关键使能接口定义可参考: |
| 356 | -```cpp | 343 | + |
| 344 | +```Cpp | ||
| 357 | // 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式 | 345 | // 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式 |
| 358 | template <typename T> | 346 | template <typename T> |
| 359 | __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams); | 347 | __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams); |
| @@ -375,6 +363,7 @@ __aicore__ inline void CrossCoreWaitFlag(uint16_t flagId) | |||
| 375 | ``` | 363 | ``` |
| 376 | 364 | ||
| 377 | #### 核间同步信号量匹配 | 365 | #### 核间同步信号量匹配 |
| 366 | + | ||
| 378 | `CrossCoreSetFlag` 和 `CrossCoreWaitFlag` 是核间同步信号量接口,广泛用于多核间的数据依赖与协同控制。本质上以"信号量"的方式实现不同AICore之间的数据处理阶段解耦与有序推进,常用于流水线控制、双缓冲切换、跨核协作等场景。 | 367 | `CrossCoreSetFlag` 和 `CrossCoreWaitFlag` 是核间同步信号量接口,广泛用于多核间的数据依赖与协同控制。本质上以"信号量"的方式实现不同AICore之间的数据处理阶段解耦与有序推进,常用于流水线控制、双缓冲切换、跨核协作等场景。 |
| 379 | 368 | ||
| 380 | - `CrossCoreSetFlag`:当前核(或线程)在完成某个阶段的数据处理后,主动设置指定的flag信号,告知依赖方(一般是其它核或下游流水线阶段)本阶段已完成,可以继续执行后续流程。 | 369 | - `CrossCoreSetFlag`:当前核(或线程)在完成某个阶段的数据处理后,主动设置指定的flag信号,告知依赖方(一般是其它核或下游流水线阶段)本阶段已完成,可以继续执行后续流程。 |
| @@ -382,7 +371,6 @@ __aicore__ inline void CrossCoreWaitFlag(uint16_t flagId) | |||
| 382 | 371 | ||
| 383 | 这套信号量的本质是保证多线程/多流水阶段间一致的同步序列,防止因资源未就绪或依赖没完成而发生数据竞争或死锁等硬件异常。详细的接口说明可参考官方文档:[CrossCoreSetFlag与CrossCoreWaitFlag核间同步接口详解](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/900beta1/API/ascendcopapi/atlasascendc_api_07_0273.html)。 | 372 | 这套信号量的本质是保证多线程/多流水阶段间一致的同步序列,防止因资源未就绪或依赖没完成而发生数据竞争或死锁等硬件异常。详细的接口说明可参考官方文档:[CrossCoreSetFlag与CrossCoreWaitFlag核间同步接口详解](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/900beta1/API/ascendcopapi/atlasascendc_api_07_0273.html)。 |
| 384 | 373 | ||
| 385 | - | ||
| 386 | 在Ascend 950上`CrossCoreWaitFlag`和`CrossCoreSetFlag`数量必须严格匹配,且建议在同一同步语义域内按"先生产后消费"的顺序成对设计。Atlas A2上算子与算子间若存在多余`CrossCoreSetFlag`信号量,HWTS会进行特殊处理清零计数器,Ascend 950系列为减少硬件开销,不再依赖该类兜底机制,要求单算子内核间同步信号量一一匹配,否则会出现必现卡死。 | 374 | 在Ascend 950上`CrossCoreWaitFlag`和`CrossCoreSetFlag`数量必须严格匹配,且建议在同一同步语义域内按"先生产后消费"的顺序成对设计。Atlas A2上算子与算子间若存在多余`CrossCoreSetFlag`信号量,HWTS会进行特殊处理清零计数器,Ascend 950系列为减少硬件开销,不再依赖该类兜底机制,要求单算子内核间同步信号量一一匹配,否则会出现必现卡死。 |
| 387 | 375 | ||
| 388 | 迁移时请重点排查以下问题:其一,异常分支提前返回导致只执行`Set`未执行对应`Wait`(或反之);其二,多stage流水复用同一`flagId`但生命周期重叠,造成"跨阶段串扰";其三,循环内条件触发同步但循环边界未对齐,导致迭代次数不一致。以上问题在Atlas A2上可能被掩盖,在Ascend 950上会直接暴露为阻塞超时或死锁。对跨核流水较复杂的算子,可先构建最小数据集进行单stage验证,再逐步叠加双缓冲和多stage,以降低定位同步问题的复杂度。 | 376 | 迁移时请重点排查以下问题:其一,异常分支提前返回导致只执行`Set`未执行对应`Wait`(或反之);其二,多stage流水复用同一`flagId`但生命周期重叠,造成"跨阶段串扰";其三,循环内条件触发同步但循环边界未对齐,导致迭代次数不一致。以上问题在Atlas A2上可能被掩盖,在Ascend 950上会直接暴露为阻塞超时或死锁。对跨核流水较复杂的算子,可先构建最小数据集进行单stage验证,再逐步叠加双缓冲和多stage,以降低定位同步问题的复杂度。 |
| @@ -397,6 +385,7 @@ Ascend 950引入集合通信加速器CCU1.0,降低了访存需求,减少了 | |||
| 397 | 385 | ||
| 398 | 以[MatmulAllReduce](https://gitcode.com/cann/ops-transformer/tree/master/mc2/matmul_all_reduce)算子迁移适配为例: | 386 | 以[MatmulAllReduce](https://gitcode.com/cann/ops-transformer/tree/master/mc2/matmul_all_reduce)算子迁移适配为例: |
| 399 | 设置NnopbaseSetHcclServerType枚举值,A2为NNOPBASE_HCCL_SERVER_AICPU,950为NNOPBASE_HCCL_SERVER_TYPE_CCU。 | 387 | 设置NnopbaseSetHcclServerType枚举值,A2为NNOPBASE_HCCL_SERVER_AICPU,950为NNOPBASE_HCCL_SERVER_TYPE_CCU。 |
| 388 | + | ||
| 400 | ```CPP | 389 | ```CPP |
| 401 | // ... | 390 | // ... |
| 402 | aclnnStatus aclnnMatmulAllReduce( | 391 | aclnnStatus aclnnMatmulAllReduce( |
| @@ -419,6 +408,7 @@ aclnnStatus aclnnMatmulAllReduce( | |||
| 419 | 2. 用于设置主流/附属流上自定义任务、参数定制的GenerateTask回调接口中,区分两套GE的KernelLaunch接口,分别调用AICPU通信或CCU通信的创建及定制流程。 | 408 | 2. 用于设置主流/附属流上自定义任务、参数定制的GenerateTask回调接口中,区分两套GE的KernelLaunch接口,分别调用AICPU通信或CCU通信的创建及定制流程。 |
| 420 | 409 | ||
| 421 | 静态图GE侧创建通信task的任务类型,A2为aicpu kfc server + kfc_stream;950为ccu server + ccu_stream。涉及代码文件:[matmul_all_reduce_gen_task.cpp](https://gitcode.com/cann/ops-transformer/blob/master/mc2/matmul_all_reduce/op_graph/matmul_all_reduce_gen_task.cpp) | 410 | 静态图GE侧创建通信task的任务类型,A2为aicpu kfc server + kfc_stream;950为ccu server + ccu_stream。涉及代码文件:[matmul_all_reduce_gen_task.cpp](https://gitcode.com/cann/ops-transformer/blob/master/mc2/matmul_all_reduce/op_graph/matmul_all_reduce_gen_task.cpp) |
| 411 | + | ||
| 422 | ```CPP | 412 | ```CPP |
| 423 | // ... | 413 | // ... |
| 424 | ge::Status MatmulAllReduceCalcParamFunc(gert::ExeResGenerationContext *context) | 414 | ge::Status MatmulAllReduceCalcParamFunc(gert::ExeResGenerationContext *context) |
| @@ -434,6 +424,7 @@ ge::Status MatmulAllReduceCalcParamFunc(gert::ExeResGenerationContext *context) | |||
| 434 | ``` | 424 | ``` |
| 435 | 425 | ||
| 436 | 静态图GenTask调用接口有区别,流程有差异。涉及代码文件:[matmul_all_reduce_gen_task.cpp](https://gitcode.com/cann/ops-transformer/blob/master/mc2/matmul_all_reduce/op_graph/matmul_all_reduce_gen_task.cpp) | 426 | 静态图GenTask调用接口有区别,流程有差异。涉及代码文件:[matmul_all_reduce_gen_task.cpp](https://gitcode.com/cann/ops-transformer/blob/master/mc2/matmul_all_reduce/op_graph/matmul_all_reduce_gen_task.cpp) |
| 427 | + | ||
| 437 | ```CPP | 428 | ```CPP |
| 438 | // ... | 429 | // ... |
| 439 | // A2 | 430 | // A2 |
| @@ -467,7 +458,6 @@ ge::Status MatmulAllReduceGenTaskFunc(const gert::ExeResGenerationContext *conte | |||
| 467 | // ... | 458 | // ... |
| 468 | ``` | 459 | ``` |
| 469 | 460 | ||
| 470 | - | ||
| 471 | ## 五、常见问题与性能调优建议(FAQ/性能小贴士) | 461 | ## 五、常见问题与性能调优建议(FAQ/性能小贴士) |
| 472 | 462 | ||
| 473 | 若算子在Ascend 950上性能不升反降时,可优先排查: | 463 | 若算子在Ascend 950上性能不升反降时,可优先排查: |
| @@ -121,7 +121,7 @@ pip3 install -r requirements.txt | |||
| 121 | 2. **安装CANN包** | 121 | 2. **安装CANN包** |
| 122 | 122 | ||
| 123 | 请单击[下载链接](https://ascend.devcloud.huaweicloud.com/artifactory/cann-run-mirror/software/master/),选择最新时间版本,并根据产品型号和环境架构下载对应包。安装命令如下,更多指导参考《[CANN软件安装指南](https://www.hiascend.com/document/redirect/CannCommunityInstWizard)》。 | 123 | 请单击[下载链接](https://ascend.devcloud.huaweicloud.com/artifactory/cann-run-mirror/software/master/),选择最新时间版本,并根据产品型号和环境架构下载对应包。安装命令如下,更多指导参考《[CANN软件安装指南](https://www.hiascend.com/document/redirect/CannCommunityInstWizard)》。 |
| 124 | - | 124 | + |
| 125 | - 安装CANN toolkit包 | 125 | - 安装CANN toolkit包 |
| 126 | 126 | ||
| 127 | ```bash | 127 | ```bash |
| @@ -148,10 +148,10 @@ pip3 install -r requirements.txt | |||
| 148 | - \$\{install\_path\}:表示指定安装路径,ops包需与toolkit包安装在相同路径,root 用户默认安装在`/usr/local/Ascend`目录。 | 148 | - \$\{install\_path\}:表示指定安装路径,ops包需与toolkit包安装在相同路径,root 用户默认安装在`/usr/local/Ascend`目录。 |
| 149 | 149 | ||
| 150 | - **场景2:体验已发布版本能力或基于已发布版本进行开发** | 150 | - **场景2:体验已发布版本能力或基于已发布版本进行开发** |
| 151 | - | ||
| 152 | - 请访问[CANN官网下载中心](https://www.hiascend.com/cann/download),选择发布版本(仅支持CANN 8.5.0及后续版本),并根据产品型号和环境架构下载对应包,最后参考网页提供的命令完成安装。 | ||
| 153 | 151 | ||
| 154 | -## 环境验 证 | 152 | + 请访问[CANN官网下载中心](https://www.hiascend.com/cann/download),选择发布版本(仅支持CANN 8.5.0及后续版本),并根据产品型号和环境架构下载对应包,最后参考网页提供的命令完成安装。 |
| 153 | + | ||
| 154 | +## 环境验证 | ||
| 155 | 155 | ||
| 156 | 安装完CANN包后,需验证环境和驱动是否正常。 | 156 | 安装完CANN包后,需验证环境和驱动是否正常。 |
| 157 | 157 | ||
| @@ -1,10 +1,10 @@ | |||
| 1 | # 算子列表 | 1 | # 算子列表 |
| 2 | 2 | ||
| 3 | > 说明: | 3 | > 说明: |
| 4 | - | 4 | +> |
| 5 | -> - **算子目录**:目录名为算子名小写下划线形式,每个目录承载该算子所有交付件,包括代码实现、examples、文档等,目录介绍参见[项目目录](./install/dir_structure.md)。 | 5 | +>- **算子目录**:目录名为算子名小写下划线形式,每个目录承载该算子所有交付件,包括代码实现、examples、文档等,目录介绍参见[项目目录](./install/dir_structure.md)。 |
| 6 | -> - **算子执行硬件单元**:大部分算子运行在AI Core,少部分算子运行在AI CPU。默认情况下,项目中提到的算子一般指AI Core算子。关于AI Core和AI CPU详细介绍参见[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语 > 硬件架构与数据处理原理”。 | 6 | +>- **算子执行硬件单元**:大部分算子运行在AI Core,少部分算子运行在AI CPU。默认情况下,项目中提到的算子一般指AI Core算子。关于AI Core和AI CPU详细介绍参见[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语 > 硬件架构与数据处理原理”。 |
| 7 | -> - **算子接口列表**:为方便调用算子,CANN提供一套C API执行算子,一般以aclnn为前缀,全量接口参见[aclnn列表](op_api_list.md)。 | 7 | +>- **算子接口列表**:为方便调用算子,CANN提供一套C API执行算子,一般以aclnn为前缀,全量接口参见[aclnn列表](op_api_list.md)。 |
| 8 | 8 | ||
| 9 | 项目提供的所有算子分类和算子列表如下: | 9 | 项目提供的所有算子分类和算子列表如下: |
| 10 | 10 | ||
| @@ -1,9 +1,9 @@ | |||
| 1 | # 简介 | 1 | # 简介 |
| 2 | 2 | ||
| 3 | > 说明: | 3 | > 说明: |
| 4 | - | 4 | +> |
| 5 | -> - 目前算子库中大部分算子运行在AI Core上,少部分算子运行在AI CPU上。默认情况下,项目中提到的算子指AI Core算子。 | 5 | +>- 目前算子库中大部分算子运行在AI Core上,少部分算子运行在AI CPU上。默认情况下,项目中提到的算子指AI Core算子。 |
| 6 | -> - 关于AI Core和AI CPU的介绍请参见[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语 > 硬件架构与数据处理原理”。 | 6 | +>- 关于AI Core和AI CPU的介绍请参见[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语 > 硬件架构与数据处理原理”。 |
| 7 | 7 | ||
| 8 | 本项目提供了AI Core算子和AI CPU算子的开发和调用样例,请开发者根据实际情况参考对应实现。 | 8 | 本项目提供了AI Core算子和AI CPU算子的开发和调用样例,请开发者根据实际情况参考对应实现。 |
| 9 | 9 | ||
| @@ -142,7 +142,7 @@ | |||
| 142 | - 输入和输出的数据类型仅支持FLOAT32。 | 142 | - 输入和输出的数据类型仅支持FLOAT32。 |
| 143 | - 属性`interpolation_mode`需要设置为`bilinear`。 | 143 | - 属性`interpolation_mode`需要设置为`bilinear`。 |
| 144 | - 属性`padding_mode`设置为`zeros`。 | 144 | - 属性`padding_mode`设置为`zeros`。 |
| 145 | - - 输入`x`的C轴的值为32或者(C轴的大小 * H轴的大小 * W轴的大小) < 20k。 | 145 | + - 输入`x`的C轴的值为32或者$(C轴的大小 * H轴的大小 * W轴的大小) < 20k$。 |
| 146 | - 不支持3D场景。 | 146 | - 不支持3D场景。 |
| 147 | 147 | ||
| 148 | - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>:2D场景下,数据类型不支持BFLOAT16。 | 148 | - <term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>、<term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>:2D场景下,数据类型不支持BFLOAT16。 |
| @@ -152,11 +152,11 @@ | |||
| 152 | 152 | ||
| 153 | - 3D场景下 | 153 | - 3D场景下 |
| 154 | - 属性`interpolation_mode`不支持配置为"bicubic"。 | 154 | - 属性`interpolation_mode`不支持配置为"bicubic"。 |
| 155 | - - 输入`x`的(D轴的大小 * H轴的大小 * W轴的大小) < INT32的最大值。 | 155 | + - 输入`x`的$(D轴的大小 * H轴的大小 * W轴的大小) < INT32的最大值$。 |
| 156 | -- 2D场景下,输入`x`的(H轴的大小 * W轴的大小) < INT32的最大值。 | 156 | +- 2D场景下,输入`x`的$(H轴的大小 * W轴的大小) < INT32的最大值$。 |
| 157 | - `x`和`grid`的shape,所有维度都必须大于0。 | 157 | - `x`和`grid`的shape,所有维度都必须大于0。 |
| 158 | -- 输入`x`的(D轴的大小 * H轴的大小 * W轴的大小) < INT32的最大值。 | 158 | +- 输入`x`的$(D轴的大小 * H轴的大小 * W轴的大小) < INT32的最大值$。 |
| 159 | -- grid的输入值*图片(长或宽)大于24位的二进制数(16777216),采样点可能存在误差,精度可能产生偏差。 | 159 | +- grid的$输入值 * 图片(长或宽)> 24位的二进制数(16777216)$,采样点可能存在误差,精度可能产生偏差。 |
| 160 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:如果grid存在超出[-1, 1]范围的数据,使用bicubic插值时,小值域数据计算可能存在误差,精度可能产生偏差。 | 160 | - <term>Atlas A2 训练系列产品/Atlas A2 推理系列产品</term>、<term>Atlas A3 训练系列产品/Atlas A3 推理系列产品</term>:如果grid存在超出[-1, 1]范围的数据,使用bicubic插值时,小值域数据计算可能存在误差,精度可能产生偏差。 |
| 161 | 161 | ||
| 162 | ## 调用说明 | 162 | ## 调用说明 |
| @@ -257,7 +257,7 @@ aclnnStatus aclnnGridSampler3D( | |||
| 257 | 257 | ||
| 258 | ## 约束说明 | 258 | ## 约束说明 |
| 259 | 259 | ||
| 260 | -- 输入`input`的(D轴的大小 * H轴的大小 * W轴的大小 < INT32的最大值。 | 260 | +- 输入`input`的$(D轴的大小 * H轴的大小 * W轴的大小) < INT32的最大值$。 |
| 261 | - 确定性计算: | 261 | - 确定性计算: |
| 262 | - aclnnGridSampler3D默认确定性实现。 | 262 | - aclnnGridSampler3D默认确定性实现。 |
| 263 | 263 | ||
| @@ -70,4 +70,4 @@ | |||
| 70 | 70 | ||
| 71 | | 调用方式 | 样例代码 | 说明 | | 71 | | 调用方式 | 样例代码 | 说明 | |
| 72 | | -------------- | --------------------------- |-------------------------------------------------------------------------| | 72 | | -------------- | --------------------------- |-------------------------------------------------------------------------| |
| 73 | -| aclnn | [test_aclnn_upsample_nearest2d.cpp](examples/test_aclnn_upsample_nearest2d.cpp) | 通过[aclnnUpsampleNearest2d](docs/aclnnUpsampleNearest2d.md)接口方式调用ResizeNearestNeighborV2算子。 | | 73 | +| aclnn | [test_aclnn_upsample_nearest2d.cpp](examples/test_aclnn_upsample_nearest2d.cpp) | 通过[aclnnUpsampleNearest2d](docs/aclnnUpsampleNearest2d.md)接口方式调用ResizeNearestNeighborV2算子。 | |
| @@ -49,7 +49,6 @@ aclnnStatus aclnnThreeInterpolateBackward( | |||
| 49 | 49 | ||
| 50 | - **参数说明** | 50 | - **参数说明** |
| 51 | 51 | ||
| 52 | - </style> | ||
| 53 | <table class="tg" style="undefined;table-layout: fixed; width: 1556px"><colgroup> | 52 | <table class="tg" style="undefined;table-layout: fixed; width: 1556px"><colgroup> |
| 54 | <col style="width: 171px"> | 53 | <col style="width: 171px"> |
| 55 | <col style="width: 121px"> | 54 | <col style="width: 121px"> |
| @@ -148,7 +147,8 @@ aclnnStatus aclnnThreeInterpolateBackward( | |||
| 148 | 147 | ||
| 149 | aclnnStatus: 返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 | 148 | aclnnStatus: 返回状态码,具体参见[aclnn返回码](../../../docs/zh/context/aclnn返回码.md)。 |
| 150 | 149 | ||
| 151 | - </style> | 150 | + 第一段接口完成入参校验,出现以下场景时报错: |
| 151 | + | ||
| 152 | <table class="tg" style="undefined;table-layout: fixed; width: 859px"><colgroup> | 152 | <table class="tg" style="undefined;table-layout: fixed; width: 859px"><colgroup> |
| 153 | <col style="width: 302px"> | 153 | <col style="width: 302px"> |
| 154 | <col style="width: 142px"> | 154 | <col style="width: 142px"> |