已合并
修改仓上格式语法问题 #75
caiwenwen创建于 7月25日
修改仓上格式语法问题 #75
已合并
共 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 | - 帮助解决他人Issue | 57 | - 帮助解决他人Issue |
| 58 | 58 | ||
| @@ -28,7 +28,7 @@ ops-ras是[CANN](https://hiascend.com/software/cann)(Compute Architecture for | |||
| 28 | git clone -b 9.0.0 https://gitcode.com/cann/ops-ras.git | 28 | git 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: #123 | 47 | + 关联的Issue: #123 |
| 48 | ``` | 48 | ``` |
| 49 | 49 | ||
| 50 | 4. **发起Pull Request** | 50 | 4. **发起Pull Request** |
| @@ -6,7 +6,7 @@ | |||
| 6 | 6 | ||
| 7 | 1. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。 | 7 | 1. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。 |
| 8 | 8 | ||
| 9 | - > **说明**:CANNLab或Docker环境默认提供最新商发版CANN包;如需体验master分支最新能力,可手动搭建环境。 | 9 | + > **说明**:CANNLab或Docker环境默认提供最新最新版CANN包;如需体验master分支最新能力,可手动搭建环境。 |
| 10 | 10 | ||
| 11 | 2. **[编译运行](#一编译运行)**:编译自定义算子包并安装,实现快速调用算子。 | 11 | 2. **[编译运行](#一编译运行)**:编译自定义算子包并安装,实现快速调用算子。 |
| 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 | ```bash | 29 | ```bash |
| 30 | cd /mnt/workspace/gitCode/${gitCode_id}/ops-ras | 30 | 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 -j16 | 144 | 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 | ||
| 149 | 2. **重新安装**: | 149 | 2. **重新安装**: |
| 150 | 150 | ||
| @@ -242,7 +242,7 @@ int main() { | |||
| 242 | // ... 初始化代码 ... | 242 | // ... 初始化代码 ... |
| 243 | 243 | ||
| 244 | // === ① 修改selfX的输入 === | 244 | // === ① 修改selfX的输入 === |
| 245 | - // 修改前:shape = {32, 4, 4, 4}, 数值全为1 | 245 | + // 修改前: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 *8 | 248 | 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 | ## 示例2 | 23 | ## 示例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 | |||
| 51 | cannsim record ./test_aclnn_add_example -s Ascend950 --gen-report | 51 | cannsim 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 | |||
| 101 | 2. 执行仿真命令,可参考以下使用示例 | 101 | 2. 执行仿真命令,可参考以下使用示例 |
| 102 | 102 | ||
| 103 | ```bash | 103 | ```bash |
| 104 | - 方式一: 启用仿真,并将输出保存至 ./output 目录,/path/to/app 为算子程序 | 104 | + 方式一:启用仿真,并将输出保存至 ./output目录,/path/to/app为算子程序 |
| 105 | $ cannsim record /path/to/app -o ./output -s Ascend950 | 105 | $ 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] | |||
| 222 | cannsim --help | 222 | cannsim --help |
| 223 | ``` | 223 | ``` |
| 224 | 224 | ||
| 225 | -查询工具record 子命令的帮助信息: | 225 | +查询工具record子命令的帮助信息: |
| 226 | 226 | ||
| 227 | ```bash | 227 | ```bash |
| 228 | cannsim record --help | 228 | cannsim 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 | ```bash | 30 | ```bash |
| 31 | printf(aclGetRecentErrMsg()); | 31 | printf(aclGetRecentErrMsg()); |
| @@ -105,7 +105,7 @@ Tiling主要切分逻辑。 | |||
| 105 | 105 | ||
| 106 | ```CPP | 106 | ```CPP |
| 107 | // ${op_name}_tiling.cpp | 107 | // ${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即可。 |
| 109 | static ge::graphStatus TilingParse(gert::TilingParseContext* context) | 109 | static 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 | end | 221 | 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达到流水并行,为2 | 290 | // 输入队列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达到流水并行,为2 | 292 | + // 输出队列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 tensor | 146 | // 从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 | ||
| 93 | 1. **编译ops-ras包** | 93 | 1. **编译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.sh | 215 | bash run.sh |
| 216 | ``` | 216 | ``` |
| 217 | 217 | ||
| 218 | - 默认在当前执行路径 `/build/bin`下生成可执行文件test\_aclnn\_add\_example,运行结果如下: | 218 | + 默认在当前执行路径`/build/bin`下生成可执行文件test\_aclnn\_add\_example,运行结果如下: |
| 219 | 219 | ||
| 220 | ```bash | 220 | ```bash |
| 221 | mean result[2046] is 2.000000 | 221 | mean result[2046] is 2.000000 |
| @@ -369,7 +369,7 @@ int main() { | |||
| 369 | bash run.sh | 369 | bash run.sh |
| 370 | ``` | 370 | ``` |
| 371 | 371 | ||
| 372 | - 默认在当前执行路径 `/build/bin`下生成可执行文件test\_geir\_add\_example,运行结果如下: | 372 | + 默认在当前执行路径`/build/bin`下生成可执行文件test\_geir\_add\_example,运行结果如下: |
| 373 | 373 | ||
| 374 | ```bash | 374 | ```bash |
| 375 | INFO - [XIR]: Finalize ir graph session success | 375 | 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!") | |||
| 70 | 3. 在soc目录下新建一个`add.cpp`(建议使用算子名为文件名)。这个文件包含了开发一个AICORE算子所需要的全部模块。 | 70 | 3. 在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 | ```cpp | 76 | ```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 Kernel | 136 | * 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 shape | 575 | 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}; // 输出 shape | 579 | + 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); // iv | 605 | 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_id | 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_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 | - // 申请 workspace | 648 | + // 申请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, 需要修改为具体的API | 380 | + // 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 | // y | 402 | // 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, 需要修改为具体的API | 392 | + // 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 | // y | 414 | // 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, 需要修改为具体的API | 427 | + // 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 | // y | 449 | // 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, 需要修改为具体的API | 439 | + // 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 | // y | 461 | // 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); |