已合并
修改仓上格式语法问题 #75
caiwenwen创建于 7月25日
修改仓上格式语法问题 #75
已合并
caiwenwen创建于 7月25日
共 25 个文件变更+90-90
@@ -14,20 +14,20 @@
14 14 
15 如果您在本项目中发现了某些算子Bug,希望对其进行修复,欢迎您新建Issue进行反馈和跟踪处理。15 如果您在本项目中发现了某些算子Bug,希望对其进行修复,欢迎您新建Issue进行反馈和跟踪处理。
16 16 
17- 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建 `Bug-Report|缺陷反馈` 类Issue对Bug进行描述,然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您进行处理。17+ 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建`Bug-Report|缺陷反馈`类Issue对Bug进行描述,然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您进行处理。
18 18 
19- 算子优化19- 算子优化
20 20 
21 如果您对本项目中某些算子实现有泛化性增强/性能优化思路,希望着手实现这些优化点,欢迎您对算子进行优化贡献。21 如果您对本项目中某些算子实现有泛化性增强/性能优化思路,希望着手实现这些优化点,欢迎您对算子进行优化贡献。
22 22 
23- 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建 `Requirement|需求建议` 类Issue对优化点进行说明,并提供您的设计方案,23+ 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建`Requirement|需求建议`类Issue对优化点进行说明,并提供您的设计方案,
24 然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您进行跟踪优化。24 然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您进行跟踪优化。
25 25 
26- 贡献新算子26- 贡献新算子
27 27 
28 如果您有全新的算子想基于NPU进行设计实现,欢迎您在Issue中提出新的想法和设计。28 如果您有全新的算子想基于NPU进行设计实现,欢迎您在Issue中提出新的想法和设计。
29 29 
30- 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建 `Requirement|需求建议` 类Issue提供新增算子说明和设计方案,项目成员会与您进行沟通确认,并在`experimental`目录下为您的算子提供一个合适的`contrib`目录分类,您可以将新增算子贡献到对应目录下。30+ 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建`Requirement|需求建议`类Issue提供新增算子说明和设计方案,项目成员会与您进行沟通确认,并在`experimental`目录下为您的算子提供一个合适的`contrib`目录分类,您可以将新增算子贡献到对应目录下。
31 31 
32 同时,您需要在提交的Issue中评论“/assign”或“/assign @yourself”,认领该Issue并在后续完成新算子上库。32 同时,您需要在提交的Issue中评论“/assign”或“/assign @yourself”,认领该Issue并在后续完成新算子上库。
33 33 
@@ -52,7 +52,7 @@
52 52 
53 如果您在本项目中发现某些算子文档描述错误,欢迎您新建Issue进行反馈和修复。53 如果您在本项目中发现某些算子文档描述错误,欢迎您新建Issue进行反馈和修复。
54 54 
55- 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建 `Documentation|文档反馈` 类Issue指出对应文档的问题,然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您纠正对应文档描述。55+ 您可以按照[提交Issue/处理Issue任务](https://gitcode.com/cann/community#提交Issue处理Issue任务)指引新建`Documentation|文档反馈`类Issue指出对应文档的问题,然后在评论框中输入“/assign”或“/assign @yourself”,将该Issue分配给您纠正对应文档描述。
56 56 
57- 帮助解决他人Issue57- 帮助解决他人Issue
58 58 
@@ -28,7 +28,7 @@ ops-ras是[CANN](https://hiascend.com/software/cann)(Compute Architecture for
28git clone -b 9.0.0 https://gitcode.com/cann/ops-ras.git28git clone -b 9.0.0 https://gitcode.com/cann/ops-ras.git
29```29```
30 30 
31-> 说明:若环境中已存在配套分支源码,**可跳过本步骤**,例如CANNLab默认已提供最新商发版CANN对应的源码。31+> 说明:若环境中已存在配套分支源码,**可跳过本步骤**,例如CANNLab默认已提供最新最新版CANN对应的源码。
32 32 
33## 📖学习教程33## 📖学习教程
34 34 
@@ -44,7 +44,7 @@
44 简短说明(不超过50字符)44 简短说明(不超过50字符)
45 45
46 如有必要,在此处进行更详细描述。说明修改的原因和内容,而不是具体改了什么(代码本身会展示)。46 如有必要,在此处进行更详细描述。说明修改的原因和内容,而不是具体改了什么(代码本身会展示)。
47- 关联的 Issue: #12347+ 关联的Issue: #123
48 ```48 ```
49 49 
504. **发起Pull Request**504. **发起Pull Request**
@@ -6,7 +6,7 @@
6 6 
71. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。71. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。
8 8 
9- > **说明**:CANNLab或Docker环境默认提供最新商发版CANN包;如需体验master分支最新能力,可手动搭建环境。9+ > **说明**:CANNLab或Docker环境默认提供最新最新版CANN包;如需体验master分支最新能力,可手动搭建环境。
10 10 
112. **[编译运行](#一编译运行)**:编译自定义算子包并安装,实现快速调用算子。112. **[编译运行](#一编译运行)**:编译自定义算子包并安装,实现快速调用算子。
12 12 
@@ -24,7 +24,7 @@
24 24
25- CANNLab云开发环境:25- CANNLab云开发环境:
26 26
27- 默认提供最新商发版CANN包配套的项目源码,进入源码目录,\$\{gitCode\_id\}替换为开发者个人gitCode账号。27+ 默认提供最新最新版CANN包配套的项目源码,进入源码目录,\$\{gitCode\_id\}替换为开发者个人gitCode账号。
28 28
29 ```bash29 ```bash
30 cd /mnt/workspace/gitCode/${gitCode_id}/ops-ras30 cd /mnt/workspace/gitCode/${gitCode_id}/ops-ras
@@ -47,7 +47,7 @@
47 47 
48本指南默认采用**单算子编译**:仅构建目标算子,编译时间短,适合快速入门与日常开发。通用命令格式:`bash build.sh --pkg --soc=<芯片版本> --ops=<算子名>`。48本指南默认采用**单算子编译**:仅构建目标算子,编译时间短,适合快速入门与日常开发。通用命令格式:`bash build.sh --pkg --soc=<芯片版本> --ops=<算子名>`。
49 49 
50-> 若需编译整个算子库(省略 `--ops`),请参阅 [build参数说明](zh/install/build.md)。50+> 若需编译整个算子库(省略`--ops`),请参阅 [build参数说明](zh/install/build.md)。
51 51 
52以AddExample算子为例,编译命令如下:52以AddExample算子为例,编译命令如下:
53 53 
@@ -144,7 +144,7 @@ __aicore__ inline void AddExample<T>::Compute(int32_t progress)
144 bash build.sh --pkg --soc=${soc_version} --ops=add_example -j16144 bash build.sh --pkg --soc=${soc_version} --ops=add_example -j16
145 ```145 ```
146 146 
147- > **说明**:`${soc_version}` 请根据实际芯片型号填写,取值方式同[编译AddExample算子](#2-编译addexample算子)中的说明。147+ > **说明**:`${soc_version}`请根据实际芯片型号填写,取值方式同[编译AddExample算子](#2-编译addexample算子)中的说明。
148 148 
1492. **重新安装**:1492. **重新安装**:
150 150 
@@ -242,7 +242,7 @@ int main() {
242 // ... 初始化代码 ...242 // ... 初始化代码 ...
243 243 
244 // === ① 修改selfX的输入 ===244 // === ① 修改selfX的输入 ===
245- // 修改前:shape = {32, 4, 4, 4}, 数值全为1245+ // 修改前:shape = {32, 4, 4, 4},数值全为1
246 // 修改后:将输入shape改为 {8, 8, 8, 8},并填充不同的测试数据246 // 修改后:将输入shape改为 {8, 8, 8, 8},并填充不同的测试数据
247 std::vector<int64_t> selfXShape = {8, 8, 8, 8};247 std::vector<int64_t> selfXShape = {8, 8, 8, 8};
248 std::vector<float> selfXHostData(4096); // 4096 = 8 * 8 * 8 *8248 std::vector<float> selfXHostData(4096); // 4096 = 8 * 8 * 8 *8
@@ -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 
@@ -2,7 +2,7 @@
2 2 
3数据格式(format)是用于描述一个多维Tensor的轴的业务语义,表示数据的物理排布格式,如1D、2D、3D、4D、5D等,一般在CNN(Convolutional Neural Networks)类的API中需要描述具体的格式。3数据格式(format)是用于描述一个多维Tensor的轴的业务语义,表示数据的物理排布格式,如1D、2D、3D、4D、5D等,一般在CNN(Convolutional Neural Networks)类的API中需要描述具体的格式。
4 4 
5-关于aclTensor支持的**全量数据格式范围**参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi)中“数据类型及其操作接口>aclFormat”。5+关于aclTensor支持的**全量数据格式范围**参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityCppApi)中“数据类型及其操作接口>aclFormat”。
6 6 
7关于**数据格式排布原理**介绍参见[《Ascend C算子开发指南》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语>神经网络和算子>数据排布格式”。7关于**数据格式排布原理**介绍参见[《Ascend C算子开发指南》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语>神经网络和算子>数据排布格式”。
8 8 
@@ -1,6 +1,6 @@
1# 数据类型1# 数据类型
2 2 
3-通过**aclCreateTensor**接口创建aclTensor时,支持的全量数据类型参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi)中“数据类型及其操作接口>aclDataType”。3+通过**aclCreateTensor**接口创建aclTensor时,支持的全量数据类型参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityCppApi)中“数据类型及其操作接口>aclDataType”。
4两段式接口参数说明时,为了方便描述,支持的数据类型将采用如下简写形式。4两段式接口参数说明时,为了方便描述,支持的数据类型将采用如下简写形式。
5 5 
6**表1** 数据类型简写表6**表1** 数据类型简写表
@@ -18,7 +18,7 @@
18> a<sub>8,0</sub> , a<sub>8,1</sub> , a<sub>8,2</sub> , a<sub>8,3</sub> , a<sub>8,4</sub> , a<sub>8,5</sub> , a<sub>8,6</sub> , a<sub>8,7</sub> , a<sub>8,8</sub> , a<sub>8,9</sub>18> a<sub>8,0</sub> , a<sub>8,1</sub> , a<sub>8,2</sub> , a<sub>8,3</sub> , a<sub>8,4</sub> , a<sub>8,5</sub> , a<sub>8,6</sub> , a<sub>8,7</sub> , a<sub>8,8</sub> , a<sub>8,9</sub>
19> a<sub>9,0</sub> , a<sub>9,1</sub> , a<sub>9,2</sub> , a<sub>9,3</sub> , a<sub>9,4</sub> , a<sub>9,5</sub> , a<sub>9,6</sub> , a<sub>9,7</sub> , a<sub>9,8</sub> , a<sub>9,9</sub>19> a<sub>9,0</sub> , a<sub>9,1</sub> , a<sub>9,2</sub> , a<sub>9,3</sub> , a<sub>9,4</sub> , a<sub>9,5</sub> , a<sub>9,6</sub> , a<sub>9,7</sub> , a<sub>9,8</sub> , a<sub>9,9</sub>
20 20 
21-即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为1, 该维度是连续的;如果在维度0上的stride为10,那么相邻的元素间隔10个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。21+即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为1,该维度是连续的;如果在维度0上的stride为10,那么相邻的元素间隔10个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。
22 22 
23## 示例223## 示例2
24 24 
@@ -35,4 +35,4 @@
35> a<sub>8,0</sub> , a<sub>8,1</sub> , **a<sub>8,2</sub>** , a<sub>8,3</sub> , **a<sub>8,4</sub>** , a<sub>8,5</sub> , **a<sub>8,6</sub>** , a<sub>8,7</sub> , a<sub>8,8</sub> , a<sub>8,9</sub>35> a<sub>8,0</sub> , a<sub>8,1</sub> , **a<sub>8,2</sub>** , a<sub>8,3</sub> , **a<sub>8,4</sub>** , a<sub>8,5</sub> , **a<sub>8,6</sub>** , a<sub>8,7</sub> , a<sub>8,8</sub> , a<sub>8,9</sub>
36> a<sub>9,0</sub> , a<sub>9,1</sub> , a<sub>9,2</sub> , a<sub>9,3</sub> , a<sub>9,4</sub> , a<sub>9,5</sub> , a<sub>9,6</sub> , a<sub>9,7</sub> , a<sub>9,8</sub> , a<sub>9,9</sub>36> a<sub>9,0</sub> , a<sub>9,1</sub> , a<sub>9,2</sub> , a<sub>9,3</sub> , a<sub>9,4</sub> , a<sub>9,5</sub> , a<sub>9,6</sub> , a<sub>9,7</sub> , a<sub>9,8</sub> , a<sub>9,9</sub>
37 37 
38-即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为2, 该维度上间隔1个元素;如果在维度0上的stride为20,那么相邻的元素间隔20个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。38+即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为2,该维度上间隔1个元素;如果在维度0上的stride为20,那么相邻的元素间隔20个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。
@@ -4,7 +4,7 @@ CANN Simulator是一款面向算子开发场景的SoC级芯片仿真工具,用
4 4 
5# 主要功能5# 主要功能
6 6 
7-该工具与板上运行保持二进制兼容(同一 kernel可同时在仿真和AI处理器执行),主要用途如下:7+该工具与板上运行保持二进制兼容(同一kernel可同时在仿真和AI处理器执行),主要用途如下:
8 8 
9* 精度仿真:输出bit级精度结果,协助用户完成算子的精度验证。9* 精度仿真:输出bit级精度结果,协助用户完成算子的精度验证。
10* 性能仿真:输出指令流水图,协助用户定位算子性能瓶颈问题。10* 性能仿真:输出指令流水图,协助用户定位算子性能瓶颈问题。
@@ -26,7 +26,7 @@ CANN Simulator工具目前处于尝鲜版本阶段,仅支持Ascend950PR芯片
26 26 
27## 环境准备27## 环境准备
28 28 
29-CANN Simulator集成在CANN toolkit包里,参考[环境部署](../install/quick_install.md)中的软件包安装 -> 安装社区版CANN toolkit包章节29+CANN Simulator集成在CANN toolkit包里,参考[环境部署](../install/quick_install.md)中的软件包安装 -> 安装最新版CANN toolkit包章节
30 30 
31# 快速开始31# 快速开始
32 32 
@@ -51,7 +51,7 @@ bash build.sh --pkg --soc=Ascend950 --vendor_name=custom --ops=add_example
51cannsim record ./test_aclnn_add_example -s Ascend950 --gen-report51cannsim record ./test_aclnn_add_example -s Ascend950 --gen-report
52```52```
53 53 
54-仿真工具执行日志文件在examples/add_example/examples/build/bin/cannsim_*目录,执行日志文件为 cannsim.log。54+仿真工具执行日志文件在examples/add_example/examples/build/bin/cannsim_*目录,执行日志文件为cannsim.log。
55 55 
56从仿真工具日志文件可以看到示例中的打印信息:56从仿真工具日志文件可以看到示例中的打印信息:
57 57 
@@ -90,9 +90,9 @@ cannsim record [options] user_app --user_options
90| --- | --- | --- |90| --- | --- | --- |
91|-s \<value\> 或 --soc_version \<value\> [options]参数 | 必选 | 指定模拟目标芯片版本(如:Ascend950)。|91|-s \<value\> 或 --soc_version \<value\> [options]参数 | 必选 | 指定模拟目标芯片版本(如:Ascend950)。|
92|-o \<value\> 或 --output \<value\> [options]参数 | 可选| 生成文件所在路径,可配置为绝对路径或者相对路径,并且执行工具的用户需要具有读写权限。如果未指定路径,则默认在当前目录下保存数据。|92|-o \<value\> 或 --output \<value\> [options]参数 | 可选| 生成文件所在路径,可配置为绝对路径或者相对路径,并且执行工具的用户需要具有读写权限。如果未指定路径,则默认在当前目录下保存数据。|
93-|-g 或 --gen-report[options]参数 | 可选 | 启用仿真完成后是否进行自动解析,并生成分析报告。默认不自动解析。|93+|-g或 --gen-report[options]参数 | 可选 | 启用仿真完成后是否进行自动解析,并生成分析报告。默认不自动解析。|
94-|-n 或 --core-id | 可选 | 仿真期间启用日志的AI Core,格式同 report -n:'all'、'0-2,12-14'、'5'。默认全开;配合 -g 且未指定时回退到 core 0。|94+|-n或 --core-id | 可选 | 仿真期间启用日志的AI Core,格式同report -n:'all'、'0-2,12-14'、'5'。默认全开;配合 -g且未指定时回退到core 0。|
95-|-u 或 --user-option | 可选 | 用户自定义算子参数,以命令行选项形式传递给算子程序。|95+|-u或 --user-option | 可选 | 用户自定义算子参数,以命令行选项形式传递给算子程序。|
96|user_app|必选|待运行的算子程序或命令(如 ./app, python train.py, bash run.sh)。|96|user_app|必选|待运行的算子程序或命令(如 ./app, python train.py, bash run.sh)。|
97 97 
98## 使用示例98## 使用示例
@@ -101,7 +101,7 @@ cannsim record [options] user_app --user_options
1012. 执行仿真命令,可参考以下使用示例1012. 执行仿真命令,可参考以下使用示例
102 102 
103 ```bash103 ```bash
104- 方式一: 启用仿真,并将输出保存至 ./output 目录,/path/to/app 为算子程序104+ 方式一:启用仿真,并将输出保存至 ./output目录,/path/to/app为算子程序
105 $ cannsim record /path/to/app -o ./output -s Ascend950105 $ cannsim record /path/to/app -o ./output -s Ascend950
106 106 
107 方式二:启用仿真并生成报告,用于后续性能分析107 方式二:启用仿真并生成报告,用于后续性能分析
@@ -166,8 +166,8 @@ cannsim report [options]
166|参数 | 可选/必选 | 说明|166|参数 | 可选/必选 | 说明|
167| --- | --- | --- |167| --- | --- | --- |
168|-e \<value\> 或 --export \<value\> [options]参数 | 必选 | 原始结果文件目录,需指定为仿真执行后生成的结果目录,指定到cannsim_{timestamp}_${user_app}层,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。|168|-e \<value\> 或 --export \<value\> [options]参数 | 必选 | 原始结果文件目录,需指定为仿真执行后生成的结果目录,指定到cannsim_{timestamp}_${user_app}层,可配置为绝对路径或者相对路径,并且工具执行用户具有可读写权限。|
169-|-o 或 --output [options]参数 | 可选 | 解析结果输出目录,可配置为绝对路径或者相对路径,且执行用户需具有读写权限。若未指定路径,默认在当前目录下保存数据。如果生成的结果文件与现有文件同名,则会覆盖原有文件。|169+|-o或 --output [options]参数 | 可选 | 解析结果输出目录,可配置为绝对路径或者相对路径,且执行用户需具有读写权限。若未指定路径,默认在当前目录下保存数据。如果生成的结果文件与现有文件同名,则会覆盖原有文件。|
170-|-n 或 --core-id [options]参数 | 可选 | 指定生成指令流水的核ID,不指定默认生成0核的指令流水。配置的格式如下:生成所有核的流水,配置为‘all’。指定核ID的范围,如:‘0-1’。指定单核ID,如‘5’。|170+|-n或 --core-id [options]参数 | 可选 | 指定生成指令流水的核ID,不指定默认生成0核的指令流水。配置的格式如下:生成所有核的流水,配置为‘all’。指定核ID的范围,如:‘0-1’。指定单核ID,如‘5’。|
171 171 
172## 使用示例172## 使用示例
173 173 
@@ -204,7 +204,7 @@ cannsim report [options]
204 |MTE1|数据搬运流水,数据搬运方向为:L1 ->{L0A/L0B, UBUF}。|204 |MTE1|数据搬运流水,数据搬运方向为:L1 ->{L0A/L0B, UBUF}。|
205 |MTE2|数据搬运流水,数据搬运方向为:{DDR/GM, L2} ->{L1, L0A/B, UBUF}。|205 |MTE2|数据搬运流水,数据搬运方向为:{DDR/GM, L2} ->{L1, L0A/B, UBUF}。|
206 |MTE3|数据搬运流水,数据搬运方向为:UBUF -> {DDR/GM, L2, L1}、L1->{DDR/L2}。|206 |MTE3|数据搬运流水,数据搬运方向为:UBUF -> {DDR/GM, L2, L1}、L1->{DDR/L2}。|
207- |FIXP|数据搬运流水,数据搬运方向为:FIXPIPE L0C -> OUT/L1。(仅 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 支持展示)|207+ |FIXP|数据搬运流水,数据搬运方向为:FIXPIPE L0C -> OUT/L1。(仅Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持展示)|
208 |FLOWCTRL|控制流指令。|208 |FLOWCTRL|控制流指令。|
209 |ICACHELOAD|查看未命中的ICache。|209 |ICACHELOAD|查看未命中的ICache。|
210 210 
@@ -222,7 +222,7 @@ cannsim report [options]
222cannsim --help222cannsim --help
223```223```
224 224 
225-查询工具record 子命令的帮助信息:225+查询工具record子命令的帮助信息:
226 226 
227```bash227```bash
228cannsim record --help228cannsim record --help
@@ -25,7 +25,7 @@
25 25 
26* **aclnn异常错误信息获取**26* **aclnn异常错误信息获取**
27 27 
28- 通过aclGetRecentErrMsg接口(参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi))获取aclnn接口调用过程中的异常信息,使用方法如下:28+ 通过aclGetRecentErrMsg接口(参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityCppApi))获取aclnn接口调用过程中的异常信息,使用方法如下:
29 29 
30 ```bash30 ```bash
31 printf(aclGetRecentErrMsg());31 printf(aclGetRecentErrMsg());
@@ -105,7 +105,7 @@ Tiling主要切分逻辑。
105 105 
106```CPP106```CPP
107// ${op_name}_tiling.cpp107// ${op_name}_tiling.cpp
108-// 1.Tiling需要获取运行环境信息,包括可用核数、UB(Unified Buffer)大小,并将获取到的信息传递给CompileInfo, 自动生成aclnn不调用该函数,直接返回ge::GRAPH_SUCCESS即可。108+// 1.Tiling需要获取运行环境信息,包括可用核数、UB(Unified Buffer)大小,并将获取到的信息传递给CompileInfo,自动生成aclnn不调用该函数,直接返回ge::GRAPH_SUCCESS即可。
109static ge::graphStatus TilingParse(gert::TilingParseContext* context)109static ge::graphStatus TilingParse(gert::TilingParseContext* context)
110{110{
111 return ge::GRAPH_SUCCESS;111 return ge::GRAPH_SUCCESS;
@@ -216,7 +216,7 @@ graph LR
216 H([核函数定义]) -->A([定义Kernel类])216 H([核函数定义]) -->A([定义Kernel类])
217 A -->B([初始化函数<br>Init])217 A -->B([初始化函数<br>Init])
218 B -->C([主处理函数<br>Process])218 B -->C([主处理函数<br>Process])
219- subgraph C [主处理函数 Process]219+ subgraph C [主处理函数Process]
220 D([数据搬入<br>CopyIn]) -->E([计算<br>Compute]) -->F([数据搬出<br>CopyOut])220 D([数据搬入<br>CopyIn]) -->E([计算<br>Compute]) -->F([数据搬出<br>CopyOut])
221 end221 end
222 F -->G([Kernel执行完成])222 F -->G([Kernel执行完成])
@@ -289,7 +289,7 @@ private:
289 TQue<QuePosition::VECIN, BUFFER_NUM> inputQueueX_;289 TQue<QuePosition::VECIN, BUFFER_NUM> inputQueueX_;
290 // 输入队列Y,从GM拷贝到LM,BUFFER_NUM表示buffer数量,开启double buff达到流水并行,为2290 // 输入队列Y,从GM拷贝到LM,BUFFER_NUM表示buffer数量,开启double buff达到流水并行,为2
291 TQue<QuePosition::VECIN, BUFFER_NUM> inputQueueY_;291 TQue<QuePosition::VECIN, BUFFER_NUM> inputQueueY_;
292- // 输出队列Z,从LM拷贝到GM,BUFFER_NUM表示 buffer数量,这里开启double buff达到流水并行,为2292+ // 输出队列Z,从LM拷贝到GM,BUFFER_NUM表示buffer数量,这里开启double buff达到流水并行,为2
293 TQue<QuePosition::VECOUT, BUFFER_NUM> outputQueueZ_;293 TQue<QuePosition::VECOUT, BUFFER_NUM> outputQueueZ_;
294 294 
295 // 输入X的GM地址295 // 输入X的GM地址
@@ -340,7 +340,7 @@ __aicore__ inline void AddExample<T>::Process()
340 340 
341## aclnn适配341## aclnn适配
342 342 
343-通常算子开发和编译完成后,会自动生成aclnn接口(一套基于C 的API),可直接在应用程序中调用aclnn接口实现调用算子。343+通常算子开发和编译完成后,会自动生成aclnn接口(一套基于C的API),可直接在应用程序中调用aclnn接口实现调用算子。
344 344 
345为实现该调用方式,需提前生成算子对应的二进制包,配置二进制编译json文件。345为实现该调用方式,需提前生成算子对应的二进制包,配置二进制编译json文件。
346 346 
@@ -146,7 +146,7 @@ uint32_t AddExampleCpuKernel::Compute(CpuKernelContext& ctx) {
146 // 从CpuKernelContext中获取output tensor146 // 从CpuKernelContext中获取output tensor
147 Tensor* output = ctx.Output(0);147 Tensor* output = ctx.Output(0);
148 148 
149- // 对tensor进行基本校验, 判断是否为空指针149+ // 对tensor进行基本校验,判断是否为空指针
150 if (input0 == nullptr || input1 == nullptr || output == nullptr) {150 if (input0 == nullptr || input1 == nullptr || output == nullptr) {
151 return kParamInvalid;151 return kParamInvalid;
152 }152 }
@@ -180,7 +180,7 @@ REGISTER_CPU_KERNEL(kAddExample, AddExampleCpuKernel);
180 180 
181## aclnn适配181## aclnn适配
182 182 
183-通常算子开发和编译完成后,会自动生成aclnn接口(一套基于C 的API),无需做其他配置,可直接在应用程序中调用aclnn接口实现调用算子。183+通常算子开发和编译完成后,会自动生成aclnn接口(一套基于C的API),无需做其他配置,可直接在应用程序中调用aclnn接口实现调用算子。
184 184 
185## 编译部署185## 编译部署
186 186 
@@ -16,7 +16,7 @@ ${op_name} # 替换为实际算子名的小写下
16 16 
17## Shape与DataType推导17## Shape与DataType推导
18 18 
19-图模式需要完成两个交付件 `${op_name}_graph_infer.cpp` `${op_name}_infershape.cpp`19+图模式需要完成两个交付件`${op_name}_graph_infer.cpp` `${op_name}_infershape.cpp`
20 20 
21**交付件1:${op_name}_infershape.cpp**21**交付件1:${op_name}_infershape.cpp**
22 22 
@@ -57,7 +57,7 @@ bash build.sh --help
57| --ophost | 可选 | 编译libophost_ras.so库,不可与--pkg、--ops同时使用。 |57| --ophost | 可选 | 编译libophost_ras.so库,不可与--pkg、--ops同时使用。 |
58| --opapi | 可选 | 编译libopapi_ras.so库,不可与--pkg、--ops同时使用。 |58| --opapi | 可选 | 编译libopapi_ras.so库,不可与--pkg、--ops同时使用。 |
59| --opgraph | 可选 | 编译libopgraph_ras.so库,不可与--pkg、--ops同时使用。 |59| --opgraph | 可选 | 编译libopgraph_ras.so库,不可与--pkg、--ops同时使用。 |
60-| --run_example | 可选 | 编译指定算子及模式的样例并执行编译后的可执行文件,使用--run_example --help 查看使用方法。 |60+| --run_example | 可选 | 编译指定算子及模式的样例并执行编译后的可执行文件,使用--run_example --help查看使用方法。 |
61| --genop | 可选 | 创建AI Core自定义算子初始目录。 |61| --genop | 可选 | 创建AI Core自定义算子初始目录。 |
62| --genop_aicpu | 可选 | 创建AI CPU自定义算子初始目录。 |62| --genop_aicpu | 可选 | 创建AI CPU自定义算子初始目录。 |
63| --experimental | 可选 | 编译experimental目录下的用户算子。 |63| --experimental | 可选 | 编译experimental目录下的用户算子。 |
@@ -88,7 +88,7 @@
88 88 
89### ops-ras包89### ops-ras包
90 90 
91-> **说明**:全量编译会构建仓库内全部算子,耗时较长,与机器配置、`-j` 并行度及是否联网下载第三方依赖有关;日常开发请优先使用单算子编译(`--ops=<算子名>`)。91+> **说明**:全量编译会构建仓库内全部算子,耗时较长,与机器配置、`-j`并行度及是否联网下载第三方依赖有关;日常开发请优先使用单算子编译(`--ops=<算子名>`)。
92 92 
931. **编译ops-ras包**931. **编译ops-ras包**
94 94 
@@ -32,7 +32,7 @@
32 32 
33## 软件包安装33## 软件包安装
34 34 
35-1. **安装社区版CANN toolkit包**35+1. **安装最新版CANN toolkit包**
36 36 
37 根据实际产品型号和环境架构,获取对应的`Ascend-cann-toolkit_${cann_version}_linux-${arch}.run`包。37 根据实际产品型号和环境架构,获取对应的`Ascend-cann-toolkit_${cann_version}_linux-${arch}.run`包。
38 - Atlas A2/A3系列产品:单击[下载链接](https://mirrors.huaweicloud.com/artifactory/cann-run/software)获取软件包。38 - Atlas A2/A3系列产品:单击[下载链接](https://mirrors.huaweicloud.com/artifactory/cann-run/software)获取软件包。
@@ -49,7 +49,7 @@
49 - \$\{arch\}:表示CPU架构,如aarch64、x86_64。49 - \$\{arch\}:表示CPU架构,如aarch64、x86_64。
50 - \$\{install\_path\}:表示指定安装路径,默认安装在`/usr/local/Ascend`目录。50 - \$\{install\_path\}:表示指定安装路径,默认安装在`/usr/local/Ascend`目录。
51 51 
52-2. **安装社区版CANN ops包(运行态依赖)**52+2. **安装最新版CANN ops包(运行态依赖)**
53 53 
54 运行算子时必须安装本包,若仅编译算子,可跳过本操作。54 运行算子时必须安装本包,若仅编译算子,可跳过本操作。
55 55 
@@ -215,7 +215,7 @@ int main()
215 bash run.sh215 bash run.sh
216 ```216 ```
217 217 
218- 默认在当前执行路径 `/build/bin`下生成可执行文件test\_aclnn\_add\_example,运行结果如下:218+ 默认在当前执行路径`/build/bin`下生成可执行文件test\_aclnn\_add\_example,运行结果如下:
219 219 
220 ```bash220 ```bash
221 mean result[2046] is 2.000000221 mean result[2046] is 2.000000
@@ -369,7 +369,7 @@ int main() {
369 bash run.sh369 bash run.sh
370 ```370 ```
371 371 
372- 默认在当前执行路径 `/build/bin`下生成可执行文件test\_geir\_add\_example,运行结果如下:372+ 默认在当前执行路径`/build/bin`下生成可执行文件test\_geir\_add\_example,运行结果如下:
373 373 
374 ```bash374 ```bash
375 INFO - [XIR]: Finalize ir graph session success375 INFO - [XIR]: Finalize ir graph session success
@@ -7,7 +7,7 @@
7 7 
8## 编译执行8## 编译执行
9 9 
10-基于社区版CANN包对算子源码修改时,可采用如下方式进行源码编译:10+基于最新版CANN包对算子源码修改时,可采用如下方式进行源码编译:
11 11 
12- [自定义算子包](#自定义算子包):选择部分算子编译生成的包称为自定义算子包,以**挂载**形式作用于CANN包,不改变原始包内容。生成的自定义算子包优先级高于原始CANN包。该包支持aclnn和图模式调用AI Core、AI CPU算子。12- [自定义算子包](#自定义算子包):选择部分算子编译生成的包称为自定义算子包,以**挂载**形式作用于CANN包,不改变原始包内容。生成的自定义算子包优先级高于原始CANN包。该包支持aclnn和图模式调用AI Core、AI CPU算子。
13 13 
@@ -19,7 +19,7 @@
19 19 
20> **确定性简介**:20> **确定性简介**:
21>21>
22-> - 配置说明:因CANN或NPU型号不同等原因,可能无法保证同一个算子多次运行结果一致。在相同条件下(平台、设备、版本号和其他随机性参数等),部分算子接口可通过`aclrtCtxSetSysParamOpt`(参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi))开启确定性算法,使多次运行结果一致。22+> - 配置说明:因CANN或NPU型号不同等原因,可能无法保证同一个算子多次运行结果一致。在相同条件下(平台、设备、版本号和其他随机性参数等),部分算子接口可通过`aclrtCtxSetSysParamOpt`(参见[《Runtime运行时API》](https://hiascend.com/document/redirect/CannCommunityCppApi))开启确定性算法,使多次运行结果一致。
23> - 性能说明:同一个算子采用确定性计算通常比非确定性慢,因此模型单次运行性能可能会下降。但在实验、调试调测等需要保证多次运行结果相同来定位问题的场景,确定性计算可以提升效率。23> - 性能说明:同一个算子采用确定性计算通常比非确定性慢,因此模型单次运行性能可能会下降。但在实验、调试调测等需要保证多次运行结果相同来定位问题的场景,确定性计算可以提升效率。
24> - 线程说明:同一线程中只能设置一次确定性状态,多次设置以最后一次有效设置为准。有效设置是指设置确定性状态后,真正执行了一次算子任务下发。如果仅设置,没有算子下发,只能是确定性变量开启但未下发给算子,因此不执行算子。24> - 线程说明:同一线程中只能设置一次确定性状态,多次设置以最后一次有效设置为准。有效设置是指设置确定性状态后,真正执行了一次算子任务下发。如果仅设置,没有算子下发,只能是确定性变量开启但未下发给算子,因此不执行算子。
25> 解决方案:暂不推荐一个线程多次设置确定性。该问题在二进制开启和关闭情况下均存在,在后续版本中会解决该问题。25> 解决方案:暂不推荐一个线程多次设置确定性。该问题在二进制开启和关闭情况下均存在,在后续版本中会解决该问题。
@@ -33,4 +33,4 @@
33| [aclnnObfuscationCalculateV2](../../reliability/obfuscation_calculate/docs/aclnnObfuscationCalculateV2.md) | 将张量x和配置参数(如param、cmd)发送至PMCC混淆引擎。引擎的CA模块调用TA模块,进行张量混淆处理,最终返回shape与x一致的混淆后的张量y。 |默认确定性实现| - |33| [aclnnObfuscationCalculateV2](../../reliability/obfuscation_calculate/docs/aclnnObfuscationCalculateV2.md) | 将张量x和配置参数(如param、cmd)发送至PMCC混淆引擎。引擎的CA模块调用TA模块,进行张量混淆处理,最终返回shape与x一致的混淆后的张量y。 |默认确定性实现| - |
34| [aclnnObfuscationSetup](../../reliability/obfuscation_setup/docs/aclnnObfuscationSetup.md) | 完成PMCC模型混淆引擎的资源初始化和释放。 |默认确定性实现| - |34| [aclnnObfuscationSetup](../../reliability/obfuscation_setup/docs/aclnnObfuscationSetup.md) | 完成PMCC模型混淆引擎的资源初始化和释放。 |默认确定性实现| - |
35| [aclnnObfuscationSetupV2](../../reliability/obfuscation_setup/docs/aclnnObfuscationSetupV2.md) | 完成PMCC模型混淆引擎的资源初始化和释放。 |默认确定性实现| - |35| [aclnnObfuscationSetupV2](../../reliability/obfuscation_setup/docs/aclnnObfuscationSetupV2.md) | 完成PMCC模型混淆引擎的资源初始化和释放。 |默认确定性实现| - |
36-| [aclnnCrypto](../../reliability/crypto/docs/aclnnCrypto.md) | 调用 aicpu 加解密算子,按输入参数执行。 |默认确定性实现| - |36+| [aclnnCrypto](../../reliability/crypto/docs/aclnnCrypto.md) | 调用aicpu加解密算子,按输入参数执行。 |默认确定性实现| - |
@@ -70,7 +70,7 @@ print("Verification successful!")
703. 在soc目录下新建一个`add.cpp`(建议使用算子名为文件名)。这个文件包含了开发一个AICORE算子所需要的全部模块。703. 在soc目录下新建一个`add.cpp`(建议使用算子名为文件名)。这个文件包含了开发一个AICORE算子所需要的全部模块。
71 - 算子Schema注册71 - 算子Schema注册
72 - 算子Meta Function实现 & 注册72 - 算子Meta Function实现 & 注册
73- - 算子Kernel实现 (AscendC)73+ - 算子Kernel实现(AscendC)
74 - 算子NPU调用实现 & 注册74 - 算子NPU调用实现 & 注册
75 75 
76 ```cpp76 ```cpp
@@ -130,7 +130,7 @@ print("Verification successful!")
130 130 
131 /**131 /**
132 * 实现算子调用接口132 * 实现算子调用接口
133- * 在这个接口中, 需要完成NPU Kernel的调用133+ * 在这个接口中,需要完成NPU Kernel的调用
134 * 1. 计算出输出的Tensor的个数/Shape/Dtype(可以调用Meta函数实现,也可以直接实现)134 * 1. 计算出输出的Tensor的个数/Shape/Dtype(可以调用Meta函数实现,也可以直接实现)
135 * 2. 计算Tiling:根据Shape得到如何分块计算135 * 2. 计算Tiling:根据Shape得到如何分块计算
136 * 3. 调用NPU Kernel136 * 3. 调用NPU Kernel
@@ -16,9 +16,9 @@
16 16 
17- 接口功能:分为读秘钥功能和加解密功能。读秘钥功能获取spdm派生的加解密秘钥并写入device侧tensor,加解密功能使用已读取的秘钥对device侧tensor做加密/解密。17- 接口功能:分为读秘钥功能和加解密功能。读秘钥功能获取spdm派生的加解密秘钥并写入device侧tensor,加解密功能使用已读取的秘钥对device侧tensor做加密/解密。
18 18 
19- 读秘钥:读密钥前,host 和 device 已经通过 spdm 派生了加解密秘钥,且调用者已经获取到要读取的秘钥的keyId。读秘钥时,通过 uds 从 KMS-proxy 按key_id, alg_type, key_type 获取秘钥, 并写入device侧的 aclTensor key 中。19+ 读秘钥:读密钥前,host和device已经通过spdm派生了加解密秘钥,且调用者已经获取到要读取的秘钥的keyId。读秘钥时,通过uds从KMS-proxy按key_id, alg_type, key_type获取秘钥,并写入device侧的aclTensor key中。
20 20 
21- 加解密:加解密时,采用标准 AES_CTR_128 和 AES_GCM_128 算法计算加解密。使用的秘钥为传入的 device侧 aclTensor key (已经由 读秘钥功能 写入)。使用的 iv 和 tag 可由 host 传到 device 侧。21+ 加解密:加解密时,采用标准AES_CTR_128和AES_GCM_128算法计算加解密。使用的秘钥为传入的device侧aclTensor key (已经由读秘钥功能写入)。使用的iv和tag可由host传到device侧。
22 22 
23## 函数原型23## 函数原型
24 24 
@@ -117,7 +117,7 @@ aclnnStatus aclnnCryptoAicpu(
117 <td>opConfig (aclTensor*)</td>117 <td>opConfig (aclTensor*)</td>
118 <td>输入</td>118 <td>输入</td>
119 <td>算子参数设置,结构为 {version, mode, alg_type, key_type, key_id, device_id}。</td>119 <td>算子参数设置,结构为 {version, mode, alg_type, key_type, key_id, device_id}。</td>
120- <td>不支持空Tenosr。version 表示算子版本,取值范围为[1,2], 1 表示支持A2/A3的版本, 2 表示支持A5的版本;mode 表示算子工作模式,取值范围为[0,2], 0 表示读取秘钥,1 表示加密模式,2 表示解密模式;alg_type 表示算法类型,取值范围为[1,2], 1 表示 AES_CTR_128 算法,2 表示 AES_GCM_128 算法;key_type 表示秘钥类型,取值范围为[1], 默认为 1,表示秘钥保存在 key 指向的张量内;key_id 表示秘钥id,取值范围为[0,UINT32_MAX], 从 0 开始,key_id 越大说明秘钥越新;device_id 表示设备id, 取值范围为[0,63], 从 0 开始</td>120+ <td>不支持空Tenosr。version表示算子版本,取值范围为[1,2], 1表示支持A2/A3的版本, 2表示支持A5的版本;mode表示算子工作模式,取值范围为[0,2], 0表示读取秘钥,1表示加密模式,2表示解密模式;alg_type表示算法类型,取值范围为[1,2], 1表示AES_CTR_128算法,2表示AES_GCM_128算法;key_type表示秘钥类型,取值范围为[1],默认为1,表示秘钥保存在key指向的张量内;key_id表示秘钥id,取值范围为[0,UINT32_MAX],从0开始,key_id越大说明秘钥越新;device_id表示设备id,取值范围为[0,63],从0开始</td>
121 <td>UINT32</td>121 <td>UINT32</td>
122 <td>ND</td>122 <td>ND</td>
123 <td>任意维度</td>123 <td>任意维度</td>
@@ -127,7 +127,7 @@ aclnnStatus aclnnCryptoAicpu(
127 <td>tag (aclTensor*)</td>127 <td>tag (aclTensor*)</td>
128 <td>输入/输出</td>128 <td>输入/输出</td>
129 <td>加解密使用的tag。</td>129 <td>加解密使用的tag。</td>
130- <td>支持空Tensor, 读密钥和aes-ctr-128加解密时可为空Tensor。</td>130+ <td>支持空Tensor,读密钥和aes-ctr-128加解密时可为空Tensor。</td>
131 <td>UINT8</td>131 <td>UINT8</td>
132 <td>ND</td>132 <td>ND</td>
133 <td>任意维度</td>133 <td>任意维度</td>
@@ -252,17 +252,17 @@ aclnnStatus aclnnCryptoAicpu(
252 252 
253## 约束说明253## 约束说明
254 254 
255-- 确定性计算: aclnnCrypto 默认确定性实现。255+- 确定性计算: aclnnCrypto默认确定性实现。
256 256 
257- 入参约束:257- 入参约束:
258- 1. opConfig.mode = 0 (读取秘钥) 时,inputText, outputText, iv, tag 可以为空(不为空但是类型和形状符合约束也不会报错)258+ 1. opConfig.mode = 0 (读取秘钥)时,inputText, outputText, iv, tag可以为空(不为空但是类型和形状符合约束也不会报错)
259- 2. key, opConfig, out 不能为空259+ 2. key, opConfig, out不能为空
260- 3. inputText 和 outputText 不为空时,形状和大小要相同(类型相同,维数相同,每一维的大小相同)260+ 3. inputText和outputText不为空时,形状和大小要相同(类型相同,维数相同,每一维的大小相同)
261 4. 不为空的入参类型必须符合表格里的类型约束261 4. 不为空的入参类型必须符合表格里的类型约束
262- 5. opConfig.algType = 1 (AES-CTR-128算法) 时,tag 可以为空(不为空也不会使用该参数)262+ 5. opConfig.algType = 1 (AES-CTR-128算法)时,tag可以为空(不为空也不会使用该参数)
263- 6. opConfig.algType = 2 (AES-GCM-128算法) 时,tag 不能为空263+ 6. opConfig.algType = 2 (AES-GCM-128算法)时,tag不能为空
264- 7. opConfig 的参数必须符合定义,version 取值 1,2,mode 取值 0,1,2, algType 取值 1,2, keyType 取值 1,keyId 取值 [0, UINT32_MAX], deviceId 取值 [0,63]264+ 7. opConfig的参数必须符合定义,version取值1,2,mode取值0,1,2, algType取值1,2, keyType取值1,keyId取值 [0, UINT32_MAX], deviceId取值 [0,63]
265- 8. 读秘钥时必须传入正确的 keyId (一个 keyId 对应一个spdm 已派生的加解密秘钥),否则会报错265+ 8. 读秘钥时必须传入正确的keyId (一个keyId对应一个spdm已派生的加解密秘钥),否则会报错
266 266 
267## 调用示例267## 调用示例
268 268 
@@ -455,7 +455,7 @@ int aes_128_gcm_decrypt(unsigned char *key, unsigned char *iv,
455 }455 }
456 // 释放456 // 释放
457 EVP_CIPHER_CTX_free(ctx);457 EVP_CIPHER_CTX_free(ctx);
458- // GCM 密文长度 = 明文长度458+ // GCM密文长度 = 明文长度
459 if (plaintext_len != ciphertext_len) {459 if (plaintext_len != ciphertext_len) {
460 return -4;460 return -4;
461 }461 }
@@ -569,14 +569,14 @@ int main(int argc, char *argv[]) {
569 auto ret = Init(deviceId, &stream);569 auto ret = Init(deviceId, &stream);
570 CHECK_RET(ret == 0, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);570 CHECK_RET(ret == 0, LOG_PRINT("Init acl failed. ERROR: %d\n", ret); return ret);
571 printf("start\n");571 printf("start\n");
572- // ===================== 2. 构造所有输入输出 Tensor =====================572+ // ===================== 2. 构造所有输入输出Tensor =====================
573- // 你可以根据算子实际需求修改 shape 和数据573+ // 你可以根据算子实际需求修改shape和数据
574- std::vector<int64_t> shape_scalar = {1}; // 标量用 shape [1]574+ std::vector<int64_t> shape_scalar = {1}; // 标量用shape [1]
575 std::vector<int64_t> key_shape_data = {16}; // key shape575 std::vector<int64_t> key_shape_data = {16}; // key shape
576 std::vector<int64_t> input_shape_data = {msg_len};576 std::vector<int64_t> input_shape_data = {msg_len};
577 std::vector<int64_t> iv_shape_data = {32};577 std::vector<int64_t> iv_shape_data = {32};
578 std::vector<int64_t> shape_op_cfg = {6};578 std::vector<int64_t> shape_op_cfg = {6};
579- std::vector<int64_t> shape_output = {msg_len}; // 输出 shape579+ std::vector<int64_t> shape_output = {msg_len}; // 输出shape
580 std::vector<int64_t> shape_y = {1};580 std::vector<int64_t> shape_y = {1};
581 std::vector<int64_t> shape_tag = {GCM_TAG_SIZE};581 std::vector<int64_t> shape_tag = {GCM_TAG_SIZE};
582 // 设备地址582 // 设备地址
@@ -589,7 +589,7 @@ int main(int argc, char *argv[]) {
589 void* yDeviceAddr = nullptr;589 void* yDeviceAddr = nullptr;
590 590 
591 591 
592- // Tensor 指针592+ // Tensor指针
593 aclTensor* key = nullptr;593 aclTensor* key = nullptr;
594 aclTensor* input = nullptr;594 aclTensor* input = nullptr;
595 aclTensor* iv = nullptr;595 aclTensor* iv = nullptr;
@@ -598,12 +598,12 @@ int main(int argc, char *argv[]) {
598 aclTensor* output = nullptr;598 aclTensor* output = nullptr;
599 aclTensor* y = nullptr;599 aclTensor* y = nullptr;
600 600 
601- // 构造测试数据(全部使用 Tensor)601+ // 构造测试数据(全部使用Tensor)
602- std::vector<uint8_t> keyHostData(16, 0x11); // key 数据602+ std::vector<uint8_t> keyHostData(16, 0x11); // key数据
603 std::vector<uint8_t> inputHostData(msg_len, 0x00); // 输入数据603 std::vector<uint8_t> inputHostData(msg_len, 0x00); // 输入数据
604 604 
605 std::vector<uint8_t> ivHostData(16, 0x1f); // iv605 std::vector<uint8_t> ivHostData(16, 0x1f); // iv
606- std::vector<uint32_t> opConfigHostData = {1, static_cast<uint32_t>(mode), static_cast<uint32_t>(alg_type), 1, 34, 0}; // 配置 version, mode, alg_type, key_type, keyId, device_id606+ std::vector<uint32_t> opConfigHostData = {1, static_cast<uint32_t>(mode), static_cast<uint32_t>(alg_type), 1, 34, 0}; // 配置version, mode, alg_type, key_type, keyId, device_id
607 std::vector<uint8_t> outputHostData(msg_len, 0); // 输出607 std::vector<uint8_t> outputHostData(msg_len, 0); // 输出
608 std::vector<uint32_t> yHostData = {0}; // 输出608 std::vector<uint32_t> yHostData = {0}; // 输出
609 609 
@@ -615,7 +615,7 @@ int main(int argc, char *argv[]) {
615 HostCryptoGcm(reinterpret_cast<unsigned char*>(keyHostData.data()), reinterpret_cast<unsigned char*>(ivHostData.data()), msg_len, reinterpret_cast<unsigned char*>(inputHostData.data()), reinterpret_cast<unsigned char*>(outExpectedData.data()), reinterpret_cast<unsigned char*>(tagHostData.data()), mode);615 HostCryptoGcm(reinterpret_cast<unsigned char*>(keyHostData.data()), reinterpret_cast<unsigned char*>(ivHostData.data()), msg_len, reinterpret_cast<unsigned char*>(inputHostData.data()), reinterpret_cast<unsigned char*>(outExpectedData.data()), reinterpret_cast<unsigned char*>(tagHostData.data()), mode);
616 }616 }
617 617 
618- // ===================== 创建所有 aclTensor =====================618+ // ===================== 创建所有aclTensor =====================
619 CreateAclTensor(keyHostData, key_shape_data, &keyDeviceAddr, ACL_UINT8, &key);619 CreateAclTensor(keyHostData, key_shape_data, &keyDeviceAddr, ACL_UINT8, &key);
620 620 
621 CreateAclTensor(inputHostData, input_shape_data, &inputDeviceAddr, ACL_UINT8, &input);621 CreateAclTensor(inputHostData, input_shape_data, &inputDeviceAddr, ACL_UINT8, &input);
@@ -627,7 +627,7 @@ int main(int argc, char *argv[]) {
627 627 
628 CreateAclTensor(tagHostData, shape_tag, &tagRefOptionalDeviceAddr, ACL_UINT8, &tagRefOptional);628 CreateAclTensor(tagHostData, shape_tag, &tagRefOptionalDeviceAddr, ACL_UINT8, &tagRefOptional);
629 printf("tensor created\n");629 printf("tensor created\n");
630- // ===================== 3. 调用自定义算子 aclnnCrypto =====================630+ // ===================== 3. 调用自定义算子aclnnCrypto =====================
631 uint64_t workspaceSize = 0;631 uint64_t workspaceSize = 0;
632 aclOpExecutor* executor = nullptr;632 aclOpExecutor* executor = nullptr;
633 633 
@@ -645,7 +645,7 @@ int main(int argc, char *argv[]) {
645 );645 );
646 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnCryptoGetWorkspaceSize failed retCode: %d\n", ret); return ret);646 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclnnCryptoGetWorkspaceSize failed retCode: %d\n", ret); return ret);
647 printf("getworkspaceSIze %d\n", workspaceSize);647 printf("getworkspaceSIze %d\n", workspaceSize);
648- // 申请 workspace648+ // 申请workspace
649 void* workspaceAddr = nullptr;649 void* workspaceAddr = nullptr;
650 if (workspaceSize > 0) {650 if (workspaceSize > 0) {
651 ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);651 ret = aclrtMalloc(&workspaceAddr, workspaceSize, ACL_MEM_MALLOC_HUGE_FIRST);
@@ -355,7 +355,7 @@ int main() {
355 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);355 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);
356 }356 }
357 357 
358- // 6. 构造输入与输出, 需要根据API的接口定义构造358+ // 6. 构造输入与输出,需要根据API的接口定义构造
359 std::vector<int64_t> xShape = {2, 4};359 std::vector<int64_t> xShape = {2, 4};
360 std::vector<int64_t> yShape = {2, 4};360 std::vector<int64_t> yShape = {2, 4};
361 void *xDeviceAddr = nullptr;361 void *xDeviceAddr = nullptr;
@@ -377,7 +377,7 @@ int main() {
377 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);377 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);
378 CHECK_RET(ret == ACL_SUCCESS, return ret);378 CHECK_RET(ret == ACL_SUCCESS, return ret);
379 379 
380- // 7. 调用CANN算子库API, 需要修改为具体的API380+ // 7. 调用CANN算子库API,需要修改为具体的API
381 uint64_t workspaceSize2 = 0;381 uint64_t workspaceSize2 = 0;
382 aclOpExecutor *executor2;382 aclOpExecutor *executor2;
383 383 
@@ -398,7 +398,7 @@ int main() {
398 ret = aclrtSynchronizeStream(stream);398 ret = aclrtSynchronizeStream(stream);
399 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);399 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);
400 400 
401- // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧, 需要根据具体API的接口定义修改401+ // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧,需要根据具体API的接口定义修改
402 // y402 // y
403 auto ySize = GetShapeSize(yShape);403 auto ySize = GetShapeSize(yShape);
404 std::vector<float> yData(ySize, 0);404 std::vector<float> yData(ySize, 0);
@@ -441,12 +441,12 @@ int main() {
441 ret = aclrtSynchronizeStream(stream);441 ret = aclrtSynchronizeStream(stream);
442 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);442 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
443 443 
444- // 13. 释放ObfuscationCalculate接口涉及的aclTensor和aclScalar, 需要根据具体API的接口定义修改444+ // 13. 释放ObfuscationCalculate接口涉及的aclTensor和aclScalar,需要根据具体API的接口定义修改
445 aclDestroyTensor(x);445 aclDestroyTensor(x);
446 aclDestroyTensor(y);446 aclDestroyTensor(y);
447 aclDestroyTensor(fd);447 aclDestroyTensor(fd);
448 448 
449- // 14. 释放ObfuscationCalculate接口涉及的device资源, 需要根据具体API的接口定义修改449+ // 14. 释放ObfuscationCalculate接口涉及的device资源,需要根据具体API的接口定义修改
450 aclrtFree(xDeviceAddr);450 aclrtFree(xDeviceAddr);
451 aclrtFree(yDeviceAddr);451 aclrtFree(yDeviceAddr);
452 aclrtFree(fdDeviceAddr);452 aclrtFree(fdDeviceAddr);
@@ -367,7 +367,7 @@ int main() {
367 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);367 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);
368 }368 }
369 369 
370- // 6. 构造输入与输出, 需要根据API的接口定义构造370+ // 6. 构造输入与输出,需要根据API的接口定义构造
371 std::vector<int64_t> xShape = {2, 4};371 std::vector<int64_t> xShape = {2, 4};
372 std::vector<int64_t> yShape = {2, 4};372 std::vector<int64_t> yShape = {2, 4};
373 void *xDeviceAddr = nullptr;373 void *xDeviceAddr = nullptr;
@@ -389,7 +389,7 @@ int main() {
389 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);389 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);
390 CHECK_RET(ret == ACL_SUCCESS, return ret);390 CHECK_RET(ret == ACL_SUCCESS, return ret);
391 391 
392- // 7. 调用CANN算子库API, 需要修改为具体的API392+ // 7. 调用CANN算子库API,需要修改为具体的API
393 uint64_t workspaceSize2 = 0;393 uint64_t workspaceSize2 = 0;
394 aclOpExecutor *executor2;394 aclOpExecutor *executor2;
395 395 
@@ -410,7 +410,7 @@ int main() {
410 ret = aclrtSynchronizeStream(stream);410 ret = aclrtSynchronizeStream(stream);
411 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);411 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);
412 412 
413- // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧, 需要根据具体API的接口定义修改413+ // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧,需要根据具体API的接口定义修改
414 // y414 // y
415 auto ySize = GetShapeSize(yShape);415 auto ySize = GetShapeSize(yShape);
416 std::vector<float> yData(ySize, 0);416 std::vector<float> yData(ySize, 0);
@@ -453,12 +453,12 @@ int main() {
453 ret = aclrtSynchronizeStream(stream);453 ret = aclrtSynchronizeStream(stream);
454 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);454 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
455 455 
456- // 13. 释放ObfuscationCalculateV2接口涉及的aclTensor和aclScalar, 需要根据具体API的接口定义修改456+ // 13. 释放ObfuscationCalculateV2接口涉及的aclTensor和aclScalar,需要根据具体API的接口定义修改
457 aclDestroyTensor(x);457 aclDestroyTensor(x);
458 aclDestroyTensor(y);458 aclDestroyTensor(y);
459 aclDestroyTensor(fd);459 aclDestroyTensor(fd);
460 460 
461- // 14. 释放ObfuscationCalculateV2接口涉及的device资源, 需要根据具体API的接口定义修改461+ // 14. 释放ObfuscationCalculateV2接口涉及的device资源,需要根据具体API的接口定义修改
462 aclrtFree(xDeviceAddr);462 aclrtFree(xDeviceAddr);
463 aclrtFree(yDeviceAddr);463 aclrtFree(yDeviceAddr);
464 aclrtFree(fdDeviceAddr);464 aclrtFree(fdDeviceAddr);
@@ -402,7 +402,7 @@ int main() {
402 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);402 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);
403 }403 }
404 404 
405- // 6. 构造输入与输出, 需要根据API的接口定义构造405+ // 6. 构造输入与输出,需要根据API的接口定义构造
406 std::vector<int64_t> xShape = {2, 4};406 std::vector<int64_t> xShape = {2, 4};
407 std::vector<int64_t> yShape = {2, 4};407 std::vector<int64_t> yShape = {2, 4};
408 void *xDeviceAddr = nullptr;408 void *xDeviceAddr = nullptr;
@@ -424,7 +424,7 @@ int main() {
424 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);424 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);
425 CHECK_RET(ret == ACL_SUCCESS, return ret);425 CHECK_RET(ret == ACL_SUCCESS, return ret);
426 426 
427- // 7. 调用CANN算子库API, 需要修改为具体的API427+ // 7. 调用CANN算子库API,需要修改为具体的API
428 uint64_t workspaceSize2 = 0;428 uint64_t workspaceSize2 = 0;
429 aclOpExecutor *executor2;429 aclOpExecutor *executor2;
430 430 
@@ -445,7 +445,7 @@ int main() {
445 ret = aclrtSynchronizeStream(stream);445 ret = aclrtSynchronizeStream(stream);
446 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);446 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);
447 447 
448- // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧, 需要根据具体API的接口定义修改448+ // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧,需要根据具体API的接口定义修改
449 // y449 // y
450 auto ySize = GetShapeSize(yShape);450 auto ySize = GetShapeSize(yShape);
451 std::vector<float> yData(ySize, 0);451 std::vector<float> yData(ySize, 0);
@@ -488,12 +488,12 @@ int main() {
488 ret = aclrtSynchronizeStream(stream);488 ret = aclrtSynchronizeStream(stream);
489 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);489 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
490 490 
491- // 13. 释放ObfuscationCalculate接口涉及的aclTensor和aclScalar, 需要根据具体API的接口定义修改491+ // 13. 释放ObfuscationCalculate接口涉及的aclTensor和aclScalar,需要根据具体API的接口定义修改
492 aclDestroyTensor(x);492 aclDestroyTensor(x);
493 aclDestroyTensor(y);493 aclDestroyTensor(y);
494 aclDestroyTensor(fd);494 aclDestroyTensor(fd);
495 495 
496- // 14. 释放ObfuscationCalculate接口涉及的device资源, 需要根据具体API的接口定义修改496+ // 14. 释放ObfuscationCalculate接口涉及的device资源,需要根据具体API的接口定义修改
497 aclrtFree(xDeviceAddr);497 aclrtFree(xDeviceAddr);
498 aclrtFree(yDeviceAddr);498 aclrtFree(yDeviceAddr);
499 aclrtFree(fdDeviceAddr);499 aclrtFree(fdDeviceAddr);
@@ -414,7 +414,7 @@ int main() {
414 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);414 LOG_PRINT("fdData[%ld] is : %d\n", i, fdData[i]);
415 }415 }
416 416 
417- // 6. 构造输入与输出, 需要根据API的接口定义构造417+ // 6. 构造输入与输出,需要根据API的接口定义构造
418 std::vector<int64_t> xShape = {2, 4};418 std::vector<int64_t> xShape = {2, 4};
419 std::vector<int64_t> yShape = {2, 4};419 std::vector<int64_t> yShape = {2, 4};
420 void *xDeviceAddr = nullptr;420 void *xDeviceAddr = nullptr;
@@ -436,7 +436,7 @@ int main() {
436 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);436 ret = CreateAclTensor(yHostData, yShape, &yDeviceAddr, aclDataType::ACL_FLOAT, &y);
437 CHECK_RET(ret == ACL_SUCCESS, return ret);437 CHECK_RET(ret == ACL_SUCCESS, return ret);
438 438 
439- // 7. 调用CANN算子库API, 需要修改为具体的API439+ // 7. 调用CANN算子库API,需要修改为具体的API
440 uint64_t workspaceSize2 = 0;440 uint64_t workspaceSize2 = 0;
441 aclOpExecutor *executor2;441 aclOpExecutor *executor2;
442 442 
@@ -457,7 +457,7 @@ int main() {
457 ret = aclrtSynchronizeStream(stream);457 ret = aclrtSynchronizeStream(stream);
458 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);458 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR : %d\n", ret); return ret);
459 459 
460- // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧, 需要根据具体API的接口定义修改460+ // 9. 获取输出的值,y表示经过混淆处理的数据,将device侧的内存上的结果拷贝至host侧,需要根据具体API的接口定义修改
461 // y461 // y
462 auto ySize = GetShapeSize(yShape);462 auto ySize = GetShapeSize(yShape);
463 std::vector<float> yData(ySize, 0);463 std::vector<float> yData(ySize, 0);
@@ -500,12 +500,12 @@ int main() {
500 ret = aclrtSynchronizeStream(stream);500 ret = aclrtSynchronizeStream(stream);
501 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);501 CHECK_RET(ret == ACL_SUCCESS, LOG_PRINT("aclrtSynchronizeStream failed. ERROR: %d\n", ret); return ret);
502 502 
503- // 13. 释放ObfuscationCalculateV2接口涉及的aclTensor和aclScalar, 需要根据具体API的接口定义修改503+ // 13. 释放ObfuscationCalculateV2接口涉及的aclTensor和aclScalar,需要根据具体API的接口定义修改
504 aclDestroyTensor(x);504 aclDestroyTensor(x);
505 aclDestroyTensor(y);505 aclDestroyTensor(y);
506 aclDestroyTensor(fd);506 aclDestroyTensor(fd);
507 507 
508- // 14. 释放ObfuscationCalculateV2接口涉及的device资源, 需要根据具体API的接口定义修改508+ // 14. 释放ObfuscationCalculateV2接口涉及的device资源,需要根据具体API的接口定义修改
509 aclrtFree(xDeviceAddr);509 aclrtFree(xDeviceAddr);
510 aclrtFree(yDeviceAddr);510 aclrtFree(yDeviceAddr);
511 aclrtFree(fdDeviceAddr);511 aclrtFree(fdDeviceAddr);