已合并
fix: Modify the AIDD docs issue #1195
zwj223创建于 7月29日
fix: Modify the AIDD docs issue #1195
已合并
zwj223创建于 7月29日
19 个文件变更+104-106
@@ -13,7 +13,7 @@ ops-cv算子首个Beta版本v8.5.0-beta.1现已发布。
13 13 
14### 🔗 版本地址14### 🔗 版本地址
15 15 
16-[CANN 8.5.0-beta 1](https://ascend.devcloud.huaweicloud.com/cann/run/software/8.5.0-beta.1/)16+[CANN 8.5.0-beta.1](https://ascend.devcloud.huaweicloud.com/cann/run/software/8.5.0-beta.1/)
17 17 
18```text18```text
19版本目录说明如下:19版本目录说明如下:
@@ -40,9 +40,9 @@
40 40 
41 - 撰写清晰的提交信息:41 - 撰写清晰的提交信息:
42 42 
43- ```bash43+ ```text
44 简短说明(不超过50字符)44 简短说明(不超过50字符)
45- 45+ 
46 如有必要,在此处进行更详细描述。说明修改的原因和内容,而不是具体改了什么(代码本身会展示)。46 如有必要,在此处进行更详细描述。说明修改的原因和内容,而不是具体改了什么(代码本身会展示)。
47 关联的Issue: #12347 关联的Issue: #123
48 ```48 ```
@@ -84,7 +84,7 @@
84 - 图片:84 - 图片:
85 - 常用格式:推荐png格式,风格尽量与已有图片保持一致。85 - 常用格式:推荐png格式,风格尽量与已有图片保持一致。
86 - 分辨率与清晰度:需清晰且尺寸适中,避免模糊或过度压缩。86 - 分辨率与清晰度:需清晰且尺寸适中,避免模糊或过度压缩。
87- - 文件大小:单张图片不建议超过10M87+ - 文件大小:单张图片不建议超过10MB
88 - 版权:所有引用的图片、文献等资源,请确保合规性。88 - 版权:所有引用的图片、文献等资源,请确保合规性。
89 89 
90## 获取帮助90## 获取帮助
@@ -2,7 +2,7 @@
2 2 
3## 使用须知3## 使用须知
4 4 
5-本指南旨在帮助快速上手CANN和`ops-cv`算子仓的使用。为方便快速了解算子开发全流程,以**AddExample**算子为实践对象,算子源码位于`ops-cv/examples/add_example`,操作流程如下:5+本指南旨在帮助开发者快速上手CANN和`ops-cv`算子仓的使用。为方便快速了解算子开发全流程,以**AddExample**算子为实践对象,算子源码位于`ops-cv/examples/add_example`,操作流程如下:
6 6 
71. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。71. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。
8 8 
@@ -178,9 +178,9 @@ __aicore__ inline void AddExample<T>::Compute(int64_t currentNum)
178 178 
179- **printf**179- **printf**
180 180 
181- 该接口支持打印Scalar类型数据,如整数、字符型、布尔型等,详细介绍请参见[《Ascend C API》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中"算子调测API > printf"181+ 该接口支持打印Scalar类型数据,如整数、字符型、布尔型等,详细介绍请参见[《Ascend C API》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中算子调测API > printf
182 182 
183- ```c++183+ ```cpp
184 blockLength_ = (remainderLength > tilingData->blockFactor) ? tilingData->blockFactor : remainderLength;184 blockLength_ = (remainderLength > tilingData->blockFactor) ? tilingData->blockFactor : remainderLength;
185 ubLength_ = tilingData->ubFactor;185 ubLength_ = tilingData->ubFactor;
186 // 打印当前核计算Block长度186 // 打印当前核计算Block长度
@@ -191,7 +191,7 @@ __aicore__ inline void AddExample<T>::Compute(int64_t currentNum)
191 191 
192 该接口支持Dump指定Tensor的内容,同时支持打印自定义附加信息,比如当前行号等,详细介绍请参见[《Ascend C API》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中“算子调测API > DumpTensor”。192 该接口支持Dump指定Tensor的内容,同时支持打印自定义附加信息,比如当前行号等,详细介绍请参见[《Ascend C API》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中“算子调测API > DumpTensor”。
193 193 
194- ```c++194+ ```cpp
195 AscendC::LocalTensor<T> xLocal = inputQueueX.DeQue<T>();195 AscendC::LocalTensor<T> xLocal = inputQueueX.DeQue<T>();
196 AscendC::LocalTensor<T> yLocal = inputQueueY.DeQue<T>();196 AscendC::LocalTensor<T> yLocal = inputQueueY.DeQue<T>();
197 AscendC::LocalTensor<T> zLocal = outputQueueZ.AllocTensor<T>();197 AscendC::LocalTensor<T> zLocal = outputQueueZ.AllocTensor<T>();
@@ -232,7 +232,7 @@ __aicore__ inline void AddExample<T>::Compute(int64_t currentNum)
232 232 
233**修改输入/输出数据**:修改输入、输出的shape信息,以及初始化数据,构造相应的输入、输出tensor。233**修改输入/输出数据**:修改输入、输出的shape信息,以及初始化数据,构造相应的输入、输出tensor。
234 234 
235-```c++235+```cpp
236int main() {236int main() {
237 // ... 初始化代码...237 // ... 初始化代码...
238 238 
@@ -266,4 +266,4 @@ int main() {
266 266 
267## 结语267## 结语
268 268 
269-体验完上述流程,已基本完成算子开发过程,如果想进一步贡献新算子或学习更多高阶开发、调试等技能,请访问本项目README学习[进阶教程](../README.md#学习教程)和[贡献指南](../README.md#相关信息)等。269+体验完上述流程,已基本完成算子开发过程,如果想进一步贡献新算子或学习更多高阶开发、调试等技能,请访问本项目README学习[进阶教程](../README.md#学习教程)和[贡献指南](../README.md#相关信息)等。
@@ -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 
@@ -11,11 +11,11 @@ broadcast(广播)描述了算子在运算期间如何处理不同形状的
11一般进行广播计算时,需要理解以下规则:11一般进行广播计算时,需要理解以下规则:
12 12 
13- 规则1:如果数组间维度数不一致,所有数组向最长形状的数组看齐,形状不足的部分在**左侧**填充1,直至维度数相同。13- 规则1:如果数组间维度数不一致,所有数组向最长形状的数组看齐,形状不足的部分在**左侧**填充1,直至维度数相同。
14- 14+ 
15 > 说明:15 > 说明:
16- > - 举例1:维度数(Number of Dimensions)是指张量(或数组)对应shape的维数,比如x.shape=(1,1,2,4),维度数是4 。 16+ > - 举例1:维度数(Number of Dimensions)是指张量(或数组)对应shape的维数,比如x.shape=(1,1,2,4),维度数是4 。
17 > - 举例2:比如计算a+b,其中a.shape=\(2, 2, 3\)、b.shape=\(2, 3\),那么数组b将被broadcast为b.shape=\(1, 2, 3\)。17 > - 举例2:比如计算a+b,其中a.shape=\(2, 2, 3\)、b.shape=\(2, 3\),那么数组b将被broadcast为b.shape=\(1, 2, 3\)。
18- 18+ 
19- 规则2:如果数组间维度数一致,且某个数组的某一维度为1,则该维度为1的数组将被拉伸以匹配另一个数组对应维度形状。19- 规则2:如果数组间维度数一致,且某个数组的某一维度为1,则该维度为1的数组将被拉伸以匹配另一个数组对应维度形状。
20 20 
21 > 说明:21 > 说明:
@@ -25,7 +25,7 @@ broadcast(广播)描述了算子在运算期间如何处理不同形状的
25 25 
26基于上述规则,广播过程一般先按**规则1**进行扩维,再按**规则2**进行形状拉伸,具体例子如下:26基于上述规则,广播过程一般先按**规则1**进行扩维,再按**规则2**进行形状拉伸,具体例子如下:
27 27 
28-```tex28+```text
29假设a.shape=(2,2,3),取值形如:29假设a.shape=(2,2,3),取值形如:
30[[[1 2 3],[4 5 6]],30[[[1 2 3],[4 5 6]],
31 [[1 2 3],[4 5 6]]]31 [[1 2 3],[4 5 6]]]
@@ -19,27 +19,27 @@
19 19 
20 ```CMake20 ```CMake
21 # Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.21 # Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.
22- 22+ 
23 # CMake lowest version requirement23 # CMake lowest version requirement
24 cmake_minimum_required(VERSION 3.14)24 cmake_minimum_required(VERSION 3.14)
25- 25+ 
26 # 设置工程名26 # 设置工程名
27 project(ACLNN_EXAMPLE)27 project(ACLNN_EXAMPLE)
28- 28+ 
29 # Compile options29 # Compile options
30 add_compile_options(-std=c++11)30 add_compile_options(-std=c++11)
31- 31+ 
32 # 设置编译选项32 # 设置编译选项
33- set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "./bin") 33+ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "./bin")
34 set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall")34 set(CMAKE_CXX_FLAGS_DEBUG "-fPIC -O0 -g -Wall")
35 set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall")35 set(CMAKE_CXX_FLAGS_RELEASE "-fPIC -O2 -Wall")
36- 36+ 
37 # 设置可执行文件名(如opapi_test),并指定待运行算子文件*.cpp所在目录37 # 设置可执行文件名(如opapi_test),并指定待运行算子文件*.cpp所在目录
38 add_executable(opapi_test38 add_executable(opapi_test
39 test_grid_sampler2_d.cpp)39 test_grid_sampler2_d.cpp)
40- 40+ 
41 # 设置ASCEND_PATH(CANN软件包目录,请根据实际路径修改)和INCLUDE_BASE_DIR(头文件目录)41 # 设置ASCEND_PATH(CANN软件包目录,请根据实际路径修改)和INCLUDE_BASE_DIR(头文件目录)
42- if(NOT "$ENV{ASCEND_CUSTOM_PATH}" STREQUAL "") 42+ if(NOT "$ENV{ASCEND_CUSTOM_PATH}" STREQUAL "")
43 set(ASCEND_PATH $ENV{ASCEND_CUSTOM_PATH})43 set(ASCEND_PATH $ENV{ASCEND_CUSTOM_PATH})
44 else()44 else()
45 set(ASCEND_PATH "/usr/local/Ascend/cann")45 set(ASCEND_PATH "/usr/local/Ascend/cann")
@@ -49,20 +49,20 @@
49 ${INCLUDE_BASE_DIR}49 ${INCLUDE_BASE_DIR}
50 ${INCLUDE_BASE_DIR}/aclnn50 ${INCLUDE_BASE_DIR}/aclnn
51 )51 )
52- 52+ 
53 # 设置链接的库文件路径53 # 设置链接的库文件路径
54 target_link_libraries(opapi_test PRIVATE54 target_link_libraries(opapi_test PRIVATE
55 ${ASCEND_PATH}/lib64/libacl_rt.so55 ${ASCEND_PATH}/lib64/libacl_rt.so
56 ${ASCEND_PATH}/lib64/libnnopbase.so56 ${ASCEND_PATH}/lib64/libnnopbase.so
57 ${ASCEND_PATH}/lib64/libopapi_math.so57 ${ASCEND_PATH}/lib64/libopapi_math.so
58 ${ASCEND_PATH}/lib64/libopapi_cv.so)58 ${ASCEND_PATH}/lib64/libopapi_cv.so)
59- 59+ 
60 # 可执行文件在CMakeLists文件所在目录的bin目录下60 # 可执行文件在CMakeLists文件所在目录的bin目录下
61 install(TARGETS opapi_test DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})61 install(TARGETS opapi_test DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
62 ```62 ```
63 63 
64 对于集合通信和MatMul计算融合、并行的算子,统称为通算融合算子(简称MC2算子),包括AllGatherMatmul、AlltoAllAllGatherBatchMatMul、BatchMatMulReduceScatterAlltoAll、MatmulAllReduce、MatmulAllReduceAddRmsNorm、MatmulReduceScatter等。调用该类算子API时,一般会涉及多线程和HCCL(Huawei Collective Communication Library,集合通信库),因此CMake文件需要额外导入如下内容,否则无法成功编译。64 对于集合通信和MatMul计算融合、并行的算子,统称为通算融合算子(简称MC2算子),包括AllGatherMatmul、AlltoAllAllGatherBatchMatMul、BatchMatMulReduceScatterAlltoAll、MatmulAllReduce、MatmulAllReduceAddRmsNorm、MatmulReduceScatter等。调用该类算子API时,一般会涉及多线程和HCCL(Huawei Collective Communication Library,集合通信库),因此CMake文件需要额外导入如下内容,否则无法成功编译。
65- 65+ 
66 ```CMake66 ```CMake
67 # 设置链接的库文件路径67 # 设置链接的库文件路径
68 find_package(Threads REQUIRED)68 find_package(Threads REQUIRED)
@@ -76,11 +76,11 @@
76 ```76 ```
77 77 
78 其中“find_package(Threads REQUIRED)”是CMake用于查找线程库的命令,可自动链接线程库依赖的头文件或间接依赖的库文件。78 其中“find_package(Threads REQUIRED)”是CMake用于查找线程库的命令,可自动链接线程库依赖的头文件或间接依赖的库文件。
79- 79+ 
80## 编译与运行80## 编译与运行
81 81 
82 1. 提前准备好算子的调用代码(\*.cpp)和编译脚本(CMakeLists.txt)。82 1. 提前准备好算子的调用代码(\*.cpp)和编译脚本(CMakeLists.txt)。
83- 2. 配置环境变量。 83+ 2. 配置环境变量。
84 84 
85 安装CANN软件后,使用CANN运行用户登录环境,执行如下命令生效环境变量。85 安装CANN软件后,使用CANN运行用户登录环境,执行如下命令生效环境变量。
86 86 
@@ -88,14 +88,14 @@
88 source ${INSTALL_DIR}/set_env.sh88 source ${INSTALL_DIR}/set_env.sh
89 ```89 ```
90 90 
91- 其中${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际情况替换。 91+ 其中${INSTALL_DIR}为CANN软件安装后文件存储路径,请根据实际情况替换。
92 3. 编译并运行。92 3. 编译并运行。
93 - 进入CMakeLists.txt所在目录,执行如下命令,新建build目录存放生成的编译文件。93 - 进入CMakeLists.txt所在目录,执行如下命令,新建build目录存放生成的编译文件。
94 94 
95 ```sh95 ```sh
96- mkdir -p build 96+ mkdir -p build
97 ```97 ```
98- 98+ 
99 - 进入build目录,执行cmake命令编译,再执行make命令生成可执行文件。99 - 进入build目录,执行cmake命令编译,再执行make命令生成可执行文件。
100 100 
101 ```sh101 ```sh
@@ -130,14 +130,14 @@
130 若执行结果报错,未出现预期结果,可以使用aclGetRecentErrMsg接口获取报错具体信息。130 若执行结果报错,未出现预期结果,可以使用aclGetRecentErrMsg接口获取报错具体信息。
131 调用aclnnGridSampler2DGetWorkspaceSize报错获取异常信息示例如下:131 调用aclnnGridSampler2DGetWorkspaceSize报错获取异常信息示例如下:
132 132 
133- ```sh133+ ```cpp
134 // input is nullptr134 // input is nullptr
135 ret = aclnnGridSampler2DGetWorkspaceSize(135 ret = aclnnGridSampler2DGetWorkspaceSize(
136 input, grid, interpolationMode, paddingMode, alignCorners, out, & workspaceSize, &executor);136 input, grid, interpolationMode, paddingMode, alignCorners, out, & workspaceSize, &executor);
137 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnGridSampler2DGetWorkspaceSize failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret);137 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnGridSampler2DGetWorkspaceSize failed. ERROR: %d.\n[ERROR msg]%s", ret, aclGetRecentErrMsg()); return ret);
138 ```138 ```
139 139 
140- 上述构造空指针问题获取报错信息示例如下:140+ 上述构造空指针问题获取报错信息示例如下
141 141 
142 ```sh142 ```sh
143 aclnnGridSampler2DGetWorkspaceSize failed. ERROR: 161001143 aclnnGridSampler2DGetWorkspaceSize failed. ERROR: 161001
@@ -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 
@@ -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 
@@ -38,12 +38,12 @@ CANN Simulator集成在CANN toolkit包里,参考[环境部署](../install/quic
38 38 
39```bash39```bash
40# 说明:进入项目根目录,执行如下编译命令,命令仅供参考,详细可以查看算子调用的说明。40# 说明:进入项目根目录,执行如下编译命令,命令仅供参考,详细可以查看算子调用的说明。
41-bash build.sh --pkg --soc=ascend950 --vendor_name=custom --ops=add_example41+bash build.sh --pkg --soc=Ascend950 --vendor_name=custom --ops=add_example
42# 安装自定义算子包42# 安装自定义算子包
43./build_out/cann-ops-cv-${vendor_name}_linux-${arch}.run43./build_out/cann-ops-cv-${vendor_name}_linux-${arch}.run
44```44```
45 45 
46-* 参考[aclnn调用](../invocation/quick_op_invocation.md#aclnn-api)完成test_aclnn_add_example.cpp的编译,编出可执行文件test_aclnn_add_example46+* 参考[aclnn调用](../invocation/quick_op_invocation.md#aclnn-api)完成test_aclnn_add_example.cpp的编译,编出可执行文件test_aclnn_add_example
47 47 
48## 执行仿真命令48## 执行仿真命令
49 49 
@@ -154,7 +154,7 @@ cannsim report [options]
154 154 
155## 使用示例155## 使用示例
156 156 
157-1. 参考仿真执行执行算子仿真,对比输出示例,确保对应的结果执行正确。157+1. 参考仿真执行算子仿真,对比输出示例,确保对应的结果执行正确。
1582. 执行仿真结果解析命令,可参考以下执行用例。1582. 执行仿真结果解析命令,可参考以下执行用例。
159 159 
160 ```bash160 ```bash
@@ -39,7 +39,7 @@
39 39 
40目录创建是算子开发的重要步骤,为后续代码编写、编译构建和调试提供统一的目录结构和文件组织方式。40目录创建是算子开发的重要步骤,为后续代码编写、编译构建和调试提供统一的目录结构和文件组织方式。
41 41 
42-本项目`build.sh`,支持快速创建算子目录。进入项目根目录,执行以下命令:42+本项目提供`build.sh`脚本,支持快速创建算子目录。进入项目根目录,执行以下命令:
43 43 
44```bash44```bash
45# 创建指定算子目录,如bash build.sh --genop=examples/example_ops45# 创建指定算子目录,如bash build.sh --genop=examples/example_ops
@@ -56,7 +56,7 @@ Create the initial directory for ${op_name} under ${op_class} success
56 56 
57创建完成后,目录结构如下所示:57创建完成后,目录结构如下所示:
58 58 
59-```tex59+```text
60${op_name} # 替换为实际算子名的小写下划线形式60${op_name} # 替换为实际算子名的小写下划线形式
61├── examples # 算子调用示例61├── examples # 算子调用示例
62│ ├── test_aclnn_${op_name}.cpp # 算子aclnn调用示例62│ ├── test_aclnn_${op_name}.cpp # 算子aclnn调用示例
@@ -134,7 +134,7 @@ Tiling主要切分逻辑。
134> 1. **TilingParse**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。134> 1. **TilingParse**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。
135> 2. **CompileInfo**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。135> 2. **CompileInfo**:图模式标准交付件,保留函数定义以满足框架调用规范,无实际逻辑时可置空。
136 136 
137-```CPP137+```cpp
138// ${op_name}_tiling.cpp138// ${op_name}_tiling.cpp
139// 1.Tiling需要获取运行环境信息,包括可用核数、UB(Unified Buffer)大小,并将获取到的信息传递给CompileInfo, 自动生成aclnn不调用该函数,直接返回ge::GRAPH_SUCCESS即可。139// 1.Tiling需要获取运行环境信息,包括可用核数、UB(Unified Buffer)大小,并将获取到的信息传递给CompileInfo, 自动生成aclnn不调用该函数,直接返回ge::GRAPH_SUCCESS即可。
140static ge::graphStatus TilingParse(gert::TilingParseContext* context)140static ge::graphStatus TilingParse(gert::TilingParseContext* context)
@@ -164,7 +164,7 @@ static ge::graphStatus TilingFunc(gert::TilingContext* context){
164 OP_CHECK_IF(164 OP_CHECK_IF(
165 GetPlatformInfo(context, ubSize, coreNum) != ge::GRAPH_SUCCESS, OP_LOGE(context, "GetPlatformInfo error"),165 GetPlatformInfo(context, ubSize, coreNum) != ge::GRAPH_SUCCESS, OP_LOGE(context, "GetPlatformInfo error"),
166 return ge::GRAPH_FAILED);166 return ge::GRAPH_FAILED);
167- 167+ 
168 // 2.2获取输入信息168 // 2.2获取输入信息
169 // 获取输入张量shape信息169 // 获取输入张量shape信息
170 auto inputX = context->GetInputShape(0);170 auto inputX = context->GetInputShape(0);
@@ -210,7 +210,7 @@ TilingKey是一个算子内为了区分不同的实现而将kernel代码进行
210 210 
211> **说明:** 如需实现复杂参数组合完成分支选择(涉及多TilingKey场景),请参考[《Ascend C算子开发接口》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中“Utils API > Tiling模版编程 > 模版参数含义”。211> **说明:** 如需实现复杂参数组合完成分支选择(涉及多TilingKey场景),请参考[《Ascend C算子开发接口》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中“Utils API > Tiling模版编程 > 模版参数含义”。
212 212 
213-```CPP213+```cpp
214// ${op_name}_tiling_key.h214// ${op_name}_tiling_key.h
215ASCENDC_TPL_ARGS_DECL(215ASCENDC_TPL_ARGS_DECL(
216 ${op_name},216 ${op_name},
@@ -226,7 +226,7 @@ ASCENDC_TPL_SEL(ASCENDC_TPL_ARGS_SEL(
226 226 
227如需查看详细实现,请参考[add_example_tiling_data.h](../../../examples/add_example/op_kernel/add_example_tiling_data.h)。227如需查看详细实现,请参考[add_example_tiling_data.h](../../../examples/add_example/op_kernel/add_example_tiling_data.h)。
228 228 
229-```CPP229+```cpp
230// ${op_name}_tiling_data.h230// ${op_name}_tiling_data.h
231struct ${op_name}TilingData {231struct ${op_name}TilingData {
232 int64_t totalLength;232 int64_t totalLength;
@@ -267,7 +267,7 @@ Kernel入口文件,包含主函数和调度逻辑。
267 267 
268如需查看详细实现,请参考[add_example.cpp](../../../examples/add_example/op_kernel/add_example.cpp)。268如需查看详细实现,请参考[add_example.cpp](../../../examples/add_example/op_kernel/add_example.cpp)。
269 269 
270-```CPP270+```cpp
271// 1、核函数定义271// 1、核函数定义
272// schMode是一个模板参数,用于支持不同数据类型(如float和int32)的计算路径272// schMode是一个模板参数,用于支持不同数据类型(如float和int32)的计算路径
273// __global__ __aicore__表示该函数是个全局函数,可以在AI Core上执行273// __global__ __aicore__表示该函数是个全局函数,可以在AI Core上执行
@@ -296,14 +296,14 @@ __global__ __aicore__ void add_example(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR
296 296 
297如需查看详细实现,请参考[add_example.h](../../../examples/add_example/op_kernel/add_example.h)。297如需查看详细实现,请参考[add_example.h](../../../examples/add_example/op_kernel/add_example.h)。
298 298 
299-```C++299+```cpp
300// 2、定义Kernel类300// 2、定义Kernel类
301template <typename T>301template <typename T>
302class AddExample302class AddExample
303{303{
304public:304public:
305 // 默认构造函数,__aicore__表示该函数在AI Core上运行305 // 默认构造函数,__aicore__表示该函数在AI Core上运行
306- __aicore__ inline AddExample(){}; 306+ __aicore__ inline AddExample(){};
307 // 初始化函数,用于设置输入输出地址和Tiling切分信息计算307 // 初始化函数,用于设置输入输出地址和Tiling切分信息计算
308 __aicore__ inline void Init(GM_ADDR x, GM_ADDR y, GM_ADDR z, const AddExampleTilingData* tilingData);308 __aicore__ inline void Init(GM_ADDR x, GM_ADDR y, GM_ADDR z, const AddExampleTilingData* tilingData);
309 // 主处理函数,执行数据拷贝和计算309 // 主处理函数,执行数据拷贝和计算
@@ -333,7 +333,7 @@ private:
333 GlobalTensor<T> inputGMY_;333 GlobalTensor<T> inputGMY_;
334 // 输出Z的GM地址334 // 输出Z的GM地址
335 GlobalTensor<T> outputGMZ_;335 GlobalTensor<T> outputGMZ_;
336- 336+ 
337 // 总数据长度337 // 总数据长度
338 int64_t blockLength_ = 0;338 int64_t blockLength_ = 0;
339 // 每个block被划分多少块339 // 每个block被划分多少块
@@ -351,10 +351,10 @@ __aicore__ inline void AddExample<T>::Init(GM_ADDR x, GM_ADDR y, GM_ADDR z, cons
351 blockLength_ = tilingData->totalLength / AscendC::GetBlockNum();351 blockLength_ = tilingData->totalLength / AscendC::GetBlockNum();
352 ...352 ...
353 // 3.2 初始化GM地址353 // 3.2 初始化GM地址
354- inputGMX.SetGlobalBuffer((__gm__ T*)x + blockLength_ * AscendC::GetBlockIdx(), blockLength_);354+ inputGMX_.SetGlobalBuffer((__gm__ T*)x + blockLength_ * AscendC::GetBlockIdx(), blockLength_);
355 ...355 ...
356 // 3.3 初始化队列长度356 // 3.3 初始化队列长度
357- pipe.InitBuffer(inputQueueX_, BUFFER_NUM, tileLength_ * sizeof(T));357+ pipe_.InitBuffer(inputQueueX_, BUFFER_NUM, tileLength_ * sizeof(T));
358 ...358 ...
359}359}
360 360 
@@ -392,7 +392,7 @@ __aicore__ inline void AddExample<T>::Process()
392 392 
393## 编译部署393## 编译部署
394 394 
395-算子开发完成后,需对算子工程进行编译,生成自定义算子安装包\*\.run,详细的编译操作如下:395+算子开发完成后,需对算子工程进行编译,生成自定义算子安装包*.run,详细的编译操作如下:
396 396 
3971. **准备工作。**3971. **准备工作。**
398 398 
@@ -420,7 +420,7 @@ __aicore__ inline void AddExample<T>::Process()
420 ```bash420 ```bash
421 # 编译指定算子,如bash build.sh --pkg --ops=add_example -j16421 # 编译指定算子,如bash build.sh --pkg --ops=add_example -j16
422 bash build.sh --pkg --soc=${soc_version} --vendor_name=${vendor_name} --ops=${op_list} [-j${n}]422 bash build.sh --pkg --soc=${soc_version} --vendor_name=${vendor_name} --ops=${op_list} [-j${n}]
423- 423+ 
424 # 编译experimental目录下指定算子424 # 编译experimental目录下指定算子
425 bash build.sh --pkg --soc=${soc_version} --vendor_name=${vendor_name} --ops=${op_list} [--experimental] [-j${n}]425 bash build.sh --pkg --soc=${soc_version} --vendor_name=${vendor_name} --ops=${op_list} [--experimental] [-j${n}]
426 ```426 ```
@@ -440,7 +440,7 @@ __aicore__ inline void AddExample<T>::Process()
4404. **安装自定义算子包。**4404. **安装自定义算子包。**
441 441 
442 执行以下命令进行安装:442 执行以下命令进行安装:
443- 443+ 
444 ```bash444 ```bash
445 # 安装run包445 # 安装run包
446 ./build_out/cann-ops-cv-${vendor_name}_linux-${arch}.run446 ./build_out/cann-ops-cv-${vendor_name}_linux-${arch}.run
@@ -498,7 +498,7 @@ UT编写指导如下,如需查看详细实现,请参考样例UT实现[test_a
498 498 
499测试类示例:499测试类示例:
500 500 
501-```CPP501+```cpp
502class ${OpName}InfershapeTest : public testing::Test {502class ${OpName}InfershapeTest : public testing::Test {
503protected:503protected:
504 static void SetUpTestCase()504 static void SetUpTestCase()
@@ -522,7 +522,7 @@ protected:
522 522 
523简化示例:523简化示例:
524 524 
525-```CPP525+```cpp
526TEST_F(${OpName}InfershapeTest, test_case_xxx)526TEST_F(${OpName}InfershapeTest, test_case_xxx)
527{527{
528 // 1. 构造用例上下文528 // 1. 构造用例上下文
@@ -563,7 +563,7 @@ UT编写指导如下,如需查看详细实现,请参考样例UT实现[test_a
563 563 
564测试类示例:564测试类示例:
565 565 
566-```CPP566+```cpp
567class ${OpName}TilingTest : public testing::Test {567class ${OpName}TilingTest : public testing::Test {
568protected:568protected:
569 static void SetUpTestCase()569 static void SetUpTestCase()
@@ -589,7 +589,7 @@ protected:
589 589 
590简化示例:590简化示例:
591 591 
592-```CPP592+```cpp
593TEST_F(${OpName}TilingTest, test_case_xxx)593TEST_F(${OpName}TilingTest, test_case_xxx)
594{594{
595 // 声明结构体并初始化一个结构体变量595 // 声明结构体并初始化一个结构体变量
@@ -643,7 +643,7 @@ UT编写指导如下,如需查看详细实现,请参考样例UT实现[test_a
643 643 
644测试类示例:644测试类示例:
645 645 
646-```CPP646+```cpp
647class ${OpName}KernelTest : public testing::Test {647class ${OpName}KernelTest : public testing::Test {
648protected:648protected:
649 static void SetUpTestCase()649 static void SetUpTestCase()
@@ -670,7 +670,7 @@ protected:
670 670 
671简化示例:671简化示例:
672 672 
673-```CPP673+```cpp
674extern "C" __global__ __aicore__ void ${op_name}(GM_ADDR x, GM_ADDR y, GM_ADDR z,674extern "C" __global__ __aicore__ void ${op_name}(GM_ADDR x, GM_ADDR y, GM_ADDR z,
675 GM_ADDR workspace, GM_ADDR tiling);675 GM_ADDR workspace, GM_ADDR tiling);
676 676 
@@ -710,7 +710,7 @@ TEST_F(${OpName}KernelTest, test_case_basic)
710- **手动构造**:适合字段少、逻辑简单。710- **手动构造**:适合字段少、逻辑简单。
711- **调用Tiling函数自动生成**:适合字段多、依赖属性/shape复杂。可复用`tests/ut/common/tiling_context_faker.h``tiling_case_executor.h`。示例:711- **调用Tiling函数自动生成**:适合字段多、依赖属性/shape复杂。可复用`tests/ut/common/tiling_context_faker.h``tiling_case_executor.h`。示例:
712 712 
713-```CPP713+```cpp
714gert::TilingContextPara para("OpName",714gert::TilingContextPara para("OpName",
715 {{{{2, 2, 2, 1}, {2, 2, 2, 1}}, ge::DT_FLOAT, ge::FORMAT_ND}},715 {{{{2, 2, 2, 1}, {2, 2, 2, 1}}, ge::DT_FLOAT, ge::FORMAT_ND}},
716 {{{{2, 1, 2, 2}, {2, 1, 2, 2}}, ge::DT_FLOAT, ge::FORMAT_ND}},716 {{{{2, 1, 2, 2}, {2, 1, 2, 2}}, ge::DT_FLOAT, ge::FORMAT_ND}},
@@ -797,7 +797,7 @@ export LD_LIBRARY_PATH=${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_cv/op_api/
797 <td>op_kernel/{op_name}.cpp</td>797 <td>op_kernel/{op_name}.cpp</td>
798 <td>将原有op_host/{op_name}.cpp中kernel实现的核函数实现迁移至cpp文件,同时:798 <td>将原有op_host/{op_name}.cpp中kernel实现的核函数实现迁移至cpp文件,同时:
799 <br>. 新增REGISTER_TILING_DEFAULT调用注册Tiling结构体,使用GET_TILING_DATA_WITH_STRUCT获取TilingData799 <br>. 新增REGISTER_TILING_DEFAULT调用注册Tiling结构体,使用GET_TILING_DATA_WITH_STRUCT获取TilingData
800- <br>. 添加tiling模板,支持模板参数的传入,根据模板参数的分支判断,选择不同的kernel侧实现800+ <br>. 添加tiling模板,支持模板参数的传入,根据模板参数的分支判断,选择不同的kernel侧实现
801 </td>801 </td>
802 <td><a href="#op_kernel/{op_name}.cpp">op_kernel/{op_name}.cpp</a></td>802 <td><a href="#op_kernel/{op_name}.cpp">op_kernel/{op_name}.cpp</a></td>
803 </tr>803 </tr>
@@ -815,7 +815,7 @@ export LD_LIBRARY_PATH=${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_cv/op_api/
815 815 
816将原有${op_name}.cpp中算子信息库内容独立迁移至该文件,需要去掉SetInferShape和SetTiling内容。816将原有${op_name}.cpp中算子信息库内容独立迁移至该文件,需要去掉SetInferShape和SetTiling内容。
817 817 
818-```CPP818+```cpp
819// 原有${op_name}.cpp中算子信息库内容819// 原有${op_name}.cpp中算子信息库内容
820namespace ops {820namespace ops {
821class AddCustom : public OpDef {821class AddCustom : public OpDef {
@@ -871,7 +871,7 @@ OP_ADD(AddCustom);
871 871 
872图模式场景需要适配该文件,将原有${op_name}.cpp中shape推导部分独立迁至该文件,调用接口IMPL_OP_INFERSHAPE完成InferShape注册。872图模式场景需要适配该文件,将原有${op_name}.cpp中shape推导部分独立迁至该文件,调用接口IMPL_OP_INFERSHAPE完成InferShape注册。
873 873 
874-```CPP874+```cpp
875// 原有${op_name}.cpp中的InferShape875// 原有${op_name}.cpp中的InferShape
876namespace ge {876namespace ge {
877static graphStatus InferShape(gert::InferShapeContext *context)877static graphStatus InferShape(gert::InferShapeContext *context)
@@ -905,7 +905,7 @@ IMPL_OP_INFERSHAPE(AddCustom).InferShape(InferShape); // 在该文件中完成
905若是新增定义模板参数和模板参数组合,TilingFunc中需要同时配置模板参数tilingKey。905若是新增定义模板参数和模板参数组合,TilingFunc中需要同时配置模板参数tilingKey。
906可参考[add_example_tiling.cpp](../../../examples/add_example/op_host/add_example_tiling.cpp)。906可参考[add_example_tiling.cpp](../../../examples/add_example/op_host/add_example_tiling.cpp)。
907 907 
908-```CPP908+```cpp
909// 原有${op_name}.cpp中TilingFunc909// 原有${op_name}.cpp中TilingFunc
910namespace optiling {910namespace optiling {
911const uint32_t BLOCK_DIM = 8;911const uint32_t BLOCK_DIM = 8;
@@ -963,7 +963,7 @@ IMPL_OP_OPTILING(AddCustom).Tiling(TilingFunc); // 在该文件中完成Tiling
963</div>963</div>
964图模式场景需要适配该文件,将原有${op_name}.cpp中类型推导独立迁移至该文件后,调用接口IMPL_OP完成InferDataType注册。964图模式场景需要适配该文件,将原有${op_name}.cpp中类型推导独立迁移至该文件后,调用接口IMPL_OP完成InferDataType注册。
965 965 
966-```CPP966+```cpp
967// 原有${op_name}.cpp中InferDataType967// 原有${op_name}.cpp中InferDataType
968namespace ge {968namespace ge {
969static graphStatus InferDataType(gert::InferDataTypeContext *context)969static graphStatus InferDataType(gert::InferDataTypeContext *context)
@@ -990,7 +990,7 @@ IMPL_OP(AddCustom).InferDataType(InferDataType); // 在该文件中完成Infer
990<p style="font-size:18px;"><b>op_kernel/{op_name}_tiling_data.h</b></p>990<p style="font-size:18px;"><b>op_kernel/{op_name}_tiling_data.h</b></p>
991</div>991</div>
992 992 
993-```CPP993+```cpp
994// 原有op_host/{op_name}_tiling.h中的宏定义TilingData结构体994// 原有op_host/{op_name}_tiling.h中的宏定义TilingData结构体
995namespace optiling {995namespace optiling {
996BEGIN_TILING_DATA_DEF(TilingData)996BEGIN_TILING_DATA_DEF(TilingData)
@@ -1016,7 +1016,7 @@ struct TilingData {
1016<p style="font-size:18px;"><b>op_kernel/{op_name}.cpp</b></p>1016<p style="font-size:18px;"><b>op_kernel/{op_name}.cpp</b></p>
1017</div>1017</div>
1018 1018 
1019-```CPP1019+```cpp
1020// 原有op_kernel/{op_name}.cpp中的核函数实现1020// 原有op_kernel/{op_name}.cpp中的核函数实现
1021template<int D_T_X, int D_T_Y, int D_T_Z, int TILE_NUM, int IS_SPLIT>1021template<int D_T_X, int D_T_Y, int D_T_Z, int TILE_NUM, int IS_SPLIT>
1022 __global__ __aicore__ void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)1022 __global__ __aicore__ void add_custom(GM_ADDR x, GM_ADDR y, GM_ADDR z, GM_ADDR workspace, GM_ADDR tiling)
@@ -184,9 +184,9 @@ uint32_t AddExampleCpuKernel::Compute(CpuKernelContext& ctx) {
184 case DT_FLOAT:184 case DT_FLOAT:
185 return AddCompute<float>(...);185 return AddCompute<float>(...);
186 case DT_INT32:186 case DT_INT32:
187- return AddCompute<int32>(...);187+ return AddCompute<int32_t>(...);
188 ....188 ....
189- default : return PARAM_INVALID;189+ default : return kParamInvalid;
190 }190 }
191}191}
192 192 
@@ -201,7 +201,7 @@ REGISTER_CPU_KERNEL(kAddExample, AddExampleCpuKernel);
201 201 
202## 编译部署202## 编译部署
203 203 
204-算子开发完成后,需对算子工程进行编译,生成自定义算子安装包\*\.run,具体操作如下:204+算子开发完成后,需对算子工程进行编译,生成自定义算子安装包*.run,具体操作如下:
205 205 
2061. **准备工作。**2061. **准备工作。**
207 207 
@@ -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>不支持42稀疏矩阵计算</td>102+ <td>不支持4:2稀疏矩阵计算</td>
103- <td>原依赖42稀疏特性提速的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>
@@ -159,7 +159,7 @@ gather_v2算子根据合轴后的尾轴为单位进行gather,因此模板选
159 159 
160SIMD实现采用传统的向量化编程模型,需显式管理UB缓冲区和流水队列:160SIMD实现采用传统的向量化编程模型,需显式管理UB缓冲区和流水队列:
161 161 
162-```Cpp162+```cpp
163// SIMD: 使用队列机制管理数据缓冲163// SIMD: 使用队列机制管理数据缓冲
164TQueBind<QuePosition::VECIN, QuePosition::VECOUT, BUFFER_NUM> inQueue_;164TQueBind<QuePosition::VECIN, QuePosition::VECOUT, BUFFER_NUM> inQueue_;
165TBuf<QuePosition::VECCALC> indexBuf_;165TBuf<QuePosition::VECCALC> indexBuf_;
@@ -168,14 +168,14 @@ TBuf<QuePosition::VECCALC> indexBuf_;
168for (int64_t j = 0; j < rows; j++) {168for (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}
173inQueue_.EnQue<int8_t>(xLocal); // 入队等待输出173inQueue_.EnQue<int8_t>(xLocal); // 入队等待输出
174```174```
175 175 
176SIMT采用线程级并行模型,每个线程独立处理元素:176SIMT采用线程级并行模型,每个线程独立处理元素:
177 177 
178-```Cpp178+```cpp
179// SIMT: 使用线程级并行,无需显式buffer管理179// SIMT: 使用线程级并行,无需显式buffer管理
180__simt_vf__ LAUNCH_BOUND(2048) void GatherSimt(...) {180__simt_vf__ LAUNCH_BOUND(2048) void GatherSimt(...) {
181 for (INDEX_SIZE_T index = Simt::GetThreadIdx();181 for (INDEX_SIZE_T index = Simt::GetThreadIdx();
@@ -340,7 +340,7 @@ Ascend 950新架构引入UB2L1 & L0C2UB间的直连通路,实现矩阵计算
340 340 
341对于切K或多阶段融合场景,可将"L0C搬回GM再读回UB"改为"L0C直达UB累加/后处理",降低GM往返带宽压力和时延。迁移时建议把中间结果归并、激活/量化前处理放到UB侧完成,并显式梳理MTE1/MTE2/MTE3与计算单元的事件同步顺序,确保跨单元流水连续,避免由于新增通路引入数据可见性或同步时序问题。关键接口定义可参考:341对于切K或多阶段融合场景,可将"L0C搬回GM再读回UB"改为"L0C直达UB累加/后处理",降低GM往返带宽压力和时延。迁移时建议把中间结果归并、激活/量化前处理放到UB侧完成,并显式梳理MTE1/MTE2/MTE3与计算单元的事件同步顺序,确保跨单元流水连续,避免由于新增通路引入数据可见性或同步时序问题。关键接口定义可参考:
342 342 
343-```Cpp343+```cpp
344// 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式344// 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式
345template <typename T>345template <typename T>
346__aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams);346__aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams);
@@ -4,7 +4,7 @@
4 4 
5本文档介绍自定义算子的图模式适配方法,整体流程与算子开发指南([AI Core算子开发指南](aicore_develop_guide.md)/[AI CPU算子开发指南](aicpu_develop_guide.md))一致。值得注意的是,**不需要进行aclnn适配**,只需做如下交付件适配,即可实现图模式调用算子。5本文档介绍自定义算子的图模式适配方法,整体流程与算子开发指南([AI Core算子开发指南](aicore_develop_guide.md)/[AI CPU算子开发指南](aicpu_develop_guide.md))一致。值得注意的是,**不需要进行aclnn适配**,只需做如下交付件适配,即可实现图模式调用算子。
6 6 
7-```Cpp7+```cpp
8${op_name} # 替换为实际算子名的小写下划线形式8${op_name} # 替换为实际算子名的小写下划线形式
9├── op_host # Host侧实现9├── op_host # Host侧实现
10│ └── ${op_name}_infershape.cpp # InferShape实现,实现算子形状推导,在运行时推导输出shape10│ └── ${op_name}_infershape.cpp # InferShape实现,实现算子形状推导,在运行时推导输出shape
@@ -26,7 +26,7 @@ InferShape函数的作用是根据输入的shape推导输出的shape。
26 26 
27示例如下,`AddExample`算子完整代码请参考`examples/add_example_aicpu/op_host`下[add_example_infershape.cpp](../../../examples/add_example_aicpu/op_host/add_example_infershape.cpp)。27示例如下,`AddExample`算子完整代码请参考`examples/add_example_aicpu/op_host`下[add_example_infershape.cpp](../../../examples/add_example_aicpu/op_host/add_example_infershape.cpp)。
28 28 
29-```C++29+```cpp
30// AddExample算子逻辑是两个数相加,因此输出shape与输入shape一致30// AddExample算子逻辑是两个数相加,因此输出shape与输入shape一致
31static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context)31static ge::graphStatus InferShapeAddExample(gert::InferShapeContext* context)
32{32{
@@ -56,7 +56,7 @@ InferDataType函数的作用是根据输入的DataType推导输出的DataType。
56 56 
57示例如下,`AddExample`算子完整代码请参考`examples/add_example_aicpu/op_graph`下[add_example_graph_infer.cpp](../../../examples/add_example_aicpu/op_graph/add_example_graph_infer.cpp)。57示例如下,`AddExample`算子完整代码请参考`examples/add_example_aicpu/op_graph`下[add_example_graph_infer.cpp](../../../examples/add_example_aicpu/op_graph/add_example_graph_infer.cpp)。
58 58 
59-```C++59+```cpp
60// AddExample算子逻辑是两个数相加,因此输出dataType与输入dataType一致60// AddExample算子逻辑是两个数相加,因此输出dataType与输入dataType一致
61static ge::graphStatus InferDataTypeAddExample(gert::InferDataTypeContext* context)61static ge::graphStatus InferDataTypeAddExample(gert::InferDataTypeContext* context)
62{62{
@@ -39,7 +39,7 @@ bash build.sh --help
39| -v | 可选 | 查看CMake编译配置信息。 |39| -v | 可选 | 查看CMake编译配置信息。 |
40| -O${n} | 可选 | 指定编译优化级别,支持O0/O1/O2/O3(如:-O3),${n}为优化级别标识。 |40| -O${n} | 可选 | 指定编译优化级别,支持O0/O1/O2/O3(如:-O3),${n}为优化级别标识。 |
41| -u | 可选 | 启用单元测试(UT)编译模式,编译所有UT目标。 |41| -u | 可选 | 启用单元测试(UT)编译模式,编译所有UT目标。 |
42-| --help, -h | 可选 | 打印脚本使用帮助信息。 |42+| --help,-h | 可选 | 打印脚本使用帮助信息。 |
43| --ops | 可选 | 指定待编译的算子,如:grid_sample,iou_v2,多个算子用英文逗号“,”分隔,不可与--ophost、--opapi、--opgraph同时使用。 |43| --ops | 可选 | 指定待编译的算子,如:grid_sample,iou_v2,多个算子用英文逗号“,”分隔,不可与--ophost、--opapi、--opgraph同时使用。 |
44| --soc | 可选 | 指定NPU型号,每次编译只支持1个NPU型号。 |44| --soc | 可选 | 指定NPU型号,每次编译只支持1个NPU型号。 |
45| --jit | 可选 | 静态图场景下,编译`cann-${soc_name}-ops-cv_${cann_version}_linux-${arch}.run`整包时不需要编译算子二进制文件(图的运行态会在线编译),可以配置该选项,以提升编译速度。 |45| --jit | 可选 | 静态图场景下,编译`cann-${soc_name}-ops-cv_${cann_version}_linux-${arch}.run`整包时不需要编译算子二进制文件(图的运行态会在线编译),可以配置该选项,以提升编译速度。 |
@@ -18,7 +18,7 @@
18| opbase(自CANN 9.0.0及以后版本需要下载) | master | [opbase](https://gitcode.com/cann/opbase) |18| opbase(自CANN 9.0.0及以后版本需要下载) | master | [opbase](https://gitcode.com/cann/opbase) |
19| cann-cmake | master-044 | [cmake-master-044.tar.gz](https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/cmake/cmake-master-044.tar.gz) |19| cann-cmake | master-044 | [cmake-master-044.tar.gz](https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/cmake/cmake-master-044.tar.gz) |
20 20 
21-您的编译环境可以访问网络,请参考[联网编译](#联网编译),编译脚本会自动联网下载第三方软件。否则,请参考[未联网编译](#未联网编译)手动下载第三方软件。21+若编译环境可以访问网络,请参考[联网编译](#联网编译),编译脚本会自动联网下载第三方软件。否则,请参考[未联网编译](#未联网编译)手动下载第三方软件。
22 22 
23准备好开源第三方软件后,可采用如下编译方式,请按需选择:23准备好开源第三方软件后,可采用如下编译方式,请按需选择:
24 24 
@@ -32,7 +32,7 @@
32 32 
33- **ops-cv静态库**33- **ops-cv静态库**
34 34 
35- > 说明:若您需要**基于本项目进行二次发布**并且对**软件包大小有要求**时,建议采用静态库编译,该库可以链接您的应用开发程序,仅保留业务所需的算子,从而实现软件最小化部署。35+ > 说明:如果需要**基于本项目进行二次发布**并且对**软件包大小有要求**时,建议采用静态库编译,该库可以链接应用开发程序,仅保留业务所需的算子,从而实现软件最小化部署。
36 36 
37 表示整个项目编译为一个静态库文件,包含libcann_cv_static.a和aclnn接口头文件。该包仅支持aclnn调用AI Core算子。37 表示整个项目编译为一个静态库文件,包含libcann_cv_static.a和aclnn接口头文件。该包仅支持aclnn调用AI Core算子。
38 38 
@@ -110,7 +110,7 @@
110 ```bash110 ```bash
111 Self-extractable archive "cann-${soc_name}-ops-cv_${cann_version}_linux-${arch}.run" successfully created.111 Self-extractable archive "cann-${soc_name}-ops-cv_${cann_version}_linux-${arch}.run" successfully created.
112 ```112 ```
113- 113+ 
114 \$\{soc\_name\}表示NPU型号名称,即\$\{soc\_version\}删除“ascend”后剩余的内容。编译成功后,run包存放于build_out目录下。114 \$\{soc\_name\}表示NPU型号名称,即\$\{soc\_version\}删除“ascend”后剩余的内容。编译成功后,run包存放于build_out目录下。
115 115 
1162. **安装ops-cv包**1162. **安装ops-cv包**
@@ -179,9 +179,9 @@
179 在联网环境中提前下载第三方软件,目前有如下方式,请按需选择:179 在联网环境中提前下载第三方软件,目前有如下方式,请按需选择:
180 180 
181 - 方式1:根据[安装第三方依赖](#安装第三方依赖)提供的表格手动下载,若从其他地址下载,请确保版本号一致。181 - 方式1:根据[安装第三方依赖](#安装第三方依赖)提供的表格手动下载,若从其他地址下载,请确保版本号一致。
182- 182+ 
183 - 方式2:通过[third_lib_download.py](../../../scripts/tools/third_lib_download.py)脚本一键下载,该脚本在本项目`scripts/tools/`目录,下载该脚本并执行如下命令:183 - 方式2:通过[third_lib_download.py](../../../scripts/tools/third_lib_download.py)脚本一键下载,该脚本在本项目`scripts/tools/`目录,下载该脚本并执行如下命令:
184- 184+ 
185 ```bash185 ```bash
186 python ${scripts_dir}/third_lib_download.py186 python ${scripts_dir}/third_lib_download.py
187 ```187 ```
@@ -193,36 +193,34 @@
193 将下载好的第三方软件上传至离线环境,可存放在`third_party`目录或自定义目录下。**推荐前者,其编译命令与联网编译场景下的命令一致。**193 将下载好的第三方软件上传至离线环境,可存放在`third_party`目录或自定义目录下。**推荐前者,其编译命令与联网编译场景下的命令一致。**
194 194 
195 - **third\_party目录**(推荐)195 - **third\_party目录**(推荐)
196- 196+ 
197- 请在本项目根目录创建`third_party`目录(若有则无需创建),将第三方软件拷贝到该指定目录。此时编译命令与联网编译命令一致,具体参考[联网编译](#联网编译)。
198-
199 - **自定义目录**197 - **自定义目录**
200- 198+ 
201 在离线环境的任意位置新建`${cann_3rd_lib_path}`目录,将第三方软件拷贝到该目录,请确保该目录有权限访问。199 在离线环境的任意位置新建`${cann_3rd_lib_path}`目录,将第三方软件拷贝到该目录,请确保该目录有权限访问。
202 200 
203 ```bash201 ```bash
204 mkdir -p ${cann_3rd_lib_path}202 mkdir -p ${cann_3rd_lib_path}
205 ```203 ```
206- 204+ 
207 此时编译命令需在联网编译命令基础上额外增加`--cann_3rd_lib_path=${cann_3rd_lib_path}`用于指定第三方软件所在路径。假设存放路径为`/path/cann_3rd_lib_path`,不同编译方式对应的命令如下:205 此时编译命令需在联网编译命令基础上额外增加`--cann_3rd_lib_path=${cann_3rd_lib_path}`用于指定第三方软件所在路径。假设存放路径为`/path/cann_3rd_lib_path`,不同编译方式对应的命令如下:
208- 206+ 
209 - 自定义算子包207 - 自定义算子包
210- 208+ 
211 ```bash209 ```bash
212 bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] --cann_3rd_lib_path=${cann_3rd_lib_path}210 bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] --cann_3rd_lib_path=${cann_3rd_lib_path}
213 # 以GridSample算子编译为例211 # 以GridSample算子编译为例
214 # bash build.sh --pkg --soc=ascend910b --ops=grid_sample -j16 --cann_3rd_lib_path=/path/cann_3rd_lib_path212 # bash build.sh --pkg --soc=ascend910b --ops=grid_sample -j16 --cann_3rd_lib_path=/path/cann_3rd_lib_path
215 ```213 ```
216- 214+ 
217 - ops-cv整包215 - ops-cv整包
218- 216+ 
219 ```bash217 ```bash
220 bash build.sh --pkg --soc=${soc_version} --cann_3rd_lib_path=${cann_3rd_lib_path}218 bash build.sh --pkg --soc=${soc_version} --cann_3rd_lib_path=${cann_3rd_lib_path}
221 # bash build.sh --pkg --soc=ascend910b --cann_3rd_lib_path=/path/cann_3rd_lib_path219 # bash build.sh --pkg --soc=ascend910b --cann_3rd_lib_path=/path/cann_3rd_lib_path
222 ```220 ```
223- 221+ 
224 - ops-cv静态库222 - ops-cv静态库
225- 223+ 
226 ```bash224 ```bash
227 bash build.sh --pkg --static --soc=${soc_version} --cann_3rd_lib_path=${cann_3rd_lib_path}225 bash build.sh --pkg --static --soc=${soc_version} --cann_3rd_lib_path=${cann_3rd_lib_path}
228 # bash build.sh --pkg --static --soc=ascend910b --cann_3rd_lib_path=/path/cann_3rd_lib_path226 # bash build.sh --pkg --static --soc=ascend910b --cann_3rd_lib_path=/path/cann_3rd_lib_path
@@ -9,7 +9,7 @@
9 9 
10项目全量目录层级介绍如下:10项目全量目录层级介绍如下:
11 11 
12-```Cpp12+```cpp
13├── cmake # 项目工程编译目录13├── cmake # 项目工程编译目录
14│ ├── aclnn_ops_cv.h.in # aclnn汇总头文件模板14│ ├── aclnn_ops_cv.h.in # aclnn汇总头文件模板
15│ └── ...15│ └── ...
@@ -95,7 +95,7 @@
95├── docs # 项目相关文档目录95├── docs # 项目相关文档目录
96├── examples # 端到端算子开发和调用示例96├── examples # 端到端算子开发和调用示例
97│ ├── add_example # AI Core算子示例目录97│ ├── add_example # AI Core算子示例目录
98-│ │ ├── CMakeLists.txt # 算子编译配置文件 98+│ │ ├── CMakeLists.txt # 算子编译配置文件
99│ │ ├── examples # 算子使用示例目录99│ │ ├── examples # 算子使用示例目录
100│ │ ├── op_graph # 算子构图相关目录100│ │ ├── op_graph # 算子构图相关目录
101│ │ ├── op_host # 算子信息库、Tiling、InferShape相关实现目录101│ │ ├── op_host # 算子信息库、Tiling、InferShape相关实现目录
@@ -117,7 +117,7 @@
117 - \$\{soc\_name\}:表示NPU型号名称。117 - \$\{soc\_name\}:表示NPU型号名称。
118 - \$\{install\_path\}:表示指定安装路径,ops包需与toolkit包安装在相同路径,root用户默认安装在`/usr/local/Ascend`目录。118 - \$\{install\_path\}:表示指定安装路径,ops包需与toolkit包安装在相同路径,root用户默认安装在`/usr/local/Ascend`目录。
119 119 
120- - **场景2:体验已发布版本能力或基于已发布版本进行开发**120+- **场景2:体验已发布版本能力或基于已发布版本进行开发**
121 121 
122 请访问[CANN官网下载中心](https://www.hiascend.com/cann/download),选择发布版本(仅支持CANN 8.5.0及后续版本),并根据产品型号和环境架构下载对应包,最后参考网页提供的命令完成安装。122 请访问[CANN官网下载中心](https://www.hiascend.com/cann/download),选择发布版本(仅支持CANN 8.5.0及后续版本),并根据产品型号和环境架构下载对应包,最后参考网页提供的命令完成安装。
123 123 
@@ -490,7 +490,7 @@ resultData[3] is: 4.000000
490 }490 }
491 ```491 ```
492 492 
493-3. 创建CMakelist文件。493+3. 创建CMakelists文件。
494 494 
495`${test_geir_op_name}.cpp`同级目录下创建CMakeLists.txt文件,GE图引擎会根据配置好的环境变量自动加载已安装好的算子包(无论是自定义算子包或是标准内置算子包)库文件,无需特意区分。示例如下,仅供参考,请根据实际情况自行修改。495`${test_geir_op_name}.cpp`同级目录下创建CMakeLists.txt文件,GE图引擎会根据配置好的环境变量自动加载已安装好的算子包(无论是自定义算子包或是标准内置算子包)库文件,无需特意区分。示例如下,仅供参考,请根据实际情况自行修改。
496 496 
@@ -24,7 +24,7 @@
24> - 配置说明:因CANN或NPU型号不同等原因,可能无法保证同一个算子多次运行结果一致。在相同条件下(平台、设备、版本号和其他随机性参数等),部分算子接口可通过`aclrtCtxSetSysParamOpt`(参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityRuntimeApi))开启确定性算法,使多次运行结果一致。24> - 配置说明:因CANN或NPU型号不同等原因,可能无法保证同一个算子多次运行结果一致。在相同条件下(平台、设备、版本号和其他随机性参数等),部分算子接口可通过`aclrtCtxSetSysParamOpt`(参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityRuntimeApi))开启确定性算法,使多次运行结果一致。
25> - 性能说明:同一个算子采用确定性计算通常比非确定性慢,因此模型单次运行性能可能会下降。但在实验、调试调测等需要保证多次运行结果相同来定位问题的场景,确定性计算可以提升效率。25> - 性能说明:同一个算子采用确定性计算通常比非确定性慢,因此模型单次运行性能可能会下降。但在实验、调试调测等需要保证多次运行结果相同来定位问题的场景,确定性计算可以提升效率。
26> - 线程说明:同一线程中只能设置一次确定性状态,多次设置以最后一次有效设置为准。有效设置是指设置确定性状态后,真正执行了一次算子任务下发。如果仅设置,没有算子下发,只能是确定性变量开启但未下发给算子,因此不执行算子。26> - 线程说明:同一线程中只能设置一次确定性状态,多次设置以最后一次有效设置为准。有效设置是指设置确定性状态后,真正执行了一次算子任务下发。如果仅设置,没有算子下发,只能是确定性变量开启但未下发给算子,因此不执行算子。
27-> 解决方案:暂不推荐一个线程多次设置确定性。该问题在二进制开启和关闭情况下均存在,在后续版本中会解决该问题。27+> 解决方案:暂不推荐一个线程多次设置确定性状态。该问题在二进制开启和关闭情况下均存在,在后续版本中会解决该问题。
28 28 
29算子接口列表如下:29算子接口列表如下:
30 30 
@@ -75,4 +75,4 @@
75| [aclnnRoiAlignV2Backward](../../objdetect/roi_align_grad/docs/aclnnRoiAlignV2Backward.md) |[aclnnRoiAlignV2](../../objdetect/roi_align/docs/aclnnRoiAlignV2.md)的反向传播。 |默认非确定性实现,支持配置开启|默认确定性实现|75| [aclnnRoiAlignV2Backward](../../objdetect/roi_align_grad/docs/aclnnRoiAlignV2Backward.md) |[aclnnRoiAlignV2](../../objdetect/roi_align/docs/aclnnRoiAlignV2.md)的反向传播。 |默认非确定性实现,支持配置开启|默认确定性实现|
76| [aclnnRoiPoolingWithArgMax](../../objdetect/roi_pooling_with_arg_max/docs/aclnnRoiPoolingWithArgMax.md) | 对输入特征图按ROI(感兴趣区域)进行池化,在每个ROI内按空间划分为pooled_h × pooled_w个格子,对每个格子做最大池化,并输出池化结果及最大值在通道内的一维索引(argmax)。| - |默认确定性实现|76| [aclnnRoiPoolingWithArgMax](../../objdetect/roi_pooling_with_arg_max/docs/aclnnRoiPoolingWithArgMax.md) | 对输入特征图按ROI(感兴趣区域)进行池化,在每个ROI内按空间划分为pooled_h × pooled_w个格子,对每个格子做最大池化,并输出池化结果及最大值在通道内的一维索引(argmax)。| - |默认确定性实现|
77| [aclnnRoiPoolingGradWithArgMax](../../objdetect/roi_pooling_grad_with_arg_max/docs/aclnnRoiPoolingGradWithArgMax.md) | [aclnnRoiPoolingWithArgMax](../../objdetect/roi_pooling_with_arg_max/docs/aclnnRoiPoolingWithArgMax.md)的反向传播。 | - |默认非确定性实现,不支持配置开启|77| [aclnnRoiPoolingGradWithArgMax](../../objdetect/roi_pooling_grad_with_arg_max/docs/aclnnRoiPoolingGradWithArgMax.md) | [aclnnRoiPoolingWithArgMax](../../objdetect/roi_pooling_with_arg_max/docs/aclnnRoiPoolingWithArgMax.md)的反向传播。 | - |默认非确定性实现,不支持配置开启|
78-| [aclnnIm2colBackward](../../image/col2im/docs/aclnnIm2colBackward.md) | 从批处理输入张量中提取滑动局部块,将滑动局部块数组合并一个大张量。 |默认确定性实现|默认确定性实现|78+| [aclnnIm2colBackward](../../image/col2im/docs/aclnnIm2colBackward.md) | 将梯度张量还原原始输入张量的梯度分布,完成反向传播计算。 |默认确定性实现|默认确定性实现|
@@ -74,7 +74,7 @@
74 <td>&cross;</td>74 <td>&cross;</td>
75 <td>&check;</td>75 <td>&check;</td>
76 <td>AI CPU</td>76 <td>AI CPU</td>
77- <td>从输入图像中提取多个裁剪区域,并将它们统一调整为指定大小,支持双线性插值和最近邻插值。</td>77+ <td>从输入图像中提取多个裁剪区域并将它们统一调整为指定大小,支持双线性插值和最近邻插值。</td>
78 </tr>78 </tr>
79 <tr>79 <tr>
80 <td>image</td>80 <td>image</td>
@@ -334,7 +334,7 @@
334 <td>&check;</td>334 <td>&check;</td>
335 <td>&cross;</td>335 <td>&cross;</td>
336 <td>AI Core</td>336 <td>AI Core</td>
337- <td>对由多个输入通道组成的输入信号应用2D双三次上采样。如果输入Tensorx的shape为(N,C,H,W),则输出Tensorout的shape为(N,C,outputSize[0],outputSize[1])。</td>337+ <td>对由多个输入通道组成的输入信号应用2D双三次上采样。如果输入Tensor x的shape为(N,C,H,W),则输出Tensor out的shape为(N,C,outputSize[0],outputSize[1])。</td>
338 </tr>338 </tr>
339 <tr>339 <tr>
340 <td>image</td>340 <td>image</td>
@@ -344,7 +344,7 @@
344 <td>&check;</td>344 <td>&check;</td>
345 <td>&cross;</td>345 <td>&cross;</td>
346 <td>AI Core</td>346 <td>AI Core</td>
347- <td>对由多个输入通道组成的输入信号应用双三次抗锯齿算法进行上采样。如果输入Tensorx的shape为(N,C,H,W),则输出Tensorout的shape为(N,C,outputSize[0],outputSize[1])。</td>347+ <td>对由多个输入通道组成的输入信号应用双三次抗锯齿算法进行上采样。如果输入Tensor x的shape为(N,C,H,W),则输出Tensor out的shape为(N,C,outputSize[0],outputSize[1])。</td>
348 </tr>348 </tr>
349 <tr>349 <tr>
350 <td>image</td>350 <td>image</td>
@@ -434,7 +434,7 @@
434 <td>&check;</td>434 <td>&check;</td>
435 <td>&cross;</td>435 <td>&cross;</td>
436 <td>AI Core</td>436 <td>AI Core</td>
437- <td>[UpsampleNearest](../../image/upsample_nearest/README.md)在exact_mode为true时的反向传播。</td>437+ <td><a href="../../image/upsample_nearest/README.md">UpsampleNearest</a>在exact_mode为true时的反向传播。</td>
438 </tr>438 </tr>
439 <tr>439 <tr>
440 <td>image</td>440 <td>image</td>