已合并
fix: Modify the AIDD docs issue #9326
zwj223创建于 7月30日
fix: Modify the AIDD docs issue #9326
已合并
从已删除 :master合入到cann/ops-transformermaster
共 22 个文件变更+102-98
| @@ -48,4 +48,4 @@ ops-transformer算子首个Beta版本8.5.0-beta.1 现已发布。本版本引入 | |||
| 48 | 48 | ||
| 49 | - mc2通信域支持统一的torch.dist.group问题。([Issue47](https://gitcode.com/cann/ops-transformer/issues/47)) | 49 | - mc2通信域支持统一的torch.dist.group问题。([Issue47](https://gitcode.com/cann/ops-transformer/issues/47)) |
| 50 | - add_example样例算子执行调用问题修复。([Issue174](https://gitcode.com/cann/ops-transformer/issues/174)) | 50 | - add_example样例算子执行调用问题修复。([Issue174](https://gitcode.com/cann/ops-transformer/issues/174)) |
| 51 | -- 修复install_deps.sh脚本不支持openEuler系统问题。([Issue255](https://gitcode.com/cann/ops-transformer/issues/255)) | 51 | +- 修复install_deps.sh脚本不支持openEuler系统的问题。([Issue255](https://gitcode.com/cann/ops-transformer/issues/255)) |
| @@ -84,7 +84,7 @@ | |||
| 84 | - 图片: | 84 | - 图片: |
| 85 | - 常用格式:推荐png格式,风格尽量与已有图片保持一致。 | 85 | - 常用格式:推荐png格式,风格尽量与已有图片保持一致。 |
| 86 | - 分辨率与清晰度:需清晰且尺寸适中,避免模糊或过度压缩。 | 86 | - 分辨率与清晰度:需清晰且尺寸适中,避免模糊或过度压缩。 |
| 87 | - - 文件大小:单张图片不建议超过10M。 | 87 | + - 文件大小:单张图片不建议超过10MB。 |
| 88 | - 版权:所有引用的图片、文献等资源,请确保合规性。 | 88 | - 版权:所有引用的图片、文献等资源,请确保合规性。 |
| 89 | 89 | ||
| 90 | ## 获取帮助 | 90 | ## 获取帮助 |
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | ## 使用须知 | 3 | ## 使用须知 |
| 4 | 4 | ||
| 5 | -本指南旨在帮助您快速上手CANN和`ops-transformer`算子仓的使用。为方便快速了解算子开发全流程,以**AddExample**算子为实践对象,算子源码位于`ops-transformer/examples/add_example`,操作流程如下: | 5 | +本指南旨在帮助开发者快速上手CANN和`ops-transformer`算子仓的使用。为方便快速了解算子开发全流程,以**AddExample**算子为实践对象,算子源码位于`ops-transformer/examples/add_example`,操作流程如下: |
| 6 | 6 | ||
| 7 | 1. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。 | 7 | 1. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。 |
| 8 | 8 | ||
| @@ -269,4 +269,4 @@ int main() { | |||
| 269 | 269 | ||
| 270 | ## 结语 | 270 | ## 结语 |
| 271 | 271 | ||
| 272 | -体验完上述流程,您已基本完成算子开发过程,如果您想进一步贡献新算子或学习更多高阶开发、调试等技能,请访问本项目README学习[进阶教程](../README.md#学习教程)和[贡献指南](../README.md#相关信息)等。 | 272 | +体验完上述流程,已基本完成算子开发过程,如果想进一步贡献新算子或学习更多高阶开发、调试等技能,请访问本项目README学习[进阶教程](../README.md#学习教程)和[贡献指南](../README.md#相关信息)等。 |
| @@ -124,7 +124,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 124 | <td>✗</td> | 124 | <td>✗</td> |
| 125 | <td>✓</td> | 125 | <td>✓</td> |
| 126 | <td>AI Core</td> | 126 | <td>AI Core</td> |
| 127 | - <td>在Sparse Flash Attention的基础上支持了[Per-Token-Head-Tile-128量化]输入。</td> | 127 | + <td>在Sparse Flash Attention的基础上支持了`Per-Token-Head-Tile-128量化`输入。</td> |
| 128 | </tr> | 128 | </tr> |
| 129 | <tr> | 129 | <tr> |
| 130 | <td>attention</td> | 130 | <td>attention</td> |
| @@ -374,7 +374,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 374 | <td>✓</td> | 374 | <td>✓</td> |
| 375 | <td>✓</td> | 375 | <td>✓</td> |
| 376 | <td>AI Core</td> | 376 | <td>AI Core</td> |
| 377 | - <td>完成路由专家AlltoAllv、Permute、GroupedMatMul融合并实现与共享专家MatMul并行融合,先通信后计算。</td> | 377 | + <td>完成路由专家AlltoAllV、Permute、GroupedMatMul融合并实现与共享专家MatMul并行融合,先通信后计算。</td> |
| 378 | </tr> | 378 | </tr> |
| 379 | <tr> | 379 | <tr> |
| 380 | <td>mc2</td> | 380 | <td>mc2</td> |
| @@ -384,7 +384,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 384 | <td>✓</td> | 384 | <td>✓</td> |
| 385 | <td>✓</td> | 385 | <td>✓</td> |
| 386 | <td>AI Core</td> | 386 | <td>AI Core</td> |
| 387 | - <td>完成路由专家AlltoAllv、Permute、QuantGroupedMatMul融合并实现与共享专家MatMul并行融合。</td> | 387 | + <td>完成路由专家AlltoAllV、Permute、QuantGroupedMatMul融合并实现与共享专家MatMul并行融合。</td> |
| 388 | </tr> | 388 | </tr> |
| 389 | <tr> | 389 | <tr> |
| 390 | <td>mc2</td> | 390 | <td>mc2</td> |
| @@ -424,7 +424,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 424 | <td>✓</td> | 424 | <td>✓</td> |
| 425 | <td>✓</td> | 425 | <td>✓</td> |
| 426 | <td>AI Core</td> | 426 | <td>AI Core</td> |
| 427 | - <td>完成路由专家GroupedMatMul、Unpermute、AlltoAllv融合并实现与共享专家MatMul并行融合,先计算后通信。</td> | 427 | + <td>完成路由专家GroupedMatMul、Unpermute、AlltoAllV融合并实现与共享专家MatMul并行融合,先计算后通信。</td> |
| 428 | </tr> | 428 | </tr> |
| 429 | <tr> | 429 | <tr> |
| 430 | <td>mc2</td> | 430 | <td>mc2</td> |
| @@ -554,7 +554,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 554 | <td>✓</td> | 554 | <td>✓</td> |
| 555 | <td>✓</td> | 555 | <td>✓</td> |
| 556 | <td>AI Core</td> | 556 | <td>AI Core</td> |
| 557 | - <td>对Token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AllToAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AllToAllV通信。</td> | 557 | + <td>对Token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AlltoAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AlltoAllV通信。</td> |
| 558 | </tr> | 558 | </tr> |
| 559 | <tr> | 559 | <tr> |
| 560 | <td>mc2</td> | 560 | <td>mc2</td> |
| @@ -584,7 +584,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 584 | <td>✓</td> | 584 | <td>✓</td> |
| 585 | <td>✓</td> | 585 | <td>✓</td> |
| 586 | <td>AI Core</td> | 586 | <td>AI Core</td> |
| 587 | - <td>对Token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AllToAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AllToAllV通信。</td> | 587 | + <td>对Token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AlltoAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AlltoAllV通信。</td> |
| 588 | </tr> | 588 | </tr> |
| 589 | <tr> | 589 | <tr> |
| 590 | <td>mc2</td> | 590 | <td>mc2</td> |
| @@ -594,7 +594,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 594 | <td>✓</td> | 594 | <td>✓</td> |
| 595 | <td>✓</td> | 595 | <td>✓</td> |
| 596 | <td>AI Core</td> | 596 | <td>AI Core</td> |
| 597 | - <td>对Token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AllToAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AllToAllV通信。</td> | 597 | + <td>对Token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AlltoAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AlltoAllV通信。</td> |
| 598 | </tr> | 598 | </tr> |
| 599 | <tr> | 599 | <tr> |
| 600 | <td>mc2</td> | 600 | <td>mc2</td> |
| @@ -624,7 +624,7 @@ Ascend 950支持的算子分类和算子列表如下: | |||
| 624 | <td>✓</td> | 624 | <td>✓</td> |
| 625 | <td>✓</td> | 625 | <td>✓</td> |
| 626 | <td>AI Core</td> | 626 | <td>AI Core</td> |
| 627 | - <td>完成路由专家QuantGroupedMatMul、Unpermute、AlltoAllv融合并实现与共享专家MatMul并行融合。</td> | 627 | + <td>完成路由专家QuantGroupedMatMul、Unpermute、AlltoAllV融合并实现与共享专家MatMul并行融合。</td> |
| 628 | </tr> | 628 | </tr> |
| 629 | <tr> | 629 | <tr> |
| 630 | <td>mc2</td> | 630 | <td>mc2</td> |
| @@ -1,7 +1,7 @@ | |||
| 1 | # aclnn返回码 | 1 | # aclnn返回码 |
| 2 | 2 | ||
| 3 | 调用aclnn API时,常见的接口返回码如[表1](#table1)所示。 | 3 | 调用aclnn API时,常见的接口返回码如[表1](#table1)所示。 |
| 4 | -对于异常状态码值,可以通过aclGetRecentErrMsg接口([《Runtime运行时 API》](https://hiascend.com/document/redirect/CannCommunityRuntimeApi))获取异常信息,您可以根据报错提示排查问题或者联系技术支持。 | 4 | +对于异常状态码值,可以通过aclGetRecentErrMsg接口([《Runtime运行时 API》](https://hiascend.com/document/redirect/CannCommunityRuntimeApi))获取异常信息,可根据报错提示排查问题或联系技术支持。 |
| 5 | 5 | ||
| 6 | **表1** 返回状态码 <a id="table1"></a> | 6 | **表1** 返回状态码 <a id="table1"></a> |
| 7 | 7 | ||
| @@ -8,7 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | ## 编译前准备 | 9 | ## 编译前准备 |
| 10 | 10 | ||
| 11 | -本章以开发和运行环境合设场景为例,即带AI处理器的机器既作为开发环境又作为运行环境。该场景下,代码开发和代码运行在同一台机器上。这里以**FlashAttentionScore算子**为例,其他算子的调用逻辑、流程、编译脚本与FlashAttentionScore算子大致一样,请根据实际情况自行修改API调用脚本(\*.cpp)和编译脚本(CMakeLists)。 | 11 | +本章以开发和运行环境合设场景为例,即带AI处理器的机器既作为开发环境又作为运行环境。该场景下,代码开发和代码运行在同一台机器上。这里以**FlashAttentionScore算子**为例,其他算子的调用逻辑、流程、编译脚本与FlashAttentionScore算子大致一样,请根据实际情况自行修改API调用脚本(\*.cpp)和编译脚本(CMakeLists)。 |
| 12 | 12 | ||
| 13 | - **示例代码** | 13 | - **示例代码** |
| 14 | 14 | ||
| @@ -124,21 +124,21 @@ | |||
| 124 | 124 | ||
| 125 | 其中${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际情况替换。 | 125 | 其中${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际情况替换。 |
| 126 | 3. 编译并运行。 | 126 | 3. 编译并运行。 |
| 127 | - - 进入CMakeLists.txt所在目录,执行如下命令,新建build目录存放生成的编译文件。 | 127 | + - 进入CMakeLists.txt所在目录,执行如下命令,新建build目录存放生成的编译文件。 |
| 128 | 128 | ||
| 129 | - ```bash | 129 | + ```bash |
| 130 | - mkdir -p build | 130 | + mkdir -p build |
| 131 | - ``` | 131 | + ``` |
| 132 | 132 | ||
| 133 | - - 进入build目录,执行cmake命令编译,再执行make命令生成可执行文件。 | 133 | + - 进入build目录,执行cmake命令编译,再执行make命令生成可执行文件。 |
| 134 | 134 | ||
| 135 | - ```bash | 135 | + ```bash |
| 136 | - cd build | 136 | + cd build |
| 137 | - cmake ../ -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE | 137 | + cmake ../ -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE |
| 138 | - make | 138 | + make |
| 139 | - ``` | 139 | + ``` |
| 140 | 140 | ||
| 141 | - 编译成功后,会在build目录的bin文件夹下生成opapi\_test可执行文件。 | 141 | + 编译成功后,会在build目录的bin文件夹下生成opapi\_test可执行文件。 |
| 142 | 142 | ||
| 143 | - 进入bin目录,运行可执行文件opapi\_test。 | 143 | - 进入bin目录,运行可执行文件opapi\_test。 |
| 144 | 144 | ||
| @@ -179,5 +179,5 @@ | |||
| 179 | 179 | ||
| 180 | ```text | 180 | ```text |
| 181 | aclnnFlashAttentionScoreGetWorkspaceSize failed. ERROR: 161001 | 181 | aclnnFlashAttentionScoreGetWorkspaceSize failed. ERROR: 161001 |
| 182 | - [ERROR msg][PID:xxxx] xxx(timesamp) AclNN_Parameter_Error(EZ1001): The query cannot be nullptr. | 182 | + [ERROR msg][PID:xxxx] xxx(timestamp) AclNN_Parameter_Error(EZ1001): The query cannot be nullptr. |
| 183 | ``` | 183 | ``` |
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | >**说明:** | 13 | >**说明:** |
| 14 | > | 14 | > |
| 15 | ->- 两段式接口参数说明时,为简化描述,**将原始数据格式“ACL\_FORMAT\_XXXX_”简写为“_XXXX_”**。 | 15 | +>- 两段式接口参数说明时,为简化描述,**将原始数据格式“ACL\_FORMAT\_XXXX_”简写为“\_XXXX_”**。 |
| 16 | >- 数据格式中各维度含义:N(Batch)表示批量大小、H(Height)表示特征图高度、W(Width)表示特征图宽度、C(Channels)表示特征图通道、D(Depth)表示特征图深度、L(Length)表示特征图长度。 | 16 | >- 数据格式中各维度含义:N(Batch)表示批量大小、H(Height)表示特征图高度、W(Width)表示特征图宽度、C(Channels)表示特征图通道、D(Depth)表示特征图深度、L(Length)表示特征图长度。 |
| 17 | 17 | ||
| 18 | ## 常见数据格式 | 18 | ## 常见数据格式 |
| @@ -14,7 +14,7 @@ aclTensor支持的数据类型参见[数据类型](data_type.md),其中部分 | |||
| 14 | > | 14 | > |
| 15 | >- 为方便描述,表格中使用的数据类型是**简写形式**,代表的含义:ACL\_FLOAT\(f32\)、ACL\_FLOAT16\(f16\)、ACL\_DOUBLE\(f64\)、ACL\_BF16\(bf16\)、ACL\_INT8\(s8\)、ACL\_UINT8\(u8\)、ACL\_INT16\(s16\)、ACL\_UINT16\(u16\)、ACL\_INT32\(s32\)、ACL\_UINT32\(u32\)、ACL\_INT64\(s64\)、ACL\_UINT64\(u64\)、ACL\_BOOL\(bool\)、ACL\_COMPLEX32\(c32\)、ACL\_COMPLEX64\(c64\)、ACL\_COMPLEX128\(c128\)。 | 15 | >- 为方便描述,表格中使用的数据类型是**简写形式**,代表的含义:ACL\_FLOAT\(f32\)、ACL\_FLOAT16\(f16\)、ACL\_DOUBLE\(f64\)、ACL\_BF16\(bf16\)、ACL\_INT8\(s8\)、ACL\_UINT8\(u8\)、ACL\_INT16\(s16\)、ACL\_UINT16\(u16\)、ACL\_INT32\(s32\)、ACL\_UINT32\(u32\)、ACL\_INT64\(s64\)、ACL\_UINT64\(u64\)、ACL\_BOOL\(bool\)、ACL\_COMPLEX32\(c32\)、ACL\_COMPLEX64\(c64\)、ACL\_COMPLEX128\(c128\)。 |
| 16 | >- 表格里表头和最左侧一列分别表示待推导的两个输入数据类型,表格中对应位置表示推导出的数据类型。 | 16 | >- 表格里表头和最左侧一列分别表示待推导的两个输入数据类型,表格中对应位置表示推导出的数据类型。 |
| 17 | ->- 表中叉号(×)表示这两种类型不能进行推导计算。 | 17 | +>- 表中叉号(×)表示这两种类型不能进行推导计算。 |
| 18 | 18 | ||
| 19 | **表1** 数据类型推导关系 | 19 | **表1** 数据类型推导关系 |
| 20 | 20 | ||
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | 基于单算子API执行方式调用算子API时,通常分为“两段式”,样式形如: | 3 | 基于单算子API执行方式调用算子API时,通常分为“两段式”,样式形如: |
| 4 | 4 | ||
| 5 | -```Cpp | 5 | +```cpp |
| 6 | aclnnStatus aclxxXxxGetWorkspaceSize(const aclTensor *src, ..., aclTensor *out, ..., uint64_t *workspaceSize, aclOpExecutor **executor); | 6 | aclnnStatus aclxxXxxGetWorkspaceSize(const aclTensor *src, ..., aclTensor *out, ..., uint64_t *workspaceSize, aclOpExecutor **executor); |
| 7 | aclnnStatus aclxxXxx(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream); | 7 | aclnnStatus aclxxXxx(void *workspace, uint64_t workspaceSize, aclOpExecutor *executor, aclrtStream stream); |
| 8 | ``` | 8 | ``` |
| @@ -16,7 +16,7 @@ aclnnStatus aclxxXxx(void *workspace, uint64_t workspaceSize, aclOpExecutor *exe | |||
| 16 | > - workspace是指除输入/输出外,算子在NPU上完成计算所需要的临时内存,workspaceSize表示临时内存的大小。 | 16 | > - workspace是指除输入/输出外,算子在NPU上完成计算所需要的临时内存,workspaceSize表示临时内存的大小。 |
| 17 | > - 第二段接口aclxxXxx(...)不能重复调用,如下调用方式会出现异常: | 17 | > - 第二段接口aclxxXxx(...)不能重复调用,如下调用方式会出现异常: |
| 18 | > | 18 | > |
| 19 | -> ```Cpp | 19 | +> ```cpp |
| 20 | > aclxxXxxGetWorkspaceSize(...) | 20 | > aclxxXxxGetWorkspaceSize(...) |
| 21 | > aclxxXxx(...) | 21 | > aclxxXxx(...) |
| 22 | > aclxxXxx(...) | 22 | > aclxxXxx(...) |
| @@ -30,7 +30,7 @@ CANN Simulator集成在CANN toolkit包里,参考[环境部署](../install/quic | |||
| 30 | 30 | ||
| 31 | # 快速开始 | 31 | # 快速开始 |
| 32 | 32 | ||
| 33 | -下面以[add_examples](../../../examples/add_example/)为例,对算子仿真进行详细说明 | 33 | +下面以[add_example](../../../examples/add_example/)为例,对算子仿真进行详细说明 |
| 34 | 34 | ||
| 35 | ## 算子编译 | 35 | ## 算子编译 |
| 36 | 36 | ||
| @@ -104,19 +104,19 @@ cannsim record [options] user_app | |||
| 104 | 2. 执行仿真命令,可参考以下使用示例 | 104 | 2. 执行仿真命令,可参考以下使用示例 |
| 105 | 105 | ||
| 106 | ```bash | 106 | ```bash |
| 107 | - 方式一:启用仿真,并将输出保存至 ./output目录,/path/to/app为算子程序 | 107 | + # 方式一:启用仿真,并将输出保存至 ./output目录,/path/to/app为算子程序 |
| 108 | $ cannsim record /path/to/app -o ./output -s Ascend950 | 108 | $ cannsim record /path/to/app -o ./output -s Ascend950 |
| 109 | 109 | ||
| 110 | - 方式二:启用仿真并生成报告,用于后续性能分析 | 110 | + # 方式二:启用仿真并生成报告,用于后续性能分析 |
| 111 | $ cannsim record /path/to/app -o ./output -s Ascend950 --gen-report | 111 | $ cannsim record /path/to/app -o ./output -s Ascend950 --gen-report |
| 112 | ``` | 112 | ``` |
| 113 | 113 | ||
| 114 | 3. 命令完成后,会在默认路径或指定的“output”目录下生成以“cannsim_{timestamp}_${user_app}”命名的文件夹,结构示例如下: | 114 | 3. 命令完成后,会在默认路径或指定的“output”目录下生成以“cannsim_{timestamp}_${user_app}”命名的文件夹,结构示例如下: |
| 115 | 115 | ||
| 116 | -```bash | 116 | + ```bash |
| 117 | -├─cannsim_{timestamp}_${user_app} | 117 | + ├─cannsim_{timestamp}_${user_app} |
| 118 | -├── cannsim.log | 118 | + ├── cannsim.log |
| 119 | -``` | 119 | + ``` |
| 120 | 120 | ||
| 121 | 4. 用户可以获取算子执行结果,并进行精度的对比,结果展示在cannsim.log,示例如下 | 121 | 4. 用户可以获取算子执行结果,并进行精度的对比,结果展示在cannsim.log,示例如下 |
| 122 | 122 | ||
| @@ -154,14 +154,14 @@ cannsim report [options] | |||
| 154 | 154 | ||
| 155 | ## 使用示例 | 155 | ## 使用示例 |
| 156 | 156 | ||
| 157 | -1. 参考仿真执行执行算子仿真,对比输出示例,确保对应的结果执行正确。 | 157 | +1. 参考仿真执行算子仿真,对比输出示例,确保对应的结果执行正确。 |
| 158 | 2. 执行仿真结果解析命令,可参考以下执行用例。 | 158 | 2. 执行仿真结果解析命令,可参考以下执行用例。 |
| 159 | 159 | ||
| 160 | ```bash | 160 | ```bash |
| 161 | - 在当前目录下生成性能分析报告(默认仅分析核0) | 161 | + # 在当前目录下生成性能分析报告(默认仅分析核0) |
| 162 | cannsim report -e /path/to/cannsim_{timestamp}_${user_app} | 162 | cannsim report -e /path/to/cannsim_{timestamp}_${user_app} |
| 163 | 163 | ||
| 164 | - 在指定目录下生成核0、核1、核11、核12的性能分析报告 | 164 | + # 在指定目录下生成核0、核1、核11、核12的性能分析报告 |
| 165 | cannsim report -e /path/to/cannsim_{timestamp}_${user_app} -o /path/to/report -n '0-1, 11-12' | 165 | cannsim report -e /path/to/cannsim_{timestamp}_${user_app} -o /path/to/report -n '0-1, 11-12' |
| 166 | ``` | 166 | ``` |
| 167 | 167 | ||
| @@ -15,7 +15,7 @@ | |||
| 15 | $HOME/ascend/log/debug/plog/plog-pid_*.log | 15 | $HOME/ascend/log/debug/plog/plog-pid_*.log |
| 16 | ``` | 16 | ``` |
| 17 | 17 | ||
| 18 | - 开启环境变量ASCEND_SLOG_PRINT_TO_STDOUT可以将log日志直接打屏显示(1:开启打屏,0:关闭打屏),配置示例如下: | 18 | + 开启环境变量ASCEND_SLOG_PRINT_TO_STDOUT可以将log日志直接打屏显示(1:开启打屏,0:关闭打屏),配置示例如下: |
| 19 | 19 | ||
| 20 | ```bash | 20 | ```bash |
| 21 | export ASCEND_SLOG_PRINT_TO_STDOUT=1 | 21 | export ASCEND_SLOG_PRINT_TO_STDOUT=1 |
| @@ -27,15 +27,15 @@ | |||
| 27 | 27 | ||
| 28 | 通过aclGetRecentErrMsg接口(参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityRuntimeApi))获取aclnn接口调用过程中的异常信息,使用方法如下: | 28 | 通过aclGetRecentErrMsg接口(参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityRuntimeApi))获取aclnn接口调用过程中的异常信息,使用方法如下: |
| 29 | 29 | ||
| 30 | - ```cpp | 30 | + ```cpp |
| 31 | - printf(aclGetRecentErrMsg()); | 31 | + printf("%s",aclGetRecentErrMsg()); |
| 32 | - ``` | 32 | + ``` |
| 33 | 33 | ||
| 34 | 打印错误信息样例如下: | 34 | 打印错误信息样例如下: |
| 35 | 35 | ||
| 36 | - ```text | 36 | + ```text |
| 37 | - [PID:646612] 2026-01-24-11:53:44.671.727 AclNN_Parameter_Error(EZ1001): Expected a proper Tensor but got null for argument addmmTennsor.self. | 37 | + [PID:646612] 2026-01-24-11:53:44.671.727 AclNN_Parameter_Error(EZ1001): Expected a proper Tensor but got null for argument addmmTensor.self. |
| 38 | - ``` | 38 | + ``` |
| 39 | 39 | ||
| 40 | ### 2. Kernel调试 | 40 | ### 2. Kernel调试 |
| 41 | 41 | ||
| @@ -231,5 +231,5 @@ | |||
| 231 | msprof op simulator --output=$PWD/pipeline_auto --kernel-name "AddExample" ./test_aclnn_add_example | 231 | msprof op simulator --output=$PWD/pipeline_auto --kernel-name "AddExample" ./test_aclnn_add_example |
| 232 | ``` | 232 | ``` |
| 233 | 233 | ||
| 234 | - 采集结果在本项目`$PWD/pipeline_auto/OPPROF_**`目录中。 | 234 | + 采集结果在本项目`$PWD/pipeline_auto/OPPROF_**`目录中。 |
| 235 | - 其中流水相关文件路径为`OPPROF**/simulator/visualize_data.bin`,可以借助[MindStudio Insight](https://www.hiascend.com/document/redirect/MindStudioInsight)工具中“基础操作 > 导入数据”章节查看如何导入流水数据。 | 235 | + 其中流水相关文件路径为`OPPROF_*/simulator/visualize_data.bin`,可以借助[MindStudio Insight](https://www.hiascend.com/document/redirect/MindStudioInsight)工具中“基础操作 > 导入数据”章节查看如何导入流水数据。 |
| @@ -88,7 +88,7 @@ foreach(EXAMPLES_OP_NAME ${ASCEND_OP_NAME}) | |||
| 88 | list(APPEND OP_DIR_LIST ${CMAKE_CURRENT_SOURCE_DIR}/examples/mc2/${EXAMPLES_OP_NAME}) | 88 | list(APPEND OP_DIR_LIST ${CMAKE_CURRENT_SOURCE_DIR}/examples/mc2/${EXAMPLES_OP_NAME}) |
| 89 | # 在examples目录下新增算子分类时,参考mc2目录增加命令语句如下: | 89 | # 在examples目录下新增算子分类时,参考mc2目录增加命令语句如下: |
| 90 | # elseif(IS_DIRECTORY ${EXAMPLES_${op_class}_DIR}) | 90 | # elseif(IS_DIRECTORY ${EXAMPLES_${op_class}_DIR}) |
| 91 | - # add_subdirectory(examples/${op_class}/${EXAMPLES_OP_NAME}") | 91 | + # add_subdirectory(examples/${op_class}/${EXAMPLES_OP_NAME}) |
| 92 | # list(APPEND OP_DIR_LIST ${CMAKE_CURRENT_SOURCE_DIR}/examples/${op_class}/${EXAMPLES_OP_NAME}) | 92 | # list(APPEND OP_DIR_LIST ${CMAKE_CURRENT_SOURCE_DIR}/examples/${op_class}/${EXAMPLES_OP_NAME}) |
| 93 | endif() | 93 | endif() |
| 94 | endforeach() | 94 | endforeach() |
| @@ -286,7 +286,7 @@ Kernel入口文件,包含主函数和调度逻辑。 | |||
| 286 | 286 | ||
| 287 | 如需查看详细实现,请参考[add_example.cpp](../../../examples/add_example/op_kernel/add_example.cpp)。 | 287 | 如需查看详细实现,请参考[add_example.cpp](../../../examples/add_example/op_kernel/add_example.cpp)。 |
| 288 | 288 | ||
| 289 | -```CPP | 289 | +```cpp |
| 290 | // 1、核函数定义 | 290 | // 1、核函数定义 |
| 291 | // schMode是一个模板参数,用于支持不同数据类型(如float和int32)的计算路径 | 291 | // schMode是一个模板参数,用于支持不同数据类型(如float和int32)的计算路径 |
| 292 | // __global__ __aicore__表示该函数是个全局函数,可以在AI Core上执行 | 292 | // __global__ __aicore__表示该函数是个全局函数,可以在AI Core上执行 |
| @@ -315,7 +315,7 @@ __global__ __aicore__ void add_example(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR | |||
| 315 | 315 | ||
| 316 | 如需查看详细实现,请参考[add_example.h](../../../examples/add_example/op_kernel/add_example.h)。 | 316 | 如需查看详细实现,请参考[add_example.h](../../../examples/add_example/op_kernel/add_example.h)。 |
| 317 | 317 | ||
| 318 | -```C++ | 318 | +```cpp |
| 319 | // 2、定义Kernel类 | 319 | // 2、定义Kernel类 |
| 320 | template <typename T> | 320 | template <typename T> |
| 321 | class AddExample | 321 | class AddExample |
| @@ -462,7 +462,7 @@ __aicore__ inline void AddExample<T>::Process() | |||
| 462 | 462 | ||
| 463 | ### UT验证 | 463 | ### UT验证 |
| 464 | 464 | ||
| 465 | -主要交付件代码开发过程中,可通过UT验证方式进行快速验证,无需编译部署算子包。 | 465 | +在主要交付件代码开发过程中,可通过UT验证方式进行快速验证,无需编译部署算子包。 |
| 466 | 466 | ||
| 467 | UT目录结构如下,需用户手动创建: | 467 | UT目录结构如下,需用户手动创建: |
| 468 | 468 | ||
| @@ -177,9 +177,9 @@ uint32_t AddExampleCpuKernel::Compute(CpuKernelContext& ctx) { | |||
| 177 | case DT_FLOAT: | 177 | case DT_FLOAT: |
| 178 | return AddCompute<float>(...); | 178 | return AddCompute<float>(...); |
| 179 | case DT_INT32: | 179 | case DT_INT32: |
| 180 | - return AddCompute<int32>(...); | 180 | + return AddCompute<int32_t>(...); |
| 181 | .... | 181 | .... |
| 182 | - default : return PARAM_INVALID; | 182 | + default : return kParamInvalid; |
| 183 | } | 183 | } |
| 184 | } | 184 | } |
| 185 | 185 | ||
| @@ -190,11 +190,11 @@ REGISTER_CPU_KERNEL(kAddExample, AddExampleCpuKernel); | |||
| 190 | 190 | ||
| 191 | ## aclnn适配 | 191 | ## aclnn适配 |
| 192 | 192 | ||
| 193 | -通常算子开发和编译完成后,会自动生成aclnn接口(一套基于C的API),无需做其他配置,可直接在应用程序中调用aclnn接口实现调用算子。 | 193 | +通常算子开发和编译完成后,会自动生成aclnn接口(一套基于C的API),无需做其他配置,可直接在应用程序中调用aclnn接口实现算子调用。 |
| 194 | 194 | ||
| 195 | ## 编译部署 | 195 | ## 编译部署 |
| 196 | 196 | ||
| 197 | -算子开发完成后,需对算子工程进行编译,生成自定义算子安装包\*\.run,具体操作如下: | 197 | +算子开发完成后,需对算子工程进行编译,生成自定义算子安装包 `*.run`,具体操作如下: |
| 198 | 198 | ||
| 199 | 1. **准备工作。** | 199 | 1. **准备工作。** |
| 200 | 200 | ||
| @@ -234,7 +234,7 @@ REGISTER_CPU_KERNEL(kAddExample, AddExampleCpuKernel); | |||
| 234 | 自定义算子包安装后在```${ASCEND_HOME_PATH}/opp/vendors/custom_transformer/scripts```目录会生成`uninstall.sh`,通过该脚本可卸载自定义算子包,命令如下: | 234 | 自定义算子包安装后在```${ASCEND_HOME_PATH}/opp/vendors/custom_transformer/scripts```目录会生成`uninstall.sh`,通过该脚本可卸载自定义算子包,命令如下: |
| 235 | 235 | ||
| 236 | ```bash | 236 | ```bash |
| 237 | - bash ${ASCEND_HOME_PATH}/opp/vendors/custom_transformer/scripts/uninstall.sh | 237 | + bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_transformer/scripts/uninstall.sh |
| 238 | ``` | 238 | ``` |
| 239 | 239 | ||
| 240 | ## 算子验证 | 240 | ## 算子验证 |
| @@ -99,8 +99,8 @@ | |||
| 99 | <td>所有使用int4_t的算子需要切换到支持的数据类型(如int8),并更新量化解算逻辑</td> | 99 | <td>所有使用int4_t的算子需要切换到支持的数据类型(如int8),并更新量化解算逻辑</td> |
| 100 | </tr> | 100 | </tr> |
| 101 | <tr> | 101 | <tr> |
| 102 | - <td>不支持4:2稀疏矩阵计算</td> | 102 | + <td>不支持4:2稀疏矩阵计算</td> |
| 103 | - <td>原依赖4:2稀疏特性提速的kernel需要改为稠密或其他支持的稀疏策略,并更新性能预期说明</td> | 103 | + <td>原依赖4:2稀疏特性提速的kernel需要改为稠密或其他支持的稀疏策略,并更新性能预期说明</td> |
| 104 | </tr> | 104 | </tr> |
| 105 | <tr> | 105 | <tr> |
| 106 | <td rowspan="1">存储单元</td> | 106 | <td rowspan="1">存储单元</td> |
| @@ -168,7 +168,7 @@ TBuf<QuePosition::VECCALC> indexBuf_; | |||
| 168 | for (int64_t j = 0; j < rows; j++) { | 168 | for (int64_t j = 0; j < rows; j++) { |
| 169 | INDICES_T index = GetIndex(yIdx, indiceEndIdx); // 标量读取索引 | 169 | INDICES_T index = GetIndex(yIdx, indiceEndIdx); // 标量读取索引 |
| 170 | int64_t xIndex = index * tilingData_->innerSize; | 170 | int64_t xIndex = index * tilingData_->innerSize; |
| 171 | - DataCopyPad(xLocal[j * colsAlign], xGm[offset], dataCoptExtParams, dataCopyPadExtParams); // 批量连续数搬入 | 171 | + DataCopyPad(xLocal[j * colsAlign], xGm[offset], dataCopyExtParams, dataCopyPadExtParams); // 批量连续数搬入 |
| 172 | } | 172 | } |
| 173 | inQueue_.EnQue<int8_t>(xLocal); // 入队等待输出 | 173 | inQueue_.EnQue<int8_t>(xLocal); // 入队等待输出 |
| 174 | ``` | 174 | ``` |
| @@ -231,6 +231,8 @@ __simd_vf__ __aicore__ void GenIndexBuf(ubuf int32_t* helpAddr, int32_t colFacto | |||
| 231 | AscendC::MicroAPI::RegTensor<int32_t> v0; | 231 | AscendC::MicroAPI::RegTensor<int32_t> v0; |
| 232 | AscendC::MicroAPI::RegTensor<int32_t> v1; | 232 | AscendC::MicroAPI::RegTensor<int32_t> v1; |
| 233 | AscendC::MicroAPI::RegTensor<int32_t> vd1; | 233 | AscendC::MicroAPI::RegTensor<int32_t> vd1; |
| 234 | + AscendC::MicroAPI::RegTensor<int32_t> vd2; | ||
| 235 | + AscendC::MicroAPI::RegTensor<int32_t> vd3; | ||
| 234 | 236 | ||
| 235 | // 创建全量掩码 | 237 | // 创建全量掩码 |
| 236 | AscendC::MicroAPI::MaskReg preg = | 238 | AscendC::MicroAPI::MaskReg preg = |
| @@ -251,10 +253,12 @@ __simd_vf__ __aicore__ void GenIndexBuf(ubuf int32_t* helpAddr, int32_t colFacto | |||
| 251 | 253 | ||
| 252 | ```cpp | 254 | ```cpp |
| 253 | // 动态掩码:处理尾部不完整数据 | 255 | // 动态掩码:处理尾部不完整数据 |
| 254 | -__simd_vf__ __aicore__ void GatherProcess(ubuf int8_t* curYAddr, uint16_t repeatimes, uint16_t computeSize) | 256 | +__simd_vf__ __aicore__ void GatherProcess(ubuf int8_t* curXAddr, ubuf int8_t* curYAddr, uint16_t repeatTimes, uint16_t computeSize) |
| 255 | { | 257 | { |
| 256 | MicroAPI::RegTensor<int8_t> vregTemp; | 258 | MicroAPI::RegTensor<int8_t> vregTemp; |
| 257 | MicroAPI::MaskReg preg; | 259 | MicroAPI::MaskReg preg; |
| 260 | + // sreg为剩余待处理元素(普通unit32_t标量计数) | ||
| 261 | + unit32_t sreg = static_cast<unit32_t>(repeatimes)*computeSize; | ||
| 258 | 262 | ||
| 259 | for (uint16_t r = 0; r < repeatTimes; r++) { | 263 | for (uint16_t r = 0; r < repeatTimes; r++) { |
| 260 | // 根据剩余元素数更新掩码 | 264 | // 根据剩余元素数更新掩码 |
| @@ -343,7 +347,7 @@ Ascend 950新架构引入UB2L1 & L0C2UB间的直连通路,实现矩阵计算 | |||
| 343 | ```cpp | 347 | ```cpp |
| 344 | // 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式 | 348 | // 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式 |
| 345 | template <typename T> | 349 | template <typename T> |
| 346 | -__aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams); | 350 | +__aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams); |
| 347 | 351 | ||
| 348 | // 2. 新增: 搬出接口增加L0C2UB的搬出,支持直接从L0C搬出到UB,支持Src&Dst都是LocalTensor的形式 | 352 | // 2. 新增: 搬出接口增加L0C2UB的搬出,支持直接从L0C搬出到UB,支持Src&Dst都是LocalTensor的形式 |
| 349 | template <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> | 353 | template <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> |
| @@ -356,9 +360,9 @@ struct FixpipeParamsC310 { | |||
| 356 | 360 | ||
| 357 | // 3. 能力增强: 核间同步接口新增模式3 | 361 | // 3. 能力增强: 核间同步接口新增模式3 |
| 358 | template <uint8_t modeId, pipe_t pipe> | 362 | template <uint8_t modeId, pipe_t pipe> |
| 359 | -__aicore__ inline void CrossCoreSetFlag(uint16_t flagId) | 363 | +__aicore__ inline void CrossCoreSetFlag(uint16_t flagId); |
| 360 | template <uint8_t modeId = 0, pipe_t pipe = PIPE_S> | 364 | template <uint8_t modeId = 0, pipe_t pipe = PIPE_S> |
| 361 | -__aicore__ inline void CrossCoreWaitFlag(uint16_t flagId) | 365 | +__aicore__ inline void CrossCoreWaitFlag(uint16_t flagId); |
| 362 | 366 | ||
| 363 | ``` | 367 | ``` |
| 364 | 368 | ||
| @@ -26,7 +26,7 @@ InferShape函数的作用是根据输入的shape推导输出的shape。 | |||
| 26 | 26 | ||
| 27 | 示例如下,`AddExample`算子完整代码请参考`examples/add_example/op_host`下[add_example_infershape.cpp](../../../examples/add_example/op_host/add_example_infershape.cpp)。 | 27 | 示例如下,`AddExample`算子完整代码请参考`examples/add_example/op_host`下[add_example_infershape.cpp](../../../examples/add_example/op_host/add_example_infershape.cpp)。 |
| 28 | 28 | ||
| 29 | -```C++ | 29 | +```cpp |
| 30 | // AddExample算子逻辑是两个数相加,因此输出shape与输入shape一致 | 30 | // AddExample算子逻辑是两个数相加,因此输出shape与输入shape一致 |
| 31 | static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context) | 31 | static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context) |
| 32 | { | 32 | { |
| @@ -44,7 +44,7 @@ static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context) | |||
| 44 | int64_t dim = xShape->GetDim(i); | 44 | int64_t dim = xShape->GetDim(i); |
| 45 | yShape->SetDim(i, dim); | 45 | yShape->SetDim(i, dim); |
| 46 | } | 46 | } |
| 47 | - .... | 47 | + ... |
| 48 | } | 48 | } |
| 49 | // inferShape注册 | 49 | // inferShape注册 |
| 50 | IMPL_OP_INFERSHAPE(AddExample).InferShape(InferShapeAddExample); | 50 | IMPL_OP_INFERSHAPE(AddExample).InferShape(InferShapeAddExample); |
| @@ -56,16 +56,16 @@ InferDataType函数的作用是根据输入的DataType推导输出的DataType。 | |||
| 56 | 56 | ||
| 57 | 示例如下,`AddExample`算子完整代码请参考`examples/add_example/op_graph`下[add_example_graph_infer.cpp](../../../examples/add_example/op_graph/add_example_graph_infer.cpp)。 | 57 | 示例如下,`AddExample`算子完整代码请参考`examples/add_example/op_graph`下[add_example_graph_infer.cpp](../../../examples/add_example/op_graph/add_example_graph_infer.cpp)。 |
| 58 | 58 | ||
| 59 | -```C++ | 59 | +```cpp |
| 60 | // AddExample算子逻辑是两个数相加,因此输出dataType与输入dataType一致 | 60 | // AddExample算子逻辑是两个数相加,因此输出dataType与输入dataType一致 |
| 61 | static ge::graphStatus InferDataTypeAddExample(gert::InferDataTypeContext* context) | 61 | static ge::graphStatus InferDataTypeAddExample(gert::InferDataTypeContext* context) |
| 62 | { | 62 | { |
| 63 | - .... | 63 | + ... |
| 64 | // 获取输入的dataType | 64 | // 获取输入的dataType |
| 65 | ge::DataType sizeDtype = context->GetInputDataType(IDX_0); | 65 | ge::DataType sizeDtype = context->GetInputDataType(IDX_0); |
| 66 | // 将输入dataType设置到输出 | 66 | // 将输入dataType设置到输出 |
| 67 | context->SetOutputDataType(IDX_0, sizeDtype); | 67 | context->SetOutputDataType(IDX_0, sizeDtype); |
| 68 | - .... | 68 | + ... |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | // 注册InferDataType | 71 | // 注册InferDataType |
| @@ -109,7 +109,7 @@ IMPL_OP(AddExample).InferDataType(InferDataTypeAddExample); | |||
| 109 | 109 | ||
| 110 | 示例代码如下,展示了如何注册`AddExample`算子: | 110 | 示例代码如下,展示了如何注册`AddExample`算子: |
| 111 | 111 | ||
| 112 | -```CPP | 112 | +```cpp |
| 113 | REG_OP(AddExample) | 113 | REG_OP(AddExample) |
| 114 | .INPUT(x1, TensorType({DT_FLOAT})) | 114 | .INPUT(x1, TensorType({DT_FLOAT})) |
| 115 | .INPUT(x2, TensorType({DT_FLOAT})) | 115 | .INPUT(x2, TensorType({DT_FLOAT})) |
| @@ -81,7 +81,7 @@ | |||
| 81 | 81 | ||
| 82 | 自定义算子包安装路径为```${ASCEND_HOME_PATH}/opp/vendors```,\$\{ASCEND\_HOME\_PATH\}已通过环境变量配置,表示CANN toolkit包安装路径,一般为\$\{install\_path\}/cann。 | 82 | 自定义算子包安装路径为```${ASCEND_HOME_PATH}/opp/vendors```,\$\{ASCEND\_HOME\_PATH\}已通过环境变量配置,表示CANN toolkit包安装路径,一般为\$\{install\_path\}/cann。 |
| 83 | 83 | ||
| 84 | - 如果部署算子包时通过配置--install-path参数指定了算子包的安装目录,则在使用自定义算子前,需要执行```source ${install-path}/vendors/${vendor_name}/bin/set_env.bash```命令,set_env.bash脚本中将自定义算子包的安装路径追加到环境变量ASCEND_CUSTOM_OPP_PATH中,使自定义算子在当前环境中生效。 | 84 | + 如果部署算子包时通过配置--install-path参数指定了算子包的安装目录,则在使用自定义算子前,需要执行```source ${install_path}/vendors/${vendor_name}/bin/set_env.bash```命令,set_env.bash脚本中将自定义算子包的安装路径追加到环境变量ASCEND_CUSTOM_OPP_PATH中,使自定义算子在当前环境中生效。 |
| 85 | 85 | ||
| 86 | 3. **(可选)删除自定义算子包** | 86 | 3. **(可选)删除自定义算子包** |
| 87 | 87 | ||
| @@ -46,7 +46,7 @@ | |||
| 46 | │ │ │ ├── ${op_name}_infershape.cpp # 可选,InferShape实现,根据算子形状推导输出shape,若未配置则输出shape与输入shape一样 | 46 | │ │ │ ├── ${op_name}_infershape.cpp # 可选,InferShape实现,根据算子形状推导输出shape,若未配置则输出shape与输入shape一样 |
| 47 | │ │ │ ├── ${op_name}_tiling_${sub_case}.cpp # 可选,针对某些子场景下的Tiling优化,${sub_case}表示子场景,如${op_name}_tiling_arch35是针对arch35架构的优化,若无该文件表明该算子没有对应子场景的特定Tiling策略;注意:Tiling实现文件名须包含 `_tiling` 标识才会被编译系统识别并参与编译 | 47 | │ │ │ ├── ${op_name}_tiling_${sub_case}.cpp # 可选,针对某些子场景下的Tiling优化,${sub_case}表示子场景,如${op_name}_tiling_arch35是针对arch35架构的优化,若无该文件表明该算子没有对应子场景的特定Tiling策略;注意:Tiling实现文件名须包含 `_tiling` 标识才会被编译系统识别并参与编译 |
| 48 | │ │ │ ├── ${op_name}_tiling_${sub_case}.h # 可选,${sub_case}子场景下Tiling实现用的头文件 | 48 | │ │ │ ├── ${op_name}_tiling_${sub_case}.h # 可选,${sub_case}子场景下Tiling实现用的头文件 |
| 49 | -│ │ │ ├── ${op_name}_tiling.cpp # 可选,若无该文件表明对应场景下无Tiling实现(将张量划分为多个小块,区分数据类型进行并行计算) | 49 | +│ │ │ ├── ${op_name}_tiling.cpp # 可选,若无该文件表明对应场景下无Tiling实现(将张量划分为多个小块,区分数据类型进行并行计算) |
| 50 | │ │ │ ├── ${op_name}_tiling.h # 可选,Tiling实现用的头文件 | 50 | │ │ │ ├── ${op_name}_tiling.h # 可选,Tiling实现用的头文件 |
| 51 | │ │ │ └── CMakeLists.txt # Host侧cmakelist文件 | 51 | │ │ │ └── CMakeLists.txt # Host侧cmakelist文件 |
| 52 | │ │ ├── op_api # 可选,算子aclnn实现文件目录,若未配置工程自动生成 | 52 | │ │ ├── op_api # 可选,算子aclnn实现文件目录,若未配置工程自动生成 |
| @@ -1,6 +1,6 @@ | |||
| 1 | # 环境部署 | 1 | # 环境部署 |
| 2 | 2 | ||
| 3 | -在学习各类[学习教程](../../../README.md#学习教程)操作之前,请您先参考下面步骤完成基础环境搭建和源码下载,确保已安装NPU驱动和CANN软件(`Ascend-cann-toolkit`和`Ascend-cann-ops`)等。 | 3 | +在学习各类[学习教程](../../../README.md#学习教程)操作之前,请先参考下面步骤完成基础环境搭建和源码下载,确保已安装NPU驱动、固件和CANN软件(`Ascend-cann-toolkit`和`Ascend-cann-ops`)等。 |
| 4 | 4 | ||
| 5 | ## 环境安装 | 5 | ## 环境安装 |
| 6 | 6 | ||
| @@ -33,12 +33,12 @@ | |||
| 33 | 33 | ||
| 34 | ### 方式2:Docker部署 | 34 | ### 方式2:Docker部署 |
| 35 | 35 | ||
| 36 | -对于有昇腾设备的开发者,若您想快速搭建昇腾环境,可使用Docker镜像部署。 | 36 | +对于有昇腾设备的开发者,若想快速搭建昇腾环境,可使用Docker镜像部署。 |
| 37 | 37 | ||
| 38 | > **说明**: | 38 | > **说明**: |
| 39 | > | 39 | > |
| 40 | -> - 镜像文件比较大,下载需要一定时间,请您耐心等待。关于docker命令的选项介绍可通过`docker --help`查询。 | 40 | +> - 镜像文件比较大,下载需要一定时间,请耐心等待。关于docker命令的选项介绍可通过`docker --help`查询。 |
| 41 | -> - 环境默认安装最新版本CANN包,源码下载时注意与软件配套。 | 41 | +> - 环境默认安装最新最新版本CANN包,源码下载时注意与软件配套。 |
| 42 | 42 | ||
| 43 | 1.**安装驱动(运行态依赖)** | 43 | 1.**安装驱动(运行态依赖)** |
| 44 | 44 | ||
| @@ -90,7 +90,7 @@ docker run --name cann_container --device /dev/davinci0 --device /dev/davinci_ma | |||
| 90 | 90 | ||
| 91 | ### 方式3:手动安装 | 91 | ### 方式3:手动安装 |
| 92 | 92 | ||
| 93 | -对于有昇腾设备的开发者,若您想手动搭建昇腾环境,请参考下述步骤。 | 93 | +对于有昇腾设备的开发者,若想手动搭建昇腾环境,请参考下述步骤。 |
| 94 | 94 | ||
| 95 | #### 安装软件 | 95 | #### 安装软件 |
| 96 | 96 | ||
| @@ -36,7 +36,7 @@ | |||
| 36 | - 基于**自定义算子包**执行算子样例,命令如下: | 36 | - 基于**自定义算子包**执行算子样例,命令如下: |
| 37 | 37 | ||
| 38 | ```bash | 38 | ```bash |
| 39 | - bash build.sh --run_example ${op} ${mode} ${pkg_mode} [--vendor_name=${vendor_name}] [--soc=${soc_version}] | 39 | + bash build.sh --run_example ${op} ${mode} ${pkg_mode} [--example_name=${example_name}] [--vendor_name=${vendor_name}] [--soc=${soc_version}] [--simulator=${simulator}] [--experimental=${experimental}] |
| 40 | # 以FlashAttentionScore算子example执行为例 | 40 | # 以FlashAttentionScore算子example执行为例 |
| 41 | # bash build.sh --run_example flash_attention_score eager cust --vendor_name=custom | 41 | # bash build.sh --run_example flash_attention_score eager cust --vendor_name=custom |
| 42 | ``` | 42 | ``` |
| @@ -125,7 +125,7 @@ mean result[1] is: 256.000000 | |||
| 125 | mean result[2] is: 256.000000 | 125 | mean result[2] is: 256.000000 |
| 126 | mean result[3] is: 256.000000 | 126 | mean result[3] is: 256.000000 |
| 127 | mean result[4] is: 256.000000 | 127 | mean result[4] is: 256.000000 |
| 128 | -mean result[4] is: 256.000000 | 128 | +mean result[5] is: 256.000000 |
| 129 | ... | 129 | ... |
| 130 | mean result[65532] is: 256.000000 | 130 | mean result[65532] is: 256.000000 |
| 131 | mean result[65533] is: 256.000000 | 131 | mean result[65533] is: 256.000000 |
| @@ -151,7 +151,7 @@ mean result[65535] is: 256.000000 | |||
| 151 | 151 | ||
| 152 | #### 调用流程 | 152 | #### 调用流程 |
| 153 | 153 | ||
| 154 | -为方便调用算子,Host侧提供算子对应的C语言API(即以aclnn为前缀的API)实现算子调用,无需提供算子IR(Intermediate Representation)定义。aclnn API调用流程如下 | 154 | +为方便调用算子,Host侧提供算子对应的C语言API(即以aclnn为前缀的API)实现算子调用,无需提供算子IR(Intermediate Representation)定义。aclnn API调用流程如下: |
| 155 | 155 | ||
| 156 |  | 156 |  |
| 157 | 157 | ||
| @@ -257,7 +257,7 @@ int main() | |||
| 257 | 257 | ||
| 258 | - **调用自定义算子**:依赖自定义算子包 | 258 | - **调用自定义算子**:依赖自定义算子包 |
| 259 | 259 | ||
| 260 | - ```bash | 260 | + ```cmake |
| 261 | cmake_minimum_required(VERSION 3.14) | 261 | cmake_minimum_required(VERSION 3.14) |
| 262 | # 设置工程名 | 262 | # 设置工程名 |
| 263 | project(ACLNN_EXAMPLE) | 263 | project(ACLNN_EXAMPLE) |
| @@ -322,7 +322,7 @@ int main() | |||
| 322 | 322 | ||
| 323 | - **调用标准算子(内置算子)**:依赖ops-transformer整包 | 323 | - **调用标准算子(内置算子)**:依赖ops-transformer整包 |
| 324 | 324 | ||
| 325 | - ```bash | 325 | + ```cmake |
| 326 | cmake_minimum_required(VERSION 3.14) | 326 | cmake_minimum_required(VERSION 3.14) |
| 327 | # 设置工程名 | 327 | # 设置工程名 |
| 328 | project(ACLNN_EXAMPLE) | 328 | project(ACLNN_EXAMPLE) |
| @@ -76,12 +76,12 @@ | |||
| 76 | |[aclnnFlashAttentionScoreGrad](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGrad.md)|训练场景下计算注意力的反向输出。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 76 | |[aclnnFlashAttentionScoreGrad](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGrad.md)|训练场景下计算注意力的反向输出。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 77 | |[aclnnFlashAttentionScoreGradV2](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGradV2.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionScoreV2](../../attention/flash_attention_score/docs/aclnnFlashAttentionScoreV2.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 77 | |[aclnnFlashAttentionScoreGradV2](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGradV2.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionScoreV2](../../attention/flash_attention_score/docs/aclnnFlashAttentionScoreV2.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 78 | |[aclnnFlashAttentionScoreGradV3](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGradV3.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionScoreV3](../../attention/flash_attention_score/docs/aclnnFlashAttentionScoreV3.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 78 | |[aclnnFlashAttentionScoreGradV3](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGradV3.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionScoreV3](../../attention/flash_attention_score/docs/aclnnFlashAttentionScoreV3.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 79 | -|[aclnnFlashAttentionScoreGradV4](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGradV4.md)|训练场景下计算注意力的反向输出,即[FlashAttentionScoreV4](../../attention/flash_attention_score/docs/aclnnFlashAttentionScoreV4.md)的反向计算。该接口query、key、value参数支持多个长度相等或者长度不相等的sequence。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 79 | +|[aclnnFlashAttentionScoreGradV4](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionScoreGradV4.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionScoreV4](../../attention/flash_attention_score/docs/aclnnFlashAttentionScoreV4.md)的反向计算。该接口query、key、value参数支持多个长度相等或者长度不相等的sequence。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 80 | |[aclnnFlashAttentionUnpaddingScoreGrad](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGrad.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionVarLenScore](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScore.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 80 | |[aclnnFlashAttentionUnpaddingScoreGrad](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGrad.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionVarLenScore](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScore.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 81 | |[aclnnFlashAttentionUnpaddingScoreGradV2](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV2.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionVarLenScoreV2](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV2.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 81 | |[aclnnFlashAttentionUnpaddingScoreGradV2](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV2.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionVarLenScoreV2](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV2.md)的反向计算。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 82 | |[aclnnFlashAttentionUnpaddingScoreGradV3](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV3.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionVarLenScoreV3](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV3.md)的反向计算。该接口相较于[aclnnFlashAttentionUnpaddingScoreGradV2](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV2.md)接口,新增queryRope、keyRope、dqRope和dkRope参数。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 82 | |[aclnnFlashAttentionUnpaddingScoreGradV3](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV3.md)|训练场景下计算注意力的反向输出,即[aclnnFlashAttentionVarLenScoreV3](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV3.md)的反向计算。该接口相较于[aclnnFlashAttentionUnpaddingScoreGradV2](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV2.md)接口,新增queryRope、keyRope、dqRope和dkRope参数。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 83 | |[aclnnFlashAttentionUnpaddingScoreGradV4](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV4.md)|训练场景下计算注意力的反向输出。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 83 | |[aclnnFlashAttentionUnpaddingScoreGradV4](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV4.md)|训练场景下计算注意力的反向输出。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 84 | -|[aclnnFlashAttentionUnpaddingScoreGradV5](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV5.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。增加`sinkInOptional`可选输入。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 84 | +|[aclnnFlashAttentionUnpaddingScoreGradV5](../../attention/flash_attention_score_grad/docs/aclnnFlashAttentionUnpaddingScoreGradV5.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。增加`sinkInOptional`可选输入。本接口为反向输出。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 85 | |[aclnnFlashAttentionVarLenScore](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScore.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。|默认确定性实现| 默认确定性实现 | | 85 | |[aclnnFlashAttentionVarLenScore](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScore.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。|默认确定性实现| 默认确定性实现 | |
| 86 | |[aclnnFlashAttentionVarLenScoreV2](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV2.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。|默认确定性实现| 默认确定性实现 | | 86 | |[aclnnFlashAttentionVarLenScoreV2](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV2.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。|默认确定性实现| 默认确定性实现 | |
| 87 | |[aclnnFlashAttentionVarLenScoreV3](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV3.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。|默认确定性实现| 默认确定性实现 | | 87 | |[aclnnFlashAttentionVarLenScoreV3](../../attention/flash_attention_score/docs/aclnnFlashAttentionVarLenScoreV3.md)|训练场景下,使用FlashAttention算法实现self-attention(自注意力)的计算。|默认确定性实现| 默认确定性实现 | |
| @@ -102,9 +102,9 @@ | |||
| 102 | |[aclnnGroupedMatmulFinalizeRoutingV2](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingV2.md)|GroupedMatmul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作。|默认非确定性实现,支持配置开启| - | | 102 | |[aclnnGroupedMatmulFinalizeRoutingV2](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingV2.md)|GroupedMatmul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作。|默认非确定性实现,支持配置开启| - | |
| 103 | |[aclnnGroupedMatmulFinalizeRoutingV3](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingV3.md)|GroupedMatmul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作。|默认非确定性实现,支持配置开启| 默认确定性实现 | | 103 | |[aclnnGroupedMatmulFinalizeRoutingV3](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingV3.md)|GroupedMatmul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作。|默认非确定性实现,支持配置开启| 默认确定性实现 | |
| 104 | |[aclnnGroupedMatmulFinalizeRoutingWeightNz](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingWeightNz.md)|GroupedMatMul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作,支持输入Weight为AI处理器亲和数据排布格式(NZ)。|默认非确定性实现,支持配置开启| - | | 104 | |[aclnnGroupedMatmulFinalizeRoutingWeightNz](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingWeightNz.md)|GroupedMatMul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作,支持输入Weight为AI处理器亲和数据排布格式(NZ)。|默认非确定性实现,支持配置开启| - | |
| 105 | -|[aclnnGroupedMatmulFinalizeRoutingWeightNzV2](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingWeightNzV2.md)|GroupedMatmul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作,支持w为AI处理器亲和数据排布格式(NZ)。|默认非确定性实现,支持配置开启| 默认确定性实现 | | 105 | +|[aclnnGroupedMatmulFinalizeRoutingWeightNzV2](../../gmm/grouped_matmul_finalize_routing/docs/aclnnGroupedMatmulFinalizeRoutingWeightNzV2.md)|GroupedMatmul和MoeFinalizeRouting的融合算子,GroupedMatmul计算后的输出按照索引做combine动作,支持输入Weight为AI处理器亲和数据排布格式(NZ)。|默认非确定性实现,支持配置开启| 默认确定性实现 | |
| 106 | |[aclnnGroupedMatmulSwigluQuant](../../gmm/grouped_matmul_swiglu_quant/docs/aclnnGroupedMatmulSwigluQuant.md)|融合GroupedMatMul、Dequant、Swiglu和Quant。|默认确定性实现| - | | 106 | |[aclnnGroupedMatmulSwigluQuant](../../gmm/grouped_matmul_swiglu_quant/docs/aclnnGroupedMatmulSwigluQuant.md)|融合GroupedMatMul、Dequant、Swiglu和Quant。|默认确定性实现| - | |
| 107 | -|[aclnnGroupedMatmulSwigluQuantV2](../../gmm/grouped_matmul_swiglu_quant_v2/docs/aclnnGroupedMatmulSwigluQuantV2.md)|融合GroupedMatmul 、dequant、swiglu和quant。|默认确定性实现| 默认确定性实现 | | 107 | +|[aclnnGroupedMatmulSwigluQuantV2](../../gmm/grouped_matmul_swiglu_quant_v2/docs/aclnnGroupedMatmulSwigluQuantV2.md)|融合GroupedMatmul 、Dequant、Swiglu和Quant。|默认确定性实现| 默认确定性实现 | |
| 108 | |[aclnnGroupedMatmulSwigluQuantWeightNZ](../../gmm/grouped_matmul_swiglu_quant/docs/aclnnGroupedMatmulSwigluQuantWeightNZ.md)|融合GroupedMatMul、Dequant、Swiglu和Quant,输入权重Weight会被强制视为NZ格式。|默认确定性实现| - | | 108 | |[aclnnGroupedMatmulSwigluQuantWeightNZ](../../gmm/grouped_matmul_swiglu_quant/docs/aclnnGroupedMatmulSwigluQuantWeightNZ.md)|融合GroupedMatMul、Dequant、Swiglu和Quant,输入权重Weight会被强制视为NZ格式。|默认确定性实现| - | |
| 109 | |[aclnnGroupedMatmulSwigluQuantWeightNzV2](../../gmm/grouped_matmul_swiglu_quant_v2/docs/aclnnGroupedMatmulSwigluQuantWeightNzV2.md)|融合GroupedMatMul、Dequant、Swiglu和Quant,输入权重Weight会被强制视为NZ格式。|默认确定性实现| 默认确定性实现 | | 109 | |[aclnnGroupedMatmulSwigluQuantWeightNzV2](../../gmm/grouped_matmul_swiglu_quant_v2/docs/aclnnGroupedMatmulSwigluQuantWeightNzV2.md)|融合GroupedMatMul、Dequant、Swiglu和Quant,输入权重Weight会被强制视为NZ格式。|默认确定性实现| 默认确定性实现 | |
| 110 | |[aclnnGroupedMatmulWeightNz](../../gmm/grouped_matmul/docs/aclnnGroupedMatmulWeightNz.md)|实现分组矩阵乘计算,每组矩阵乘的维度大小可以不同,输入权重Weight会被强制视为NZ格式。|默认确定性实现| 默认确定性实现 | | 110 | |[aclnnGroupedMatmulWeightNz](../../gmm/grouped_matmul/docs/aclnnGroupedMatmulWeightNz.md)|实现分组矩阵乘计算,每组矩阵乘的维度大小可以不同,输入权重Weight会被强制视为NZ格式。|默认确定性实现| 默认确定性实现 | |
| @@ -117,7 +117,7 @@ | |||
| 117 | |[aclnnInterleaveRope](../../posembedding/interleave_rope/docs/aclnnInterleaveRope.md)|针对单输入x进行旋转位置编码。|- | 默认确定性实现 | | 117 | |[aclnnInterleaveRope](../../posembedding/interleave_rope/docs/aclnnInterleaveRope.md)|针对单输入x进行旋转位置编码。|- | 默认确定性实现 | |
| 118 | |[aclnnKvCompressEpilog](../../attention/kv_compress_epilog/docs/aclnnKvCompressEpilog.md)|在KV Cache的Epilog阶段,对缓存进行原地逐组动态量化压缩更新,将bfloat16激活值压缩为FP8格式并按slotMapping散写。|- | 默认确定性实现 | | 118 | |[aclnnKvCompressEpilog](../../attention/kv_compress_epilog/docs/aclnnKvCompressEpilog.md)|在KV Cache的Epilog阶段,对缓存进行原地逐组动态量化压缩更新,将bfloat16激活值压缩为FP8格式并按slotMapping散写。|- | 默认确定性实现 | |
| 119 | |[aclnnLightningIndexer](../../attention/lightning_indexer/docs/aclnnLightningIndexer.md)|稀疏attention前处理的计算,目的是选出关键的稀疏token位置。|默认确定性实现| 默认确定性实现 | | 119 | |[aclnnLightningIndexer](../../attention/lightning_indexer/docs/aclnnLightningIndexer.md)|稀疏attention前处理的计算,目的是选出关键的稀疏token位置。|默认确定性实现| 默认确定性实现 | |
| 120 | -|[aclnnLightningIndexerGrad](../../attention/lightning_indexer_grad/docs/aclnnLightningIndexerGrad.md)|训练场景下,实现LightningIndexer反向,其中输入有Query, Key, Weights, Dy, Indices,反向主要利用正向计算的Indices从Key中提取TopK序列从而降低Matmul计算量。|默认非确定性实现,不支持配置开启| | 120 | +|[aclnnLightningIndexerGrad](../../attention/lightning_indexer_grad/docs/aclnnLightningIndexerGrad.md)|训练场景下,实现LightningIndexer反向,其中输入有Query, Key, Weights, Dy, Indices,反向主要利用正向计算的Indices从Key中提取TopK序列从而降低Matmul计算量。|默认非确定性实现,不支持配置开启| -| |
| 121 | |[aclnnLightningIndexerV2](../../attention/lightning_indexer_v2/docs/aclnnLightningIndexerV2.md)|稀疏attention前处理的计算,目的是选出关键的稀疏token位置。支持KV压缩场景。|默认确定性实现| 默认确定性实现 | | 121 | |[aclnnLightningIndexerV2](../../attention/lightning_indexer_v2/docs/aclnnLightningIndexerV2.md)|稀疏attention前处理的计算,目的是选出关键的稀疏token位置。支持KV压缩场景。|默认确定性实现| 默认确定性实现 | |
| 122 | |[aclnnLightningIndexerV2Metadata](../../attention/lightning_indexer_v2_metadata/docs/aclnnLightningIndexerV2Metadata.md)| aclnnLightningIndexerV2接口的前置接口,用于计算aclnnLightningIndexerV2的负载均衡。|默认确定性实现|默认确定性实现| | 122 | |[aclnnLightningIndexerV2Metadata](../../attention/lightning_indexer_v2_metadata/docs/aclnnLightningIndexerV2Metadata.md)| aclnnLightningIndexerV2接口的前置接口,用于计算aclnnLightningIndexerV2的负载均衡。|默认确定性实现|默认确定性实现| |
| 123 | |[aclnnMaskedCausalConv1d](../../attention/masked_causal_conv1d/docs/aclnnMaskedCausalConv1d.md)|对hidden层的token之间进行带mask的因果一维分组卷积操作。| - | 默认确定性实现 | | 123 | |[aclnnMaskedCausalConv1d](../../attention/masked_causal_conv1d/docs/aclnnMaskedCausalConv1d.md)|对hidden层的token之间进行带mask的因果一维分组卷积操作。| - | 默认确定性实现 | |
| @@ -133,7 +133,7 @@ | |||
| 133 | |[aclnnQuantSparseFlashMla](../../attention/quant_sparse_flash_mla/docs/aclnnQuantSparseFlashMla.md)|支持全量化场景下SWA、CSA、HCA三类Attention计算场景。|-| 默认确定性实现 | | 133 | |[aclnnQuantSparseFlashMla](../../attention/quant_sparse_flash_mla/docs/aclnnQuantSparseFlashMla.md)|支持全量化场景下SWA、CSA、HCA三类Attention计算场景。|-| 默认确定性实现 | |
| 134 | |[aclnnQuantSparseFlashMlaMetadata](../../attention/quant_sparse_flash_mla_metadata/docs/aclnnQuantSparseFlashMlaMetadata.md)| aclnnQuantSparseFlashMla接口的前置接口,用于计算aclnnQuantSparseFlashMla的负载均衡。| - | 默认确定性实现 | | 134 | |[aclnnQuantSparseFlashMlaMetadata](../../attention/quant_sparse_flash_mla_metadata/docs/aclnnQuantSparseFlashMlaMetadata.md)| aclnnQuantSparseFlashMla接口的前置接口,用于计算aclnnQuantSparseFlashMla的负载均衡。| - | 默认确定性实现 | |
| 135 | |[aclnnMlaPreprocess](../../attention/mla_preprocess/docs/aclnnMlaPreprocess.md)|Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | | 135 | |[aclnnMlaPreprocess](../../attention/mla_preprocess/docs/aclnnMlaPreprocess.md)|Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | |
| 136 | -|[aclnnMlaPreprocessV2](../../attention/mla_preprocess_v2/docs/aclnnMlaPreprocessV2.md)|推理场景,Multi-Head Latent Attention前处理的计算。主要计算过程如下:|默认确定性实现| - | | 136 | +|[aclnnMlaPreprocessV2](../../attention/mla_preprocess_v2/docs/aclnnMlaPreprocessV2.md)|推理场景,Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | |
| 137 | |[aclnnMlaProlog](../../attention/mla_prolog/docs/aclnnMlaProlog.md)|Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | | 137 | |[aclnnMlaProlog](../../attention/mla_prolog/docs/aclnnMlaProlog.md)|Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | |
| 138 | |[aclnnMlaPrologV2WeightNz](../../attention/mla_prolog_v2/docs/aclnnMlaPrologV2WeightNz.md)|Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | | 138 | |[aclnnMlaPrologV2WeightNz](../../attention/mla_prolog_v2/docs/aclnnMlaPrologV2WeightNz.md)|Multi-Head Latent Attention前处理的计算。|默认确定性实现| - | |
| 139 | |[aclnnMlaPrologV3WeightNz](../../attention/mla_prolog_v3/docs/aclnnMlaPrologV3WeightNz.md)|Multi-Head Latent Attention前处理的计算。|默认非确定性实现,支持配置开启| 默认确定性实现 | | 139 | |[aclnnMlaPrologV3WeightNz](../../attention/mla_prolog_v3/docs/aclnnMlaPrologV3WeightNz.md)|Multi-Head Latent Attention前处理的计算。|默认非确定性实现,支持配置开启| 默认确定性实现 | |
| @@ -151,7 +151,7 @@ | |||
| 151 | |[aclnnMoeDistributeDispatchV3](../../mc2/moe_distribute_dispatch_v2/docs/aclnnMoeDistributeDispatchV3.md)|对token数据进行量化,当存在TP域通信时,先进行EP域的AllToAllV通信,再进行TP域的AllGatherV通信;当不存在TP域通信时,进行EP域的AllToAllV通信。|默认确定性实现| 默认确定性实现 | | 151 | |[aclnnMoeDistributeDispatchV3](../../mc2/moe_distribute_dispatch_v2/docs/aclnnMoeDistributeDispatchV3.md)|对token数据进行量化,当存在TP域通信时,先进行EP域的AllToAllV通信,再进行TP域的AllGatherV通信;当不存在TP域通信时,进行EP域的AllToAllV通信。|默认确定性实现| 默认确定性实现 | |
| 152 | |[aclnnMoeDistributeDispatchV4](../../mc2/moe_distribute_dispatch_v2/docs/aclnnMoeDistributeDispatchV4.md)|对token数据进行量化,当存在TP域通信时,先进行EP域的AllToAllV通信,再进行TP域的AllGatherV通信;当不存在TP域通信时,进行EP域的AllToAllV通信。|默认确定性实现| 默认确定性实现 | | 152 | |[aclnnMoeDistributeDispatchV4](../../mc2/moe_distribute_dispatch_v2/docs/aclnnMoeDistributeDispatchV4.md)|对token数据进行量化,当存在TP域通信时,先进行EP域的AllToAllV通信,再进行TP域的AllGatherV通信;当不存在TP域通信时,进行EP域的AllToAllV通信。|默认确定性实现| 默认确定性实现 | |
| 153 | |[aclnnMoeDistributeDispatchSetup](../../mc2/moe_distribute_dispatch_setup/docs/aclnnMoeDistributeDispatchSetup.md)|对Token数据进行量化(可选),根据token选择的topK专家在EP(Expert Parallelism)域的AllToAllV通信,只进行数据发送和通信状态发送,通信指令发出后算子即刻退出,无需等待通信完成。数据的接收和后处理由aclnnMoeDistributeDispatchTeardown接口完成。| - | 默认确定性实现 | | 153 | |[aclnnMoeDistributeDispatchSetup](../../mc2/moe_distribute_dispatch_setup/docs/aclnnMoeDistributeDispatchSetup.md)|对Token数据进行量化(可选),根据token选择的topK专家在EP(Expert Parallelism)域的AllToAllV通信,只进行数据发送和通信状态发送,通信指令发出后算子即刻退出,无需等待通信完成。数据的接收和后处理由aclnnMoeDistributeDispatchTeardown接口完成。| - | 默认确定性实现 | |
| 154 | -|[aclnnMoeDistributeDispatchTeardown](../../mc2/moe_distribute_dispatch_teardown/docs/aclnnMoeDistributeDispatchTeardown.md)| 接收MOE层EP(Expert Parallelism)域的AllToAllV通信发过来的数据,数据发送端由aclnnMoeDistributeDispatchSetup完成,本接口内完成通信状态确认和数据整理。| - | 默认确定性实现 | | 154 | +|[aclnnMoeDistributeDispatchTeardown](../../mc2/moe_distribute_dispatch_teardown/docs/aclnnMoeDistributeDispatchTeardown.md)| 接收MoE层EP(Expert Parallelism)域的AllToAllV通信发过来的数据,数据发送端由aclnnMoeDistributeDispatchSetup完成,本接口内完成通信状态确认和数据整理。| - | 默认确定性实现 | |
| 155 | |[aclnnMoeFinalizeRouting](../../moe/moe_finalize_routing/docs/aclnnMoeFinalizeRouting.md)|MoE计算中,最后处理合并MoE FFN的输出结果。|默认确定性实现| - | | 155 | |[aclnnMoeFinalizeRouting](../../moe/moe_finalize_routing/docs/aclnnMoeFinalizeRouting.md)|MoE计算中,最后处理合并MoE FFN的输出结果。|默认确定性实现| - | |
| 156 | |[aclnnMoeFinalizeRoutingV2](../../moe/moe_finalize_routing_v2/docs/aclnnMoeFinalizeRoutingV2.md)|MoE计算中,最后处理合并MoE FFN的输出结果,支持配置dropPadMode。|默认确定性实现| 默认确定性实现 | | 156 | |[aclnnMoeFinalizeRoutingV2](../../moe/moe_finalize_routing_v2/docs/aclnnMoeFinalizeRoutingV2.md)|MoE计算中,最后处理合并MoE FFN的输出结果,支持配置dropPadMode。|默认确定性实现| 默认确定性实现 | |
| 157 | |[aclnnMoeFinalizeRoutingV2Grad](../../moe/moe_finalize_routing_v2_grad/docs/aclnnMoeFinalizeRoutingV2Grad.md)|aclnnMoeFinalizeRoutingV2的反向传播。|默认确定性实现| 默认确定性实现 | | 157 | |[aclnnMoeFinalizeRoutingV2Grad](../../moe/moe_finalize_routing_v2_grad/docs/aclnnMoeFinalizeRoutingV2Grad.md)|aclnnMoeFinalizeRoutingV2的反向传播。|默认确定性实现| 默认确定性实现 | |
| @@ -178,7 +178,7 @@ | |||
| 178 | |[aclnnMoeTokenUnpermuteGrad](../../moe/moe_token_unpermute_grad/docs/aclnnMoeTokenUnpermuteGrad.md)|[aclnnMoeTokenUnpermute](../../moe/moe_token_unpermute/docs/aclnnMoeTokenUnpermute.md)的反向传播。|默认确定性实现| 默认确定性实现 | | 178 | |[aclnnMoeTokenUnpermuteGrad](../../moe/moe_token_unpermute_grad/docs/aclnnMoeTokenUnpermuteGrad.md)|[aclnnMoeTokenUnpermute](../../moe/moe_token_unpermute/docs/aclnnMoeTokenUnpermute.md)的反向传播。|默认确定性实现| 默认确定性实现 | |
| 179 | |[aclnnMoeTokenUnpermuteWithEp](../../moe/moe_token_unpermute_with_ep/docs/aclnnMoeTokenUnpermuteWithEp.md)|根据sortedIndices存储的下标位置,去获取permutedTokens中的输入数据与probs相乘,并进行合并累加。|默认确定性实现| - | | 179 | |[aclnnMoeTokenUnpermuteWithEp](../../moe/moe_token_unpermute_with_ep/docs/aclnnMoeTokenUnpermuteWithEp.md)|根据sortedIndices存储的下标位置,去获取permutedTokens中的输入数据与probs相乘,并进行合并累加。|默认确定性实现| - | |
| 180 | |[aclnnMoeTokenUnpermuteWithEpGrad](../../moe/moe_token_unpermute_with_ep_grad/docs/aclnnMoeTokenUnpermuteWithEpGrad.md)|[aclnnMoeTokenUnpermuteWithEp](../../moe/moe_token_unpermute_with_ep/docs/aclnnMoeTokenUnpermuteWithEp.md)的反向传播。|默认确定性实现| - | | 180 | |[aclnnMoeTokenUnpermuteWithEpGrad](../../moe/moe_token_unpermute_with_ep_grad/docs/aclnnMoeTokenUnpermuteWithEpGrad.md)|[aclnnMoeTokenUnpermuteWithEp](../../moe/moe_token_unpermute_with_ep/docs/aclnnMoeTokenUnpermuteWithEp.md)的反向传播。|默认确定性实现| - | |
| 181 | -|[aclnnMoeTokenUnpermuteWithRoutingMap](../../moe/moe_token_unpermute_with_routing_map/docs/aclnnMoeTokenUnpermuteWithRoutingMap.md)|对经过aclnnMoeTokenpermuteWithRoutingMap处理的permutedTokens,累加回原unpermutedTokens。|默认确定性实现| 默认确定性实现 | | 181 | +|[aclnnMoeTokenUnpermuteWithRoutingMap](../../moe/moe_token_unpermute_with_routing_map/docs/aclnnMoeTokenUnpermuteWithRoutingMap.md)|对经过aclnnMoeTokenUpermuteWithRoutingMap处理的permutedTokens,累加回原unpermutedTokens。|默认确定性实现| 默认确定性实现 | |
| 182 | |[aclnnMoeTokenUnpermuteWithRoutingMapGrad](../../moe/moe_token_unpermute_with_routing_map_grad/docs/aclnnMoeTokenUnpermuteWithRoutingMapGrad.md)|[aclnnMoeTokenUnpermuteWithRoutingMap](../../moe/moe_token_unpermute_with_routing_map/docs/aclnnMoeTokenUnpermuteWithRoutingMap.md)的反向传播。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | | 182 | |[aclnnMoeTokenUnpermuteWithRoutingMapGrad](../../moe/moe_token_unpermute_with_routing_map_grad/docs/aclnnMoeTokenUnpermuteWithRoutingMapGrad.md)|[aclnnMoeTokenUnpermuteWithRoutingMap](../../moe/moe_token_unpermute_with_routing_map/docs/aclnnMoeTokenUnpermuteWithRoutingMap.md)的反向传播。|默认非确定性实现,支持配置开启| 默认非确定性实现,支持配置开启 | |
| 183 | |[aclnnMoeUpdateExpert](../../mc2/moe_update_expert/docs/aclnnMoeUpdateExpert.md)|本API支持负载均衡和专家剪枝功能。经过映射后的专家表和Mask可传入MoE层进行数据分发和处理。|默认确定性实现| 默认确定性实现 | | 183 | |[aclnnMoeUpdateExpert](../../mc2/moe_update_expert/docs/aclnnMoeUpdateExpert.md)|本API支持负载均衡和专家剪枝功能。经过映射后的专家表和Mask可传入MoE层进行数据分发和处理。|默认确定性实现| 默认确定性实现 | |
| 184 | |[aclnnMhcPre](../../mhc/mhc_pre/docs/aclnnMhcPre.md)|基于一系列计算得到MHC架构中hidden层的$H^{res}$和$H^{post}$投影矩阵以及Attention或MLP层的输入矩阵$h^{in}$。|默认确定性实现| - | | 184 | |[aclnnMhcPre](../../mhc/mhc_pre/docs/aclnnMhcPre.md)|基于一系列计算得到MHC架构中hidden层的$H^{res}$和$H^{post}$投影矩阵以及Attention或MLP层的输入矩阵$h^{in}$。|默认确定性实现| - | |
| @@ -444,7 +444,7 @@ | |||
| 444 | <td>✓</td> | 444 | <td>✓</td> |
| 445 | <td>✗</td> | 445 | <td>✗</td> |
| 446 | <td>AI Core</td> | 446 | <td>AI Core</td> |
| 447 | - <td>SparselightningIndexerGradKlLoss算子是LightningIndexer的反向算子,再额外融合了Loss计算功能输出。</td> | 447 | + <td>SparselightningIndexerGradKlLoss算子是LightningIndexer的反向算子,并额外融合了Loss计算功能输出。</td> |
| 448 | </tr> | 448 | </tr> |
| 449 | <tr> | 449 | <tr> |
| 450 | <td>attention</td> | 450 | <td>attention</td> |
| @@ -714,7 +714,7 @@ | |||
| 714 | <td>✗</td> | 714 | <td>✗</td> |
| 715 | <td>✓</td> | 715 | <td>✓</td> |
| 716 | <td>AI Core</td> | 716 | <td>AI Core</td> |
| 717 | - <td>全量推理场景的FlashAttention算子。</td> | 717 | + <td>面向Swin Transformer的注意力输出后处理融合算子,完成输出线性投影(MatMul+Bias)、窗口还原、反向循环移位以及残差加法。</td> |
| 718 | </tr> | 718 | </tr> |
| 719 | <tr> | 719 | <tr> |
| 720 | <td>ffn</td> | 720 | <td>ffn</td> |
| @@ -1274,7 +1274,7 @@ | |||
| 1274 | <td>✓</td> | 1274 | <td>✓</td> |
| 1275 | <td>✗</td> | 1275 | <td>✗</td> |
| 1276 | <td>AI Core</td> | 1276 | <td>AI Core</td> |
| 1277 | - <td>aclnnMoeTokenPermuteWithRoutingMap的反向传播。</td> | 1277 | + <td>MoE的permute计算,将token和expert的标签作为routingMap传入,根据routingMap将tokens和可选probsOptional广播后排序。</td> |
| 1278 | </tr> | 1278 | </tr> |
| 1279 | <tr> | 1279 | <tr> |
| 1280 | <td>moe</td> | 1280 | <td>moe</td> |
| @@ -1354,7 +1354,7 @@ | |||
| 1354 | <td>✓</td> | 1354 | <td>✓</td> |
| 1355 | <td>✓</td> | 1355 | <td>✓</td> |
| 1356 | <td>AI Core</td> | 1356 | <td>AI Core</td> |
| 1357 | - <td>基于用Sinkhorn-Knopp迭代算法将超连接的混合矩阵投影到双随机矩阵流形,以此稳定深度网络信号传播、解决梯度消失 / 爆炸问题</td> | 1357 | + <td>基于Sinkhorn-Knopp迭代算法将超连接的混合矩阵投影到双随机矩阵流形,以此稳定深度网络信号传播、解决梯度消失 / 爆炸问题</td> |
| 1358 | </tr> | 1358 | </tr> |
| 1359 | <tr> | 1359 | <tr> |
| 1360 | <td>mhc</td> | 1360 | <td>mhc</td> |
| @@ -1384,7 +1384,7 @@ | |||
| 1384 | <td>✓</td> | 1384 | <td>✓</td> |
| 1385 | <td>✓</td> | 1385 | <td>✓</td> |
| 1386 | <td>AI Core</td> | 1386 | <td>AI Core</td> |
| 1387 | - <td>mhc_post基于一系列计算对mHC架构中上一层输出进行Post Mapping,对上一层的输入进行Res Mapping,然后对二者进行残差连接,得到下一层的输入。该算子实现前述过程的反向</td> | 1387 | + <td>mhc_post基于一系列计算对mHC架构中上一层输出进行Post Mapping,对上一层的输入进行Res Mapping,然后对二者进行残差连接,得到下一层的输入。该算子实现前述过程的反向计算。</td> |
| 1388 | </tr> | 1388 | </tr> |
| 1389 | <tr> | 1389 | <tr> |
| 1390 | <td>mhc</td> | 1390 | <td>mhc</td> |
| @@ -1514,7 +1514,7 @@ | |||
| 1514 | <td>✗</td> | 1514 | <td>✗</td> |
| 1515 | <td>✓</td> | 1515 | <td>✓</td> |
| 1516 | <td>AI Core</td> | 1516 | <td>AI Core</td> |
| 1517 | - <td>对输入张量的尾轴进行切分。</td> | 1517 | + <td>对输入张量按照‘sizeSplits’对尾轴进行切分,划分为q、k、vOut,对q、k进行旋转位置编码,生成qOut与kOut,之后对kOut与vOut进行量化并按照‘indices’更新到kCacheRef和vCacheRef上。</td> |
| 1518 | </tr> | 1518 | </tr> |
| 1519 | <tr> | 1519 | <tr> |
| 1520 | <td>posembedding</td> | 1520 | <td>posembedding</td> |
| @@ -15,7 +15,7 @@ | |||
| 15 | ```python | 15 | ```python |
| 16 | import torch | 16 | import torch |
| 17 | import torch_npu | 17 | import torch_npu |
| 18 | - import cann-ops-transformer | 18 | + import cann_ops_transformer |
| 19 | ``` | 19 | ``` |
| 20 | 20 | ||
| 21 | - **V版本演进说明** | 21 | - **V版本演进说明** |