Merged
docs: add comprehensive project documentation and quickstart guide #63
LiuZongguAdd on Jul 7
docs: add comprehensive project documentation and quickstart guide #63
Merged
Merged fromDeleted :docs/readmeintocann/ops-rasmaster
Total: 22 files changed+1599-258
| @@ -1,2 +1,51 @@ | |||
| 1 | # ops-ras | 1 | # ops-ras |
| 2 | 2 | ||
| 3 | +## 🔥Latest News | ||
| 4 | + | ||
| 5 | +- [2026/07] ops-ras项目首次上线。 | ||
| 6 | + | ||
| 7 | +## 🚀概述 | ||
| 8 | + | ||
| 9 | +ops-ras是[CANN](https://hiascend.com/software/cann)(Compute Architecture for Neural Networks)算子库中的安全和维测类算子库(Reliability, Availability and Serviceability),提供可靠性、可用性和可维护性等能力,包含安全、加密以及维测相关算子,"ras"即来源于这三项核心特性的首字母缩写。算子库架构图如下: | ||
| 10 | + | ||
| 11 | +<img src="docs/zh/figures/architecture.png" alt="架构图" width="700px" height="320px"> | ||
| 12 | + | ||
| 13 | +## 📌版本配套 | ||
| 14 | + | ||
| 15 | +本项目源码会跟随CANN软件版本发布,关于CANN软件版本与本项目标签的对应关系请参阅[release仓库](https://gitcode.com/cann/release-management)中的相应版本说明。 | ||
| 16 | +请注意,为确保您的源码定制开发顺利进行,请选择配套的CANN版本与Gitcode标签源码,使用master分支可能存在版本不匹配的风险。 | ||
| 17 | + | ||
| 18 | +## 🛠️环境准备 | ||
| 19 | + | ||
| 20 | +[环境部署](docs/zh/install/quick_install.md)是体验本项目能力的前提,请先完成NPU驱动、CANN包安装等,确保环境正常。 | ||
| 21 | + | ||
| 22 | +## ⬇️源码下载 | ||
| 23 | + | ||
| 24 | +环境准备好后,下载与CANN版本配套的分支源码,通用命令如下,\$\{tag\_version\}替换为分支标签名。以9.0.0分支源码下载为例: | ||
| 25 | + | ||
| 26 | +```bash | ||
| 27 | +# 通用命令:git clone -b ${tag_version} https://gitcode.com/cann/ops-ras.git | ||
| 28 | +git clone -b 9.0.0 https://gitcode.com/cann/ops-ras.git | ||
| 29 | +``` | ||
| 30 | + | ||
| 31 | +> 说明:若环境中已存在配套分支源码,**可跳过本步骤**,例如CANNLab默认已提供最新商发版CANN对应的源码。 | ||
| 32 | + | ||
| 33 | +## 📖学习教程 | ||
| 34 | + | ||
| 35 | +- [快速入门](docs/QUICKSTART.md):从零开始快速体验项目核心基础能力,涵盖源码编译、算子调用、开发与调试等操作。 | ||
| 36 | +- [进阶教程](docs/README.md):如需深入了解项目编译部署、算子调用、开发、调试调优等能力,请查阅文档中心获取详细指引。 | ||
| 37 | + | ||
| 38 | +## 💬相关信息 | ||
| 39 | + | ||
| 40 | +- [目录结构](docs/zh/install/dir_structure.md) | ||
| 41 | +- [贡献指南](CONTRIBUTING.md) | ||
| 42 | +- [安全声明](SECURITY.md) | ||
| 43 | +- [许可证](LICENSE) | ||
| 44 | +- [所属SIG](https://gitcode.com/cann/community/tree/master/CANN/sigs/ops-basic) | ||
| 45 | + | ||
| 46 | +----- | ||
| 47 | +PS:本项目功能和文档正在持续更新和完善中,欢迎您关注最新版本。 | ||
| 48 | + | ||
| 49 | +- **问题反馈**:通过GitCode[【Issues】](https://gitcode.com/cann/ops-ras/issues)提交问题。 | ||
| 50 | +- **社区互动**:通过GitCode[【讨论】](https://gitcode.com/cann/ops-ras/discussions)参与交流。 | ||
| 51 | +- **技术专栏**:通过GitCode[【Wiki】](https://gitcode.com/cann/ops-ras/wiki)获取技术文章,如系列化教程、优秀实践等。 | ||
| @@ -0,0 +1,102 @@ | |||
| 1 | +# 文档贡献指南 | ||
| 2 | + | ||
| 3 | +欢迎您对本项目文档做出贡献,优质的文档对于项目成功至关重要。本指南将帮助您高效地提交符合规范的文档。 | ||
| 4 | + | ||
| 5 | +## 贡献范围 | ||
| 6 | + | ||
| 7 | +我们欢迎任何能提升文档质量的贡献,包括但不限于: | ||
| 8 | + | ||
| 9 | +- 纠错与改进:修复错别字、语法错误、错误的代码示例、过时的信息或失效的链接。 | ||
| 10 | + | ||
| 11 | +- 澄清与优化:让描述更清晰易懂,优化语句结构,补充背景知识。 | ||
| 12 | + | ||
| 13 | +- 内容补充:为现有功能添加使用示例、API文档、常见问题解答(FAQ)、最佳实践或警告说明等。 | ||
| 14 | + | ||
| 15 | +- 新内容创作:为新增功能撰写全新的章节或教程,比如算子README、API介绍文档等,如有问题建议先创建Issue讨论。 | ||
| 16 | + | ||
| 17 | +- 本地化翻译:帮助我们翻译或校对其他语言的文档。 | ||
| 18 | + | ||
| 19 | +- 样式与导航:改进文档网站的布局、可读性和导航结构。 | ||
| 20 | + | ||
| 21 | +## 贡献流程 | ||
| 22 | + | ||
| 23 | +1. **准备工作** | ||
| 24 | + | ||
| 25 | + - 确定任务:如有文档问题可新建Issues,建议标签类别`[Documentation|文档反馈]`,并提供详细描述。基于已有Issues列表,确定待解决的文档issue。 | ||
| 26 | + - 认领任务:在对应的Issue下评论`/assign @yourself`,表明您将处理它,避免重复劳动。 | ||
| 27 | + | ||
| 28 | +2. **文档修改** | ||
| 29 | + | ||
| 30 | + - 选择分支:请从master或其他Tag分支下载源码到本地。 | ||
| 31 | + - 遵循格式: | ||
| 32 | + - 本项目推荐使用**Markdown格式**。 | ||
| 33 | + - 遵循项目既有的写作风格。 | ||
| 34 | + - 图片等静态资源放入对应目录,例如图片一般在docs目录下`figures`文件夹,特殊情况可自行调整。 | ||
| 35 | + - 谨慎增删:修改内容时,请尽量保持原有的行宽和换行约定。 | ||
| 36 | + | ||
| 37 | +3. **提交更改** | ||
| 38 | + | ||
| 39 | + - 原子化提交:每个提交应专注于一个独立的修改。例如,"修复xx指南的拼写错误"和"更新API参考的示例代码"应分两次提交。 | ||
| 40 | + | ||
| 41 | + - 撰写清晰的提交信息: | ||
| 42 | + | ||
| 43 | + ```text | ||
| 44 | + 简短说明(不超过50字符) | ||
| 45 | + | ||
| 46 | + 如有必要,在此处进行更详细描述。说明修改的原因和内容,而不是具体改了什么(代码本身会展示)。 | ||
| 47 | + 关联的 Issue: #123 | ||
| 48 | + ``` | ||
| 49 | + | ||
| 50 | +4. **发起Pull Request** | ||
| 51 | + | ||
| 52 | + - 目标分支:请将PR合并到项目的目标分支。 | ||
| 53 | + - 标题与描述: | ||
| 54 | + - PR标题:应清晰概括修改,例如:`[Docs] 修复快速入门中的配置示例`。 | ||
| 55 | + - PR描述:详细说明您的更改内容、动机,并关联对应Issue(使用Closes #123或Fixes #456)。 | ||
| 56 | + - 预览检查:请提前检查本地或在线浏览的文档效果,确保渲染符合预期。 | ||
| 57 | + - 等待审查:维护者会进行审查,可能会提出修改建议。请及时跟进讨论。 | ||
| 58 | + | ||
| 59 | +## 写作规范 | ||
| 60 | + | ||
| 61 | +开发者进行项目文档写作前,请务必先阅读如下规范,如有问题欢迎您随时提出建议! | ||
| 62 | + | ||
| 63 | +- 前提条件:请先学习CANN组织提供的统一写作规范,具体参见[CANN文档写作规范](https://gitcode.com/cann/community/blob/master/contributor/docs/document_writing_specs.md)。 | ||
| 64 | + | ||
| 65 | + - 文档内容要求:介绍项目里必选和可选文档交付件。 | ||
| 66 | + - 目录结构规范:介绍目录划分的原则,例如中、英文管理等。 | ||
| 67 | + - 内容元素规范:介绍不同写作元素的规则,例如文件命名、标题、字体、图片、代码块、链接等。 | ||
| 68 | + | ||
| 69 | +- 注意事项: | ||
| 70 | + | ||
| 71 | + 除了上述写作规则,还需注意以下事项: | ||
| 72 | + | ||
| 73 | + - 语气:使用友好、专业且中立的语气。面向新手,避免不必要的行话。 | ||
| 74 | + - 术语:保持术语一致性(如统一使用"点击"而非"单击")。请参考项目术语表(如有)。 | ||
| 75 | + - 代码示例: | ||
| 76 | + - 确保所有代码示例可运行并经过测试。 | ||
| 77 | + - 提供足够的上下文和解释。 | ||
| 78 | + - 注明代码运行所需的环境或前提条件。 | ||
| 79 | + - 标点与格式: | ||
| 80 | + - 中英文混排时,使用全角标点,标点符号必须符合中/英文语境。 | ||
| 81 | + - 标题使用合适的层级(#、 ##、 ###)。 | ||
| 82 | + - 使用列表和表格来组织复杂信息。 | ||
| 83 | + - 链接:使用描述性链接文本,避免"点击这里",确保链接资源真实可靠。 | ||
| 84 | + - 图片: | ||
| 85 | + - 常用格式:推荐png格式,风格尽量与已有图片保持一致。 | ||
| 86 | + - 分辨率与清晰度:需清晰且尺寸适中,避免模糊或过度压缩。 | ||
| 87 | + - 文件大小:单张图片不建议超过10M。 | ||
| 88 | + - 版权:所有引用的图片、文献等资源,请确保合规性。 | ||
| 89 | + | ||
| 90 | +## 获取帮助 | ||
| 91 | + | ||
| 92 | +如果您在贡献过程中有任何疑问: | ||
| 93 | + | ||
| 94 | +1. 查阅现有文档:模板或规范有问题,请先查阅项目已有的指南、API文档或README等。 | ||
| 95 | +2. 发起讨论:您可以新建Issue或直接在相关Issue或PR中留言。 | ||
| 96 | + | ||
| 97 | +## 文档模板 | ||
| 98 | + | ||
| 99 | +算子交付件中涉及的关键文档主要包括如下,具体写作格式、内容要求请参考模板。 | ||
| 100 | + | ||
| 101 | +- [算子README文档模板](https://gitcode.com/cann/ops-ras/wiki/%E7%AE%97%E5%AD%90README%E6%96%87%E6%A1%A3%E6%A8%A1%E6%9D%BF) | ||
| 102 | +- [aclnn API文档模板](https://gitcode.com/cann/ops-ras/wiki/aclnn%20API%E6%96%87%E6%A1%A3%E6%A8%A1%E6%9D%BF) | ||
| @@ -0,0 +1,273 @@ | |||
| 1 | +# 快速入门:基于ops-ras仓 | ||
| 2 | + | ||
| 3 | +## 使用须知 | ||
| 4 | + | ||
| 5 | +本指南旨在帮助您快速上手CANN和`ops-ras`算子仓的使用。为方便您快速了解算子开发全流程,以**AddExample**算子为实践对象,算子源码位于`ops-ras/examples/add_example`,操作流程如下: | ||
| 6 | + | ||
| 7 | +1. **[前提条件](../README.md)**:参考项目README完成环境准备和源码下载,此处不再赘述。快速入门场景**推荐CANNLab或Docker部署**,操作简单。 | ||
| 8 | + | ||
| 9 | + > **说明**:CANNLab或Docker环境默认提供最新商发版CANN包;如需体验master分支最新能力,可手动搭建环境。 | ||
| 10 | + | ||
| 11 | +2. **[编译运行](#一编译运行)**:编译自定义算子包并安装,实现快速调用算子。 | ||
| 12 | + | ||
| 13 | +3. **[算子开发](#二算子开发)**:通过修改现有算子Kernel,体验开发、编译、验证的完整闭环。 | ||
| 14 | + | ||
| 15 | +4. **[算子调试](#三算子调试)**:掌握算子打印和性能采集方法。 | ||
| 16 | + | ||
| 17 | +5. **[算子验证](#四算子验证)**:学习如何修改算子example样例,以验证算子在不同输入下的功能正确性。 | ||
| 18 | + | ||
| 19 | +## 一、编译运行 | ||
| 20 | + | ||
| 21 | +本阶段目的是**快速体验项目标准流程**,验证环境能否成功进行算子源码编译、打包、安装和运行。 | ||
| 22 | + | ||
| 23 | +### 1. 进入项目源码 | ||
| 24 | + | ||
| 25 | +- CANNLab云开发环境: | ||
| 26 | + | ||
| 27 | + 默认提供最新商发版CANN包配套的项目源码,进入源码目录,\$\{gitCode\_id\}替换为开发者个人gitCode账号。 | ||
| 28 | + | ||
| 29 | + ```bash | ||
| 30 | + cd /mnt/workspace/gitCode/${gitCode_id}/ops-ras | ||
| 31 | + ``` | ||
| 32 | + | ||
| 33 | +- 非CANNLab云开发环境: | ||
| 34 | + | ||
| 35 | + 根据[release仓库](https://gitcode.com/cann/release-management)源码与CANN版本配套关系,执行如下命令下载源码,\$\{tag\_version\}替换为目标分支标签,例如9.0.0。 | ||
| 36 | + | ||
| 37 | + ```bash | ||
| 38 | + git clone -b ${tag_version} https://gitcode.com/cann/ops-ras.git && cd ops-ras | ||
| 39 | + ``` | ||
| 40 | + | ||
| 41 | +> 说明:如需切换源码分支版本,请参考如下指导。 | ||
| 42 | +> | ||
| 43 | +> 1. 在源码目录执行`git branch`,查询当前源码版本。 | ||
| 44 | +> 2. 在源码目录执行`git checkout ${tag_version}`,切换到目标分支源码,注意满足源码与CANN版本配套关系。若源码已存在,执行`git pull`拉取最新源码。 | ||
| 45 | + | ||
| 46 | +### 2. 编译AddExample算子 | ||
| 47 | + | ||
| 48 | +本指南默认采用**单算子编译**:仅构建目标算子,编译时间短,适合快速入门与日常开发。通用命令格式:`bash build.sh --pkg --soc=<芯片版本> --ops=<算子名>`。 | ||
| 49 | + | ||
| 50 | +> 若需编译整个算子库(省略 `--ops`),请参阅 [build参数说明](zh/install/build.md)。 | ||
| 51 | + | ||
| 52 | +以AddExample算子为例,编译命令如下: | ||
| 53 | + | ||
| 54 | +```bash | ||
| 55 | +bash build.sh --pkg --soc=${soc_version} --ops=add_example -j16 | ||
| 56 | +``` | ||
| 57 | + | ||
| 58 | +\$\{soc\_version\}取值请访问[CANN下载中心](https://www.hiascend.com/cann/download),根据页面提示查询硬件产品名,产品名对应的${soc_version}取值如下,请按实际场景传参。 | ||
| 59 | + | ||
| 60 | +- Atlas A2 训练系列产品/Atlas A2 推理系列产品:取值为ascend910b | ||
| 61 | +- Atlas A3 训练系列产品/Atlas A3 推理系列产品:取值为ascend910_93 | ||
| 62 | +- 950系列产品:取值为ascend950 | ||
| 63 | + | ||
| 64 | +若提示如下信息,说明编译成功。 | ||
| 65 | + | ||
| 66 | +```bash | ||
| 67 | +Self-extractable archive "cann-ops-ras-custom_linux-${arch}.run" successfully created. | ||
| 68 | +``` | ||
| 69 | + | ||
| 70 | +编译成功后,run包存放于项目根目录的build_out目录下。 | ||
| 71 | + | ||
| 72 | +### 3. 安装AddExample算子包 | ||
| 73 | + | ||
| 74 | +```bash | ||
| 75 | +./build_out/cann-ops-ras-*linux*.run | ||
| 76 | +``` | ||
| 77 | + | ||
| 78 | +`AddExample`安装在```${ASCEND_HOME_PATH}/opp/vendors```路径中,```${ASCEND_HOME_PATH}```表示CANN软件安装目录。 | ||
| 79 | + | ||
| 80 | +### 4. 配置环境变量 | ||
| 81 | + | ||
| 82 | +将自定义算子包的路径加入环境变量,确保运行时能够找到。 | ||
| 83 | + | ||
| 84 | +```bash | ||
| 85 | +export LD_LIBRARY_PATH=${ASCEND_HOME_PATH}/opp/vendors/custom_ras/op_api/lib:${LD_LIBRARY_PATH} | ||
| 86 | +``` | ||
| 87 | + | ||
| 88 | +### 5. 快速验证:运行算子样例 | ||
| 89 | + | ||
| 90 | +通用的运行命令格式:`bash build.sh --run_example <算子名> <运行模式> <包模式>`。 | ||
| 91 | + | ||
| 92 | +以AddExample为例,其提供了简单算子样例`add_example/examples/test_aclnn_add_example.cpp`,运行该样例验证算子功能是否正常。 | ||
| 93 | + | ||
| 94 | +```bash | ||
| 95 | +bash build.sh --run_example add_example eager cust --vendor_name=custom | ||
| 96 | +``` | ||
| 97 | + | ||
| 98 | +预期输出:打印算子`AddExample`的加法计算结果,表明算子已成功部署并正确执行。 | ||
| 99 | + | ||
| 100 | +```bash | ||
| 101 | +mean result[0] is: 2.000000 | ||
| 102 | +mean result[1] is: 2.000000 | ||
| 103 | +mean result[2] is: 2.000000 | ||
| 104 | +mean result[3] is: 2.000000 | ||
| 105 | +mean result[4] is: 2.000000 | ||
| 106 | +mean result[5] is: 2.000000 | ||
| 107 | +mean result[6] is: 2.000000 | ||
| 108 | +mean result[7] is: 2.000000 | ||
| 109 | +... | ||
| 110 | +``` | ||
| 111 | + | ||
| 112 | +## 二、算子开发 | ||
| 113 | + | ||
| 114 | +本阶段目的是对已成功运行的AddExample算子尝试**修改核函数代码**。 | ||
| 115 | + | ||
| 116 | +### 1. 修改Kernel实现 | ||
| 117 | + | ||
| 118 | +找到AddExample算子的核心kernel实现文件`ops-ras/examples/add_example/op_kernel/add_example.h`,尝试将算子中的Add操作改为Mul操作: | ||
| 119 | + | ||
| 120 | +```cpp | ||
| 121 | +__aicore__ inline void AddExample<T>::Compute(int32_t progress) | ||
| 122 | +{ | ||
| 123 | + AscendC::LocalTensor<T> xLocal = inputQueueX.DeQue<T>(); | ||
| 124 | + AscendC::LocalTensor<T> yLocal = inputQueueY.DeQue<T>(); | ||
| 125 | + AscendC::LocalTensor<T> zLocal = outputQueueZ.AllocTensor<T>(); | ||
| 126 | + // === 在此处将Add替换为Mul === | ||
| 127 | + // AscendC::Add(zLocal, xLocal, yLocal, tileLength_); | ||
| 128 | + AscendC::Mul(zLocal, xLocal, yLocal, tileLength_); | ||
| 129 | + outputQueueZ.EnQue<T>(zLocal); | ||
| 130 | + inputQueueX.FreeTensor(xLocal); | ||
| 131 | + inputQueueY.FreeTensor(yLocal); | ||
| 132 | +} | ||
| 133 | +``` | ||
| 134 | + | ||
| 135 | +### 2. 编译与验证 | ||
| 136 | + | ||
| 137 | +重复[编译运行](#一编译运行)章节中的步骤: | ||
| 138 | + | ||
| 139 | +1. **重新编译**: | ||
| 140 | + | ||
| 141 | + 先回到项目根目录,编译命令如下: | ||
| 142 | + | ||
| 143 | + ```bash | ||
| 144 | + bash build.sh --pkg --soc=${soc_version} --ops=add_example -j16 | ||
| 145 | + ``` | ||
| 146 | + | ||
| 147 | + > **说明**:`${soc_version}` 请根据实际芯片型号填写,取值方式同[编译AddExample算子](#2-编译addexample算子)中的说明。 | ||
| 148 | + | ||
| 149 | +2. **重新安装**: | ||
| 150 | + | ||
| 151 | + ```bash | ||
| 152 | + ./build_out/cann-ops-ras-*linux*.run | ||
| 153 | + ``` | ||
| 154 | + | ||
| 155 | +3. **重新验证**: | ||
| 156 | + | ||
| 157 | + ```bash | ||
| 158 | + bash build.sh --run_example add_example eager cust --vendor_name=custom | ||
| 159 | + ``` | ||
| 160 | + | ||
| 161 | +4. **成功标志**:输出结果变成乘法结果。 | ||
| 162 | + | ||
| 163 | + ```bash | ||
| 164 | + mean result[0] is: 1.000000 | ||
| 165 | + mean result[1] is: 1.000000 | ||
| 166 | + mean result[2] is: 1.000000 | ||
| 167 | + mean result[3] is: 1.000000 | ||
| 168 | + mean result[4] is: 1.000000 | ||
| 169 | + mean result[5] is: 1.000000 | ||
| 170 | + mean result[6] is: 1.000000 | ||
| 171 | + mean result[7] is: 1.000000 | ||
| 172 | + ... | ||
| 173 | + ``` | ||
| 174 | + | ||
| 175 | +## 三、算子调试 | ||
| 176 | + | ||
| 177 | +本阶段以AddExample为例,在算子中添加打印并采集算子性能数据,以便后续问题分析定位。 | ||
| 178 | + | ||
| 179 | +### 1. 打印 | ||
| 180 | + | ||
| 181 | +算子如果出现执行失败、精度异常等问题,添加打印进行问题分析和定位。 | ||
| 182 | + | ||
| 183 | +请在`examples/add_example/op_kernel/add_example.h`中进行代码修改。 | ||
| 184 | + | ||
| 185 | +* **printf** | ||
| 186 | + | ||
| 187 | + 该接口支持打印Scalar类型数据,如整数、字符型、布尔型等,详细介绍请参见[《Ascend C API》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中"算子调测API > printf"。 | ||
| 188 | + | ||
| 189 | + ```c++ | ||
| 190 | + blockLength_ = (tilingData->totalLength + AscendC::GetBlockNum() - 1) / AscendC::GetBlockNum(); | ||
| 191 | + tileNum_ = tilingData->tileNum; | ||
| 192 | + tileLength_ = ((blockLength_ + tileNum_ - 1) / tileNum_ / BUFFER_NUM) ? | ||
| 193 | + ((blockLength_ + tileNum_ - 1) / tileNum_ / BUFFER_NUM) : 1; | ||
| 194 | + // 打印当前核计算Block长度 | ||
| 195 | + AscendC::PRINTF("Tiling blockLength is %llu\n", blockLength_); | ||
| 196 | + ``` | ||
| 197 | + | ||
| 198 | +* **DumpTensor** | ||
| 199 | + | ||
| 200 | + 该接口支持Dump指定Tensor的内容,同时支持打印自定义附加信息,比如当前行号等,详细介绍请参见[《Ascend C API》](https://hiascend.com/document/redirect/CannCommunityAscendCApi)中"算子调测API > DumpTensor"。 | ||
| 201 | + | ||
| 202 | + ```c++ | ||
| 203 | + AscendC::LocalTensor<T> zLocal = outputQueueZ.DeQue<T>(); | ||
| 204 | + // 打印zLocal Tensor信息 | ||
| 205 | + DumpTensor(zLocal, 0, 128); | ||
| 206 | + ``` | ||
| 207 | + | ||
| 208 | +### 2. 性能采集 | ||
| 209 | + | ||
| 210 | +当算子功能验证正确后,可通过`msprof`工具采集算子性能数据。 | ||
| 211 | + | ||
| 212 | +- **生成可执行文件** | ||
| 213 | + | ||
| 214 | + 调用AddExample算子的example样例,生成可执行文件(test_aclnn_add_example),该文件位于项目`ops-ras/build`目录。 | ||
| 215 | + | ||
| 216 | + ```bash | ||
| 217 | + bash build.sh --run_example add_example eager cust --vendor_name=custom | ||
| 218 | + ``` | ||
| 219 | + | ||
| 220 | +- **采集性能数据** | ||
| 221 | + | ||
| 222 | + 进入AddExample算子可执行文件目录`ops-ras/build/`,执行如下命令: | ||
| 223 | + | ||
| 224 | + ```bash | ||
| 225 | + msprof --application="./test_aclnn_add_example" | ||
| 226 | + ``` | ||
| 227 | + | ||
| 228 | +采集结果在项目`ops-ras/build/`目录,msprof命令执行完后会自动解析并导出性能数据结果文件,详细内容请参见[msprof](https://www.hiascend.com/document/detail/zh/mindstudio/82RC1/T&ITools/Profiling/atlasprofiling_16_0110.html#ZH-CN_TOPIC_0000002504160251)。 | ||
| 229 | + | ||
| 230 | +## 四、算子验证 | ||
| 231 | + | ||
| 232 | +本阶段通过修改AddExample算子example样例中的输入数据,验证该算子在多种场景下的功能正确性。 | ||
| 233 | + | ||
| 234 | +### 1. 修改测试输入 | ||
| 235 | + | ||
| 236 | +找到并编辑`AddExample`的`ops-ras/examples/add_example/examples/test_aclnn_add_example.cpp`,修改输入张量的形状和数值。 | ||
| 237 | + | ||
| 238 | +**修改输入/输出数据**:修改输入、输出的shape信息,以及初始化数据,构造相应的输入、输出tensor。 | ||
| 239 | + | ||
| 240 | +```c++ | ||
| 241 | +int main() { | ||
| 242 | + // ... 初始化代码 ... | ||
| 243 | + | ||
| 244 | + // === ① 修改selfX的输入 === | ||
| 245 | + // 修改前:shape = {32, 4, 4, 4}, 数值全为1 | ||
| 246 | + // 修改后:将输入shape改为 {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 | ||
| 249 | + // 可使用循环填充更有区分度的数据,例如递增序列 | ||
| 250 | + for (int i = 0; i < 4096; ++i) { | ||
| 251 | + selfXHostData[i] = static_cast<float>(i % 10); // 填充0-9的循环值 | ||
| 252 | + } | ||
| 253 | + // === ② 参考selfX,同理修改selfY、selfZ的输入 === | ||
| 254 | + | ||
| 255 | + // ... 后续执行代码 ... | ||
| 256 | +} | ||
| 257 | +``` | ||
| 258 | + | ||
| 259 | +### 2. 重新编译并验证 | ||
| 260 | + | ||
| 261 | +1. 由于只修改了example测试代码,无需重新编译算子包。 | ||
| 262 | + | ||
| 263 | +2. 重新执行验证命令: | ||
| 264 | + | ||
| 265 | + ```bash | ||
| 266 | + bash build.sh --run_example add_example eager cust --vendor_name=custom | ||
| 267 | + ``` | ||
| 268 | + | ||
| 269 | +3. 观察算子输出结果是否符合预期。 | ||
| 270 | + | ||
| 271 | +## 结语 | ||
| 272 | + | ||
| 273 | +体验完上述流程,您已基本完成算子开发过程,如果您想进一步贡献新算子或学习更多高阶开发、调试等技能,请访问本项目README学习[进阶教程](../README.md#学习教程)和[贡献指南](../README.md#相关信息)等。 | ||
| @@ -1,47 +1,72 @@ | |||
| 1 | -# 项目文档 | 1 | +# 文档中心 |
| 2 | 2 | ||
| 3 | -## 目录说明 | 3 | +## 目录结构 |
| 4 | 4 | ||
| 5 | -关键目录结构如下: | 5 | +Docs目录结构说明如下: |
| 6 | 6 | ||
| 7 | -``` | 7 | +```text |
| 8 | -├── context # 公共目录,存放包括基本概念、项目目录介绍、build参数说明等文档 | 8 | +├── zh |
| 9 | -│ ├── dir_structure.md | 9 | + ├── context # 公共文档,如术语、基础概念等 |
| 10 | -│ ├── build.md | 10 | + ├── debug # 算子调试指导文档 |
| 11 | -│ └── ... | 11 | + │ ├── cann_sim.md |
| 12 | -├── debug # 算子调试调优文档目录 | 12 | + │ ├── op_debug_prof.md |
| 13 | -│ ├── op_debug_prof.md | 13 | + │ └── ... |
| 14 | -│ └── ... | 14 | + ├── develop # 算子开发指导文档 |
| 15 | -├── develop # 算子开发文档目录(包括AI Core和AI CPU算子开发指南等) | 15 | + │ ├── aicore_develop_guide.md |
| 16 | -│ ├── aicore_develop_guide.md | 16 | + │ ├── aicpu_develop_guide.md |
| 17 | -│ ├── aicpu_develop_guide.md | 17 | + │ ├── cross_platform_migration_guide.md |
| 18 | -│ └── ... | 18 | + │ ├── graph_develop_guide.md |
| 19 | -├── figures # 图片目录 | 19 | + │ └── ... |
| 20 | -├── invocation # 算子调用文档目录(包括aclnn调用、图模式调用等) | 20 | + ├── figures # 图片目录 |
| 21 | -│ ├──op_invocation.md | 21 | + ├── install # 环境安装和编译指导文档 |
| 22 | -│ └── ... | 22 | + │ ├── build.md |
| 23 | -├── op_api_list.md # 全量算子接口列表(aclnn) | 23 | + │ ├── compile.md |
| 24 | -├── op_list.md # 全量算子列表 | 24 | + │ ├── dir_structure.md |
| 25 | -└── README | 25 | + │ ├── quick_install.md |
| 26 | + │ └── ... | ||
| 27 | + ├── invocation # 算子调用指导文档(包括aclnn调用、图模式调用等) | ||
| 28 | + │ ├── quick_op_invocation.md | ||
| 29 | + │ ├── op_invocation.md | ||
| 30 | + │ └── ... | ||
| 31 | + ├── op_api_list.md # 全量算子接口列表(aclnn) | ||
| 32 | + ├── op_list.md # 全量算子列表 | ||
| 33 | +├── CONTRIBUTING_DOCS.md # 文档贡献说明 | ||
| 34 | +├── QUICKSTART.md # 快速入门 | ||
| 35 | +└── README.md | ||
| 26 | ``` | 36 | ``` |
| 27 | 37 | ||
| 28 | -## 文档说明 | 38 | +## 进阶教程 |
| 29 | 39 | ||
| 30 | -为方便开发者快速熟悉本项目,可按需获取对应文档,文档内容包括: | 40 | +### 指南类文档 |
| 31 | 41 | ||
| 32 | -| 文档 | 说明 | | 42 | +| 文档 | 说明 | |
| 33 | -| ------------------------------------------------ | ------------------------------------------------------------ | | 43 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | |
| 34 | -| [算子列表](zh/op_list.md) | 介绍项目包含的所有算子。 | | 44 | +| [源码构建指南](zh/install/compile.md) | 介绍联网/未联网场景下不同的源码构建方式和验证方法。 | |
| 35 | -| [aclnn列表](zh/op_api_list.md) | 介绍项目包含的所有aclnn前缀的算子API,通过该API可直调算子。 | | 45 | +| [算子调用指南](zh/invocation/quick_op_invocation.md) | 介绍调用算子样例方法和不同算子调用方式(如aclnn/图等)。 | |
| 36 | -| [环境部署](zh/context/quick_install.md) | 介绍项目的基础环境搭建,包括软件包和第三方依赖的获取和安装。 | | 46 | +| [标准算子开发指南](zh/develop/aicore_develop_guide.md) | 介绍如何基于标准工程定义算子原型、实现Tiling和Kernel,此类算子称为"标准算子"。<br>标准算子支持aclnn和图模式调用。 | |
| 37 | -| [算子调用](zh/invocation/quick_op_invocation.md) | 介绍如何快速调用项目内算子,包括编译执行算子包和UT等。 | | 47 | +| [简易算子开发指南](../examples/fast_kernel_launch_example/README.md) | 介绍如何基于简易工程实现fast_kernel_launch,即`<<<>>>`方式,此类算子称为"简易算子"。<br>简易算子仅支持PyTorch调用。 | |
| 38 | -| [算子开发](zh/develop/aicore_develop_guide.md) | 介绍自定义算子的开发流程,包括算子原型定义、Tiling实现、Kernel实现等。 | | 48 | +| [算子调试调优](zh/debug/op_debug_prof.md) | 介绍常见的算子功能调试和性能调优方法(如数据采集和仿真流水等)。 | |
| 39 | -| [算子调用方式](zh/invocation/op_invocation.md) | 介绍不同算子调用方式,包括aclnn调用、图模式调用等,方便算子快速应用于AI业务中。 | | ||
| 40 | -| [算子调试调优](zh/debug/op_debug_prof.md) | 介绍常见的算子调试、调优方法。 | | ||
| 41 | 49 | ||
| 50 | +### API类文档 | ||
| 51 | + | ||
| 52 | +| 文档 | 说明 | | ||
| 53 | +| ----------------------- | ---------------------- | | ||
| 54 | +| [算子列表](zh/op_list.md) | 介绍项目包含的所有算子清单。 | | ||
| 55 | +| [aclnn列表](zh/op_api_list.md) | 介绍项目包含的所有算子aclnn API清单。为方便用户在Host侧调用算子,提供了C语言API,即aclnn前缀的API。 | | ||
| 56 | + | ||
| 57 | +### 工具类文档 | ||
| 58 | + | ||
| 59 | +| 文档 | 说明 | | ||
| 60 | +| ----------------------- | ---------------------- | | ||
| 61 | +| [Simulator仿真工具](zh/debug/cann_sim.md) | 面向算子开发场景的SoC级仿真工具,用于分析运行在AI仿真器上AI任务在各阶段精度和性能数据。 | | ||
| 62 | + | ||
| 63 | +### 更多文档 | ||
| 64 | + | ||
| 65 | +- 样例类文档:可参考[cann-samples](https://gitcode.com/cann/cann-samples)仓算子样例。 | ||
| 42 | 66 | ||
| 43 | ## 附录 | 67 | ## 附录 |
| 68 | + | ||
| 44 | | 文档 | 说明 | | 69 | | 文档 | 说明 | |
| 45 | | ----------------------------------- | ------------------------------------------------------------ | | 70 | | ----------------------------------- | ------------------------------------------------------------ | |
| 46 | -| [算子基本概念](zh/context/基本概念.md) | 介绍算子相关的基础概念和特性,包括量化/稀疏等术语、数据类型、数据格式等。 | | 71 | +| [算子基本概念](zh/context/基本概念.md) | 介绍算子领域相关的基础概念和术语,如量化/稀疏、数据类型、数据格式等。 | |
| 47 | -| [build参数说明](zh/context/build.md) | 介绍项目中build.sh脚本功能和具体参数。 | | 72 | +| [build参数说明](zh/install/build.md) | 介绍本项目build.sh参数功能和取值,包括源码编译、算子调用、调试等。 | |
| @@ -1,6 +1,7 @@ | |||
| 1 | - # aclnn返回码 | 1 | +# aclnn返回码 |
| 2 | 2 | ||
| 3 | 调用aclnn API时,常见的接口返回码如[表1](#zh-cn_topic_0000001563019104_table8155243135018)所示。 | 3 | 调用aclnn API时,常见的接口返回码如[表1](#zh-cn_topic_0000001563019104_table8155243135018)所示。 |
| 4 | +对于异常状态码值,可以通过aclGetRecentErrMsg接口(参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi))获取异常信息,您可以根据报错提示排查问题或者联系技术支持。 | ||
| 4 | 5 | ||
| 5 | **表 1** 返回状态码 | 6 | **表 1** 返回状态码 |
| 6 | 7 | ||
| @@ -46,7 +47,7 @@ | |||
| 46 | </td> | 47 | </td> |
| 47 | <td class="cellrowborder" valign="top" width="15.971597159715973%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0000001563019104_p14156144313508"><a name="zh-cn_topic_0000001563019104_p14156144313508"></a><a name="zh-cn_topic_0000001563019104_p14156144313508"></a>561xxx</p> | 48 | <td class="cellrowborder" valign="top" width="15.971597159715973%" headers="mcps1.2.4.1.2 "><p id="zh-cn_topic_0000001563019104_p14156144313508"><a name="zh-cn_topic_0000001563019104_p14156144313508"></a><a name="zh-cn_topic_0000001563019104_p14156144313508"></a>561xxx</p> |
| 48 | </td> | 49 | </td> |
| 49 | -<td class="cellrowborder" valign="top" width="53.48534853485349%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0000001563019104_p10850181263218"><a name="zh-cn_topic_0000001563019104_p10850181263218"></a><a name="zh-cn_topic_0000001563019104_p10850181263218"></a>API内部发生内部异常,详细的错误信息,可以通过aclGetRecentErrMsg接口获取。您可以根据报错提示排查问题或者联系技术支持。</p> | 50 | +<td class="cellrowborder" valign="top" width="53.48534853485349%" headers="mcps1.2.4.1.3 "><p id="zh-cn_topic_0000001563019104_p10850181263218"><a name="zh-cn_topic_0000001563019104_p10850181263218"></a><a name="zh-cn_topic_0000001563019104_p10850181263218"></a>API内部发生异常,详细的错误信息,可以通过aclGetRecentErrMsg接口获取。您可以根据报错提示排查问题或者联系技术支持。</p> |
| 50 | 51 | ||
| 51 | </td> | 52 | </td> |
| 52 | </tr> | 53 | </tr> |
| @@ -1,31 +0,0 @@ | |||
| 1 | -# 离线编译 | ||
| 2 | -离线编译是指在没有连接互联网的环境下,将软件源代码编译成可执行程序,并安装或配置到目标服务器上的过程。 | ||
| 3 | -本项目[算子调用](../invocation/quick_op_invocation.md)或[算子开发](../develop/aicore_develop_guide.md)过程中均需编译算子包,编译过程中会依赖一些开源第三方软件,这些软件联网时会自动下载,离线状态下无法直接下载。 | ||
| 4 | - | ||
| 5 | -本章提供了离线编译安装指导,在此之前请确保已按[环境部署](./quick_install.md)完成基础环境搭建。 | ||
| 6 | -## 获取依赖 | ||
| 7 | -离线编译时,需手动安装如下依赖,否则无法正常编译和执行算子,其中`${cann_3rd_lib_path}`表示第三方软件存放的目录。 | ||
| 8 | - | ||
| 9 | -- 依赖json | ||
| 10 | - | ||
| 11 | -下载[json](https://gitcode.com/cann-src-third-party/json/releases/download/v3.11.3/include.zip),并解压到`${cann_3rd_lib_path}/json/include`,若无该目录请自行创建。 | ||
| 12 | - | ||
| 13 | -- 依赖makeself | ||
| 14 | - | ||
| 15 | -下载[makeself](https://gitcode.com/cann-src-third-party/makeself/releases/download/release-2.5.0-patch1.0/makeself-release-2.5.0-patch1.tar.gz),并解压到`${cann_3rd_lib_path}/makeself`,若无该目录请自行创建。 | ||
| 16 | - | ||
| 17 | -## 离线编译(自定义算子包) | ||
| 18 | -自定义算子包编译时,需增加--cann_3rd_lib_path配置选项并指定路径,命令如下: | ||
| 19 | - | ||
| 20 | -```bash | ||
| 21 | -bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] --cann-3rd_lib_path=${cann_3rd_lib_path} | ||
| 22 | -# 以TransposeBatchMatMul算子编译为例,假设第三方软件存放的目录为/path/cann_3rd_lib_path | ||
| 23 | -# bash build.sh --pkg --soc=ascend910b --ops=transpose_batch_mat_mul --cann-3rd_lib_path=/path/cann_3rd_lib_path | ||
| 24 | -``` | ||
| 25 | - | ||
| 26 | -## 离线编译(ops-ras包) | ||
| 27 | -整包编译时,需增加--cann_3rd_lib_path配置选项并指定路径,命令如下: | ||
| 28 | - | ||
| 29 | -```bash | ||
| 30 | -bash build.sh --pkg [--jit] --soc=${soc_version} --cann-3rd_lib_path=${cann_3rd_lib_path} | ||
| 31 | -``` | ||
| @@ -1,133 +0,0 @@ | |||
| 1 | -# 项目目录 | ||
| 2 | - | ||
| 3 | -> 本章罗列的部分目录是可选的,请以实际交付件为准。尤其**单算子目录**,不同场景下交付件有差异,具体说明如下: | ||
| 4 | -> | ||
| 5 | -> - 若缺少op_host目录,可能是调用了其他算子op_host实现,调用逻辑参见该算子op_api或op_graph目录下源码实现;也可能是Kernel暂无Ascend C实现,如有需要,欢迎开发者参考[贡献指南](../../../CONTRIBUTING.md)补充贡献该算子。 | ||
| 6 | -> - 若缺少op_kernel目录,可能是调用了其他算子op_kernel实现,调用逻辑参见该算子op_api或op_graph目录下源码实现;也可能是Kernel暂无Ascend C实现,如有需要,欢迎开发者参考[贡献指南](../../../CONTRIBUTING.md)补充贡献该算子。 | ||
| 7 | -> - 若缺少op_api目录,说明该算子暂不支持aclnn调用。 | ||
| 8 | -> - 若缺少op_graph目录,说明该算子暂不支持图模式调用。 | ||
| 9 | - | ||
| 10 | -项目全量目录层级介绍如下: | ||
| 11 | -``` | ||
| 12 | -├── cmake # 项目工程编译目录 | ||
| 13 | -│ ├── aclnn_ops_ras.h.in # aclnn汇总头文件模板 | ||
| 14 | -│ └── ... | ||
| 15 | -├── common # 项目公共头文件和公共代码 | ||
| 16 | -│ ├── CMakeLists.txt | ||
| 17 | -│ ├── inc # 公共头文件目录 | ||
| 18 | -│ └── src # 公共代码目录 | ||
| 19 | -├── ${op_class} # 算子分类,如activation、conv、matmul类算子 | ||
| 20 | -│ ├── ${op_name} # 算子工程目录,${op_name}表示算子名(小写下划线形式) | ||
| 21 | -│ │ ├── CMakeLists.txt # 算子CMakeList入口 | ||
| 22 | -│ │ ├── README.md # 算子介绍文档 | ||
| 23 | -│ │ ├── docs # 算子文档目录 | ||
| 24 | -│ │ │ └── aclnn${OpName}.md # 算子aclnn接口介绍文档,${OpName}表示算子名(大驼峰形式) | ||
| 25 | -│ │ ├── examples # 算子调用示例目录 | ||
| 26 | -│ │ │ ├── test_aclnn_${op_name}.cpp # 算子通过aclnn调用的示例 | ||
| 27 | -│ │ │ └── test_geir_${op_name}.cpp # 算子通过geir调用的示例 | ||
| 28 | -│ │ ├── op_graph # 图融合相关实现 | ||
| 29 | -│ │ │ ├── CMakeLists.txt # op_graph侧CMakeList文件 | ||
| 30 | -│ │ │ ├── ${op_name}_graph_infer.cpp # InferDataType文件,实现算子数据类型推导 | ||
| 31 | -│ │ │ ├── ${op_name}_proto.h # 算子原型定义,用于图优化和融合阶段识别算子 | ||
| 32 | -│ │ │ └── fusion_pass # 算子融合规则目录 | ||
| 33 | -│ │ ├── op_host # Host侧实现 | ||
| 34 | -│ │ │ ├── CMakeLists.txt # Host侧CMakeList文件 | ||
| 35 | -│ │ │ ├── config # 可选,二进制配置文件,若未配置工程自动生成 | ||
| 36 | -│ │ │ │ ├── ${soc_version} # 算子在NPU上配置的二进制信息,${soc_version}表示NPU型号 | ||
| 37 | -│ │ │ │ │ ├── ${op_name}_binary.json # 算子二进制配置文件 | ||
| 38 | -│ │ │ │ │ └── ${op_name}_simplified_key.ini # 算子SimplifiedKey配置信息 | ||
| 39 | -│ │ │ │ └── ... | ||
| 40 | -│ │ │ ├── ${op_name}_def.cpp # 算子信息库,定义算子基本信息,如名称、输入输出、数据类型等 | ||
| 41 | -│ │ │ ├── ${op_name}_infershape.cpp # 可选,InferShape实现,根据算子形状推导输出shape,若未配置则输出shape与输入shape一样 | ||
| 42 | -│ │ │ ├── ${op_name}_tiling_${sub_case}.cpp # 可选,针对某些子场景下的Tiling优化,${sub_case}表示子场景,如${op_name}_tiling_arch35是针对arch35架构的优化,若无该文件表明该算子没有对应子场景的特定Tiling策略 | ||
| 43 | -│ │ │ ├── ${op_name}_tiling_${sub_case}.h # 可选,${sub_case}子场景下Tiling实现用的头文件 | ||
| 44 | -│ │ │ ├── ${op_name}_tiling.cpp # 可选,若无该文件表明对应场景下无Tiling实现(将张量划分为多个小块,区分数据类型进行并行计算) | ||
| 45 | -│ │ │ ├── ${op_name}_tiling.h # 可选,Tiling实现用的头文件 | ||
| 46 | -│ │ │ └── op_api # 可选,算子aclnn实现文件目录,若未配置工程自动生成 | ||
| 47 | -│ │ │ ├── aclnn_${op_name}.cpp # 算子aclnn接口实现文件 | ||
| 48 | -│ │ │ ├── aclnn_${op_name}.h # 算子aclnn接口实现头文件 | ||
| 49 | -│ │ │ ├── ${op_name}.cpp # 算子l0接口实现文件 | ||
| 50 | -│ │ │ ├── ${op_name}.h # 算子l0接口实现头文件 | ||
| 51 | -│ │ │ └── CMakeLists.txt | ||
| 52 | -│ │ │── op_kernel # AI Core算子Device侧Kernel实现 | ||
| 53 | -│ │ │ ├── ${sub_case} # 可选,${sub_case}子场景使用的目录 | ||
| 54 | -│ │ │ │ ├── ${op_name}_${model}.h # 算子kernel实现文件,${model}表示用户自定义文件名后缀,通常为Tiling模板名 | ||
| 55 | -│ │ │ │ └── ... | ||
| 56 | -│ │ │ ├── ${op_name}_tiling_key.h # 可选,TilingKey文件,定义Tiling策略的Key,标识不同划分方式,若未配置表明该算子无相应的Tiling策略 | ||
| 57 | -│ │ │ ├── ${op_name}_tiling_data.h # 可选,TilingData文件,存储Tiling策略相关配置信息,如块大小、并行度,若未配置表明该算子无相应的Tiling策略 | ||
| 58 | -│ │ │ ├── ${op_name}.cpp # Kernel入口文件,包含主函数和调度逻辑 | ||
| 59 | -│ │ │ └── ${op_name}.h # Kernel实现文件,定义Kernel头文件,包含函数声明、结构定义、逻辑实现 | ||
| 60 | -│ │ │── op_kernel_aicpu # 可选,AI CPU算子Device侧Kernel实现 | ||
| 61 | -│ │ │ ├── ${op_name}_aicpu.cpp # Kernel入口文件,包含主函数和调度逻辑 | ||
| 62 | -│ │ │ └── ${op_name}_aicpu.h # Kernel头文件,包含函数声明、结构定义、逻辑实现 | ||
| 63 | -│ │ └── tests # 算子测试用例目录 | ||
| 64 | -│ │ ├── CMakeLists.txt | ||
| 65 | -│ │ └── ut # 可选,UT测试用例,根据实际情况开发相应的用例 | ||
| 66 | -│ │ ├── CMakeLists.txt # UT用例CMakeList文件 | ||
| 67 | -│ │ ├── graph_plugin # graph_plugin测试用例目录 | ||
| 68 | -│ │ │ ├── CMakeLists.txt | ||
| 69 | -│ │ │ └── fusion_pass # 融合规则测试用例目录 | ||
| 70 | -│ │ │ └── CMakeLists.txt | ||
| 71 | -│ │ ├── op_host # op_host测试用例目录 | ||
| 72 | -│ │ │ ├── CMakeLists.txt | ||
| 73 | -│ │ │ ├── ${op_name}_regbase_tiling.h | ||
| 74 | -│ │ │ ├── op_api # op_api测试用例目录 | ||
| 75 | -│ │ │ │ ├── CMakeLists.txt | ||
| 76 | -│ │ │ │ └── test_aclnn_${op_name}.cpp # 算子aclnn测试用例文件 | ||
| 77 | -│ │ │ ├── test_${op_name}_${sub_case}.cpp # ${sub_case}子场景下op_host测试用例文件 | ||
| 78 | -│ │ │ ├── test_${op_name}.cpp # op_host测试用例文件 | ||
| 79 | -│ │ │ ├── test_${op_name}_infershape.cpp # 算子InferShape测试用例文件 | ||
| 80 | -│ │ │ └── test_${op_name}_tiling.cpp # 算子Tiling测试用例文件 | ||
| 81 | -│ │ └── op_kernel # op_kernel测试用例目录 | ||
| 82 | -│ │ ├── CMakeLists.txt | ||
| 83 | -│ │ │── test_${op_name}.cpp # 算子Kernel测试用例文件 | ||
| 84 | -│ │ └── ${op_name}_data # 可选,op_kernel测试用例中依赖的数据比对和生成脚本,若未配置需在对应用例中手动实现 | ||
| 85 | -│ │ ├── compare_data.py # 数据脚本 | ||
| 86 | -│ │ └── gen_data.py # 数据生成脚本 | ||
| 87 | -│ └── ... | ||
| 88 | -├── docs # 项目相关文档目录(zh为中文,en为英文) | ||
| 89 | -├── examples # 端到端算子开发和调用示例 | ||
| 90 | -│ ├── add_example # AI Core算子示例目录 | ||
| 91 | -│ │ ├── CMakeLists.txt # 算子编译配置文件 | ||
| 92 | -│ │ ├── examples # 算子使用示例目录 | ||
| 93 | -│ │ ├── op_graph # 算子构图相关目录 | ||
| 94 | -│ │ ├── op_host # 算子信息库、Tiling、InferShape相关实现目录 | ||
| 95 | -│ │ ├── op_kernel # 算子Kernel目录 | ||
| 96 | -│ │ └── tests # 算子测试用例目录 | ||
| 97 | -│ ├── add_example_aicpu # AI CPU算子示例目录 | ||
| 98 | -│ │ ├── CMakeLists.txt # 算子编译配置文件 | ||
| 99 | -│ │ ├── examples # 算子使用示例目录 | ||
| 100 | -│ │ ├── op_graph # 算子构图相关目录 | ||
| 101 | -│ │ ├── op_host # 算子信息库、InferShape相关实现 | ||
| 102 | -│ │ ├── op_kernel_aicpu # 算子Kernel目录 | ||
| 103 | -│ │ └── tests # 算子测试用例目录 | ||
| 104 | -│ ├── fast_kernel_launch_example # 轻量级,高性能的算子开发工程模板 | ||
| 105 | -│ │ ├── ascend_ops # 示例算子实现目录 | ||
| 106 | -│ │ ├── CMakeLists.txt # 算子编译配置文件 | ||
| 107 | -│ │ ├── README.md # 轻量级,高性能的算子开发工程说明资料 | ||
| 108 | -│ │ ├── requirements.txt | ||
| 109 | -│ │ └── setup.py # 构建脚本 | ||
| 110 | -│ ├── CMakeLists.txt | ||
| 111 | -│ └── README.md # 项目示例介绍文档 | ||
| 112 | -├── experimental # 用户自定义算子存放目录 | ||
| 113 | -├── scripts # 脚本目录,包含自定义算子、Kernel构建相关配置文件 | ||
| 114 | -├── tests # 项目级测试目录 | ||
| 115 | -│ ├── requirements.txt # 测试用例依赖的第三方组件 | ||
| 116 | -│ └── ut # UT用例工程 | ||
| 117 | -│ ├── CMakeLists.txt # UT工程的CMakeList脚本 | ||
| 118 | -│ ├── common # UT工程中使用的公共代码 | ||
| 119 | -│ ├── op_api # op_api测试工程 | ||
| 120 | -│ ├── op_host # op_host测试工程 | ||
| 121 | -│ └── op_kernel # op_kernel测试工程 | ||
| 122 | -├── CMakeLists.txt # 项目工程CMakeList入口 | ||
| 123 | -├── CONTRIBUTING.md # 项目贡献指南文件 | ||
| 124 | -├── LICENSE # 项目开源许可证信息 | ||
| 125 | -├── OAT.xml # 配置脚本,代码仓工具使用,用于检查License是否规范 | ||
| 126 | -├── README.md # 项目工程总介绍文档 | ||
| 127 | -├── SECURITY.md # 项目安全声明文件 | ||
| 128 | -├── build.sh # 项目工程编译脚本 | ||
| 129 | -├── classify_rule.yaml # 组件划分信息 | ||
| 130 | -├── install_deps.sh # 项目安装依赖包脚本 | ||
| 131 | -├── requirements.txt # 项目的第三方依赖包 | ||
| 132 | -└── version.info # 项目版本信息 | ||
| 133 | -``` | ||
| @@ -26,6 +26,14 @@ | |||
| 26 | | ACL_INT4 | INT4 | | 26 | | ACL_INT4 | INT4 | |
| 27 | | ACL_UINT1 | UINT1 | | 27 | | ACL_UINT1 | UINT1 | |
| 28 | | ACL_COMPLEX32 | COMPLEX32 | | 28 | | ACL_COMPLEX32 | COMPLEX32 | |
| 29 | +| ACL_HIFLOAT8 | HIFLOAT8 | | ||
| 30 | +| ACL_FLOAT8_E5M2 | FLOAT8_E5M2 | | ||
| 31 | +| ACL_FLOAT8_E4M3FN | FLOAT8_E4M3FN | | ||
| 32 | +| ACL_FLOAT8_E8M0 | FLOAT8_E8M0 | | ||
| 33 | +| ACL_FLOAT6_E3M2 | FLOAT6_E3M2 | | ||
| 34 | +| ACL_FLOAT6_E2M3 | FLOAT6_E2M3 | | ||
| 35 | +| ACL_FLOAT4_E2M1 | FLOAT4_E2M1 | | ||
| 36 | +| ACL_FLOAT4_E1M2 | FLOAT4_E1M2 | | ||
| 29 | 37 | ||
| 30 | 38 | ||
| 31 | 39 | ||
| @@ -5,11 +5,11 @@ | |||
| 5 | - 算子API的调用流程和编译运行操作详情请参见[《应用开发(C&C++)》](https://hiascend.com/document/redirect/CannCommunityCppInferWizard)中“单算子调用>单算子API执行>调用aclnn接口示例代码”。 | 5 | - 算子API的调用流程和编译运行操作详情请参见[《应用开发(C&C++)》](https://hiascend.com/document/redirect/CannCommunityCppInferWizard)中“单算子调用>单算子API执行>调用aclnn接口示例代码”。 |
| 6 | 6 | ||
| 7 | ## 编译前准备 | 7 | ## 编译前准备 |
| 8 | -本章以开发和运行环境合设场景为例,即带AI处理器的机器既作为开发环境又作为运行环境。该场景下,代码开发和代码运行在同一台机器上。这里以**AddMatMul算子**为例,其他算子的调用逻辑、流程、编译脚本与AddMatMul算子大致一样,请根据实际情况自行修改API调用脚本(\*.cpp)和编译脚本(CMakeLists)。 | 8 | +本章以开发和运行环境合设场景为例,即带AI处理器的机器既作为开发环境又作为运行环境。该场景下,代码开发和代码运行在同一台机器上。这里以**AddExample算子**为例,其他算子的调用逻辑、流程、编译脚本与AddExample算子大致一样,请根据实际情况自行修改API调用脚本(\*.cpp)和编译脚本(CMakeLists)。 |
| 9 | 9 | ||
| 10 | - **示例代码** | 10 | - **示例代码** |
| 11 | 11 | ||
| 12 | - 已知AddMatMul算子实现了张量加法运算,计算公式为:out = β self + α (mat1 @ mat2)。您可以从[aclnnAddmm&aclnnInplaceAddmm.md](../../../matmul/mat_mul_v3/docs/aclnnAddmm&aclnnInplaceAddmm.md)中“调用示例”获取示例代码,并将代码文件命名为“**test\_addmm.cpp**”。 | 12 | + 已知AddExample算子实现了张量加法运算。您可以从[test_aclnn_add_example.cpp](../../../examples/add_example/examples/test_aclnn_add_example.cpp)中获取示例代码,并将代码文件命名为“**test\_aclnn\_add\_example.cpp**”。 |
| 13 | 13 | ||
| 14 | - **CMakeLists文件** | 14 | - **CMakeLists文件** |
| 15 | 15 | ||
| @@ -33,7 +33,7 @@ | |||
| 33 | 33 | ||
| 34 | # 设置可执行文件名(如opapi_test),并指定待运行算子文件*.cpp所在目录 | 34 | # 设置可执行文件名(如opapi_test),并指定待运行算子文件*.cpp所在目录 |
| 35 | add_executable(opapi_test | 35 | add_executable(opapi_test |
| 36 | - test_addmm.cpp) | 36 | + test_aclnn_add_example.cpp) |
| 37 | 37 | ||
| 38 | # 设置ASCEND_PATH(CANN软件包目录,请根据实际路径修改)和INCLUDE_BASE_DIR(头文件目录) | 38 | # 设置ASCEND_PATH(CANN软件包目录,请根据实际路径修改)和INCLUDE_BASE_DIR(头文件目录) |
| 39 | if(NOT "$ENV{ASCEND_CUSTOM_PATH}" STREQUAL "") | 39 | if(NOT "$ENV{ASCEND_CUSTOM_PATH}" STREQUAL "") |
| @@ -51,27 +51,12 @@ | |||
| 51 | target_link_libraries(opapi_test PRIVATE | 51 | target_link_libraries(opapi_test PRIVATE |
| 52 | ${ASCEND_PATH}/lib64/libascendcl.so | 52 | ${ASCEND_PATH}/lib64/libascendcl.so |
| 53 | ${ASCEND_PATH}/lib64/librasopbase.so | 53 | ${ASCEND_PATH}/lib64/librasopbase.so |
| 54 | - ${ASCEND_PATH}/lib64/libopapi_math.so | ||
| 55 | ${ASCEND_PATH}/lib64/libopapi_ras.so) | 54 | ${ASCEND_PATH}/lib64/libopapi_ras.so) |
| 56 | 55 | ||
| 57 | # 可执行文件在CMakeLists文件所在目录的bin目录下 | 56 | # 可执行文件在CMakeLists文件所在目录的bin目录下 |
| 58 | install(TARGETS opapi_test DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) | 57 | install(TARGETS opapi_test DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) |
| 59 | ``` | 58 | ``` |
| 60 | - 对于集合通信和MatMul计算融合、并行的算子,统称为通算融合算子(简称MC2算子),包括AllGatherMatmul、AlltoAllAllGatherBatchMatMul、BatchMatMulReduceScatterAlltoAll、MatmulAllReduce、MatmulAllReduceAddRmsNorm、MatmulReduceScatter等。调用该类算子API时,一般会涉及多线程和HCCL(Huawei Collective Communication Library,集合通信库),因此CMake文件需要额外导入如下内容,否则无法成功编译。 | 59 | + |
| 61 | - | ||
| 62 | - ``` | ||
| 63 | - # 设置链接的库文件路径 | ||
| 64 | - find_package(Threads REQUIRED) | ||
| 65 | - target_link_libraries(opapi_test PRIVATE | ||
| 66 | - ${ASCEND_PATH}/lib64/libascendcl.so | ||
| 67 | - ${ASCEND_PATH}/lib64/librasopbase.so | ||
| 68 | - ${ASCEND_PATH}/lib64/libopapi_math.so | ||
| 69 | - ${ASCEND_PATH}/lib64/libopapi_ras.so | ||
| 70 | - ${ASCEND_PATH}/lib64/libhccl.so # 集合通信库文件 | ||
| 71 | - ${CMAKE_THREAD_LIBS_INIT}) # 多线程依赖的库文件 | ||
| 72 | - ``` | ||
| 73 | - 其中“find_package(Threads REQUIRED)”是CMake用于查找线程库的命令,可自动链接线程库依赖的头文件或间接依赖的库文件。 | ||
| 74 | - | ||
| 75 | ## 编译与运行 | 60 | ## 编译与运行 |
| 76 | 61 | ||
| 77 | 1. 提前准备好算子的调用代码(\*.cpp)和编译脚本(CMakeLists.txt)。 | 62 | 1. 提前准备好算子的调用代码(\*.cpp)和编译脚本(CMakeLists.txt)。 |
| @@ -106,7 +91,7 @@ | |||
| 106 | ./opapi_test | 91 | ./opapi_test |
| 107 | ``` | 92 | ``` |
| 108 | 93 | ||
| 109 | - 以AddMatMul算子的运行结果为例,运行后的结果示例如下: | 94 | + 以AddExample算子的运行结果为例,运行后的结果示例如下: |
| 110 | 95 | ||
| 111 | ``` | 96 | ``` |
| 112 | result[0] is: 1.200000 | 97 | result[0] is: 1.200000 |
| @@ -15,16 +15,61 @@ CANN Simulator是一款面向算子开发场景的SoC级芯片仿真工具,用 | |||
| 15 | * 工具推荐环境配置:CPU 16核,内存32GB以上。 | 15 | * 工具推荐环境配置:CPU 16核,内存32GB以上。 |
| 16 | * 本文中举例路径均需要确保运行用户具有读或读写权限。 | 16 | * 本文中举例路径均需要确保运行用户具有读或读写权限。 |
| 17 | * 出于安全性和权限最小化考虑,建议使用普通用户权限执行本工具,避免使用root等高权限账户。 | 17 | * 出于安全性和权限最小化考虑,建议使用普通用户权限执行本工具,避免使用root等高权限账户。 |
| 18 | -* 本工具依赖CANN软件包,在使用前请先安装CANN软件包,无需安装赖驱动和固件,并通过source命令执行CANN的set_env.sh环境变量文件。为确保安全,执行source命令后请勿修改set_env.sh中涉及的环境变量。 | 18 | +* 本工具依赖CANN软件包,在使用前请先安装CANN软件包,无需安装驱动和固件,并通过source命令执行CANN的set_env.sh环境变量文件。为确保安全,执行source命令后请勿修改set_env.sh中涉及的环境变量。 |
| 19 | * 用户应遵循最小权限原则,例如,给工具输入的文件要求other用户不可写,在一些对安全要求更严格的功能场景下还需确保输入的文件group用户不可写。 | 19 | * 用户应遵循最小权限原则,例如,给工具输入的文件要求other用户不可写,在一些对安全要求更严格的功能场景下还需确保输入的文件group用户不可写。 |
| 20 | * 本工具为开发工具,不建议在生产环境使用。 | 20 | * 本工具为开发工具,不建议在生产环境使用。 |
| 21 | * 工具的仿真功能仅支持单卡场景,无法仿真多卡环境,代码中只能设置为0卡。若修改可见卡号,将导致仿真失败。 | 21 | * 工具的仿真功能仅支持单卡场景,无法仿真多卡环境,代码中只能设置为0卡。若修改可见卡号,将导致仿真失败。 |
| 22 | * 仿真环境仅支持AI Core计算类算子(不支持MC2和HCCL类型的算子)。 | 22 | * 仿真环境仅支持AI Core计算类算子(不支持MC2和HCCL类型的算子)。 |
| 23 | +CANN Simulator工具目前处于尝鲜版本阶段,仅支持Ascend950PR芯片,建议仿真器运行环境配置为16核CPU和32GB以上内存。 | ||
| 23 | * 目前不支持arm环境仿真。 | 24 | * 目前不支持arm环境仿真。 |
| 24 | 25 | ||
| 25 | ## 环境准备 | 26 | ## 环境准备 |
| 26 | 27 | ||
| 27 | -CANN Simulator集成在CANN toolkit包里,参考[环境部署](../context/quick_install.md)中的软件包安装 -> 安装社区版CANN toolkit包章节 | 28 | +CANN Simulator集成在CANN toolkit包里,参考[环境部署](../install/quick_install.md)中的软件包安装 -> 安装社区版CANN toolkit包章节 |
| 29 | + | ||
| 30 | +# 快速开始 | ||
| 31 | + | ||
| 32 | +下面以[add_examples](../../../examples/add_example/)为例,对算子仿真进行详细说明 | ||
| 33 | + | ||
| 34 | +## 算子编译 | ||
| 35 | + | ||
| 36 | +* 参考[算子调用](../invocation/quick_op_invocation.md)完成add_example的算子编译和安装 | ||
| 37 | + | ||
| 38 | +```bash | ||
| 39 | +# 说明:进入项目根目录,执行如下编译命令,命令仅供参考,详细可以查看算子调用的说明。 | ||
| 40 | +bash build.sh --pkg --soc=Ascend950 --vendor_name=custom --ops=add_example | ||
| 41 | +# 安装自定义算子包 | ||
| 42 | +./build_out/cann-ops-ras-${vendor_name}_linux-${arch}.run | ||
| 43 | +``` | ||
| 44 | + | ||
| 45 | +* 参考[aclnn调用](../invocation/quick_op_invocation.md#aclnn调用)完成test_aclnn_add_example.cpp的编译,编出可执行文件test_aclnn_add_example | ||
| 46 | + | ||
| 47 | +## 执行仿真命令 | ||
| 48 | + | ||
| 49 | +```bash | ||
| 50 | +cannsim record ./test_aclnn_add_example -s Ascend950 --gen-report | ||
| 51 | +``` | ||
| 52 | + | ||
| 53 | +仿真工具执行日志文件在examples/add_example/examples/build/bin/cannsim_*目录,执行日志文件为 cannsim.log。 | ||
| 54 | + | ||
| 55 | +从仿真工具日志文件可以看到示例中的打印信息: | ||
| 56 | + | ||
| 57 | +```bash | ||
| 58 | +mean result[0] is: 2.000000 | ||
| 59 | +mean result[1] is: 2.000000 | ||
| 60 | +mean result[2] is: 2.000000 | ||
| 61 | +... | ||
| 62 | +``` | ||
| 63 | + | ||
| 64 | +## 查看性能流水 | ||
| 65 | + | ||
| 66 | +仿真性能流水文件在本项目`examples/add_example/examples/build/bin/cannsim_*/report`目录,流水相关文件为: | ||
| 67 | + | ||
| 68 | +```bash | ||
| 69 | +trace_core0.json | ||
| 70 | +``` | ||
| 71 | + | ||
| 72 | +在Chrome浏览器中输入“chrome://tracing”地址,并将生成的指令流水图文件(trace_core0.json)拖到空白处打开,具体参数介绍参考“仿真结果解析”章节。 | ||
| 28 | 73 | ||
| 29 | # 仿真执行 | 74 | # 仿真执行 |
| 30 | 75 | ||
| @@ -45,8 +90,9 @@ cannsim record [options] user_app --user_options | |||
| 45 | |-s <value> 或 --soc_version <value> [options]参数 | 必选 | 指定模拟目标芯片版本(如:Ascend950)。| | 90 | |-s <value> 或 --soc_version <value> [options]参数 | 必选 | 指定模拟目标芯片版本(如:Ascend950)。| |
| 46 | |-o <value> 或 --output <value> [options]参数 | 可选| 生成文件所在路径,可配置为绝对路径或者相对路径,并且执行工具的用户需要具有读写权限。如果未指定路径,则默认在当前目录下保存数据。| | 91 | |-o <value> 或 --output <value> [options]参数 | 可选| 生成文件所在路径,可配置为绝对路径或者相对路径,并且执行工具的用户需要具有读写权限。如果未指定路径,则默认在当前目录下保存数据。| |
| 47 | |-g 或 --gen-report[options]参数 | 可选 | 启用仿真完成后是否进行自动解析,并生成分析报告。默认不自动解析。| | 92 | |-g 或 --gen-report[options]参数 | 可选 | 启用仿真完成后是否进行自动解析,并生成分析报告。默认不自动解析。| |
| 48 | -|user_app|必选|算子可执行文件。| | 93 | +|-n 或 --core-id | 可选 | 仿真期间启用日志的AI Core,格式同 report -n:'all'、'0-2,12-14'、'5'。默认全开;配合 -g 且未指定时回退到 core 0。| |
| 49 | ---user_options|可选|算子可执行文件的运行参数。| | 94 | +|-u 或 --user-option | 可选 | 用户自定义算子参数,以命令行选项形式传递给算子程序。| |
| 95 | +|user_app|必选|待运行的算子程序或命令(如 ./app, python train.py, bash run.sh)。| | ||
| 50 | 96 | ||
| 51 | ## 使用示例 | 97 | ## 使用示例 |
| 52 | 98 | ||
| @@ -6,7 +6,39 @@ | |||
| 6 | 6 | ||
| 7 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 | 7 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 |
| 8 | 8 | ||
| 9 | -常见调试方法如下: | 9 | +### 1、Host侧日志获取方式 |
| 10 | + | ||
| 11 | +* **plog获取** | ||
| 12 | + | ||
| 13 | + 程序执行结束后,默认可在"$HOME/ascendc/log"下查看,host日志文件存储路径如下: | ||
| 14 | + | ||
| 15 | + ```bash | ||
| 16 | + $HOME/ascend/log/debug/plog/plog-pid_*.log | ||
| 17 | + ``` | ||
| 18 | + | ||
| 19 | + 开启环境变量ASCEND_SLOG_PRINT_TO_STDOUT可以将log日志直接打屏显示(1:开启打屏,0:关闭打屏),配置示例如下: | ||
| 20 | + | ||
| 21 | + ```bash | ||
| 22 | + export ASCEND_SLOG_PRINT_TO_STDOUT=1 | ||
| 23 | + ``` | ||
| 24 | + | ||
| 25 | + 日志相关介绍参见[《日志参考》](https://hiascend.com/document/redirect/CannCommunitylogref),环境变量介绍参见[《环境变量参考》](https://hiascend.com/document/redirect/CannCommunityEnvRef)。 | ||
| 26 | + | ||
| 27 | +* **aclnn异常错误信息获取** | ||
| 28 | + | ||
| 29 | + 通过aclGetRecentErrMsg接口(参见[《acl API(C)》](https://hiascend.com/document/redirect/CannCommunityCppApi))获取aclnn接口调用过程中的异常信息,使用方法如下: | ||
| 30 | + | ||
| 31 | + ```bash | ||
| 32 | + printf(aclGetRecentErrMsg()); | ||
| 33 | + ``` | ||
| 34 | + | ||
| 35 | + 打印错误信息样例如下: | ||
| 36 | + | ||
| 37 | + ```bash | ||
| 38 | + [PID:646612] 2026-01-24-11:53:44.671.727 AclNN_Parameter_Error(EZ1001): Expected a proper Tensor but got null for argument addmmTennsor.self. | ||
| 39 | + ``` | ||
| 40 | + | ||
| 41 | +### 2、Kernel调试 | ||
| 10 | 42 | ||
| 11 | * **printf** | 43 | * **printf** |
| 12 | 44 | ||
| @@ -36,7 +68,11 @@ | |||
| 36 | 68 | ||
| 37 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 | 69 | 算子运行过程中,如果出现算子执行失败、精度异常等问题,可以打印各阶段信息,如Kernel中间结果,进行问题分析和定位。 |
| 38 | 70 | ||
| 39 | -常见调试方法如下: | 71 | +### 1、Host侧日志获取方式 |
| 72 | + | ||
| 73 | + 见AI Core算子[Host侧日志获取方式](#1host侧日志获取方式)。 | ||
| 74 | + | ||
| 75 | +### 2、Kernel调试 | ||
| 40 | 76 | ||
| 41 | * **KERNEL\_LOG宏** | 77 | * **KERNEL\_LOG宏** |
| 42 | 78 | ||
| @@ -122,7 +158,7 @@ | |||
| 122 | 158 | ||
| 123 | ### 方式二(针对Ascend 950PR/Ascend 950DT系列产品) | 159 | ### 方式二(针对Ascend 950PR/Ascend 950DT系列产品) |
| 124 | 160 | ||
| 125 | -算子开发过程中,如果出现执行精度下降、内存占用异常等问题,可以通过[CANN Simulator](./cann_simulator.md)仿真工具分析算子的指令流水情况,从而确定问题根源,并针对性地优化。 | 161 | +算子开发过程中,如果出现执行精度下降、内存占用异常等问题,可以通过[CANN Simulator](./cann_sim.md)仿真工具分析算子的指令流水情况,从而确定问题根源,并针对性地优化。 |
| 126 | 162 | ||
| 127 | 本章以[AddExample自定义算子](../../../examples/add_example)为例,主要介绍仿真工具的使用。如何通过仿真工具进行精度和性能调优。 | 163 | 本章以[AddExample自定义算子](../../../examples/add_example)为例,主要介绍仿真工具的使用。如何通过仿真工具进行精度和性能调优。 |
| 128 | 164 | ||
| @@ -142,5 +178,5 @@ | |||
| 142 | trace_core0.json | 178 | trace_core0.json |
| 143 | ``` | 179 | ``` |
| 144 | 180 | ||
| 145 | -3. 在Chrome浏览器中输入“chrome://tracing”地址,并将生成的指令流水图文件(trace_core0.json)拖到空白处打开,具体参数介绍参考CANN Simulator中[“仿真结果解析”](./cann_simulator.md/#仿真结果解析)章节。 | 181 | +3. 在Chrome浏览器中输入“chrome://tracing”地址,并将生成的指令流水图文件(trace_core0.json)拖到空白处打开,具体参数介绍参考CANN Simulator中[“仿真结果解析”](./cann_sim.md#仿真结果解析)章节。 |
| 146 | 182 | ||
| @@ -24,7 +24,7 @@ | |||
| 24 | ## 工程创建 | 24 | ## 工程创建 |
| 25 | **1. 环境部署** | 25 | **1. 环境部署** |
| 26 | 26 | ||
| 27 | -开发算子前,请先参考[环境部署](../context/quick_install.md)完成基础环境搭建。 | 27 | +开发算子前,请先参考[环境部署](../install/quick_install.md)完成基础环境搭建。 |
| 28 | 28 | ||
| 29 | **2. 目录创建** | 29 | **2. 目录创建** |
| 30 | 30 | ||
| @@ -34,7 +34,7 @@ | |||
| 34 | 34 | ||
| 35 | ```bash | 35 | ```bash |
| 36 | # 创建指定算子目录,如bash build.sh --genop=examples/add_example | 36 | # 创建指定算子目录,如bash build.sh --genop=examples/add_example |
| 37 | -# ${op_class}表示算子类型,如matmul类。 | 37 | +# ${op_class}表示算子类型,如reliability类。 |
| 38 | # ${op_name}表示算子名的小写下划线形式,如`AddExample`算子对应为add_example。 | 38 | # ${op_name}表示算子名的小写下划线形式,如`AddExample`算子对应为add_example。 |
| 39 | bash build.sh --genop=${op_class}/${op_name} | 39 | bash build.sh --genop=${op_class}/${op_name} |
| 40 | ``` | 40 | ``` |
| @@ -353,7 +353,7 @@ __aicore__ inline void AddExample<T>::Process() | |||
| 353 | 353 | ||
| 354 | 以`AddExample`算子为例,假设开发交付件在`examples`目录,完整代码参见[add_example](../../../examples/add_example)目录。 | 354 | 以`AddExample`算子为例,假设开发交付件在`examples`目录,完整代码参见[add_example](../../../examples/add_example)目录。 |
| 355 | 355 | ||
| 356 | - > 说明:编译过程依赖第三方开源软件,联网场景会自动下载,离线编译场景需要自行安装,具体参考[离线编译](../context/build_offline.md)。 | 356 | + > 说明:编译过程依赖第三方开源软件,联网场景会自动下载,离线编译场景需要自行安装,具体参考[离线编译](../install/compile.md#未联网编译)。 |
| 357 | 357 | ||
| 358 | ```bash | 358 | ```bash |
| 359 | # 编译指定算子,如--ops=add_example | 359 | # 编译指定算子,如--ops=add_example |
| @@ -22,7 +22,7 @@ | |||
| 22 | ## 工程创建 | 22 | ## 工程创建 |
| 23 | **1. 环境部署** | 23 | **1. 环境部署** |
| 24 | 24 | ||
| 25 | -开发算子前,请先参考[环境部署](../context/quick_install.md)完成基础环境搭建。 | 25 | +开发算子前,请先参考[环境部署](../install/quick_install.md)完成基础环境搭建。 |
| 26 | 26 | ||
| 27 | **2. 目录创建** | 27 | **2. 目录创建** |
| 28 | 28 | ||
| @@ -32,7 +32,7 @@ | |||
| 32 | 32 | ||
| 33 | ```bash | 33 | ```bash |
| 34 | # 创建指定算子目录,如bash build.sh --genop_aicpu=examples/add_example | 34 | # 创建指定算子目录,如bash build.sh --genop_aicpu=examples/add_example |
| 35 | -# ${op_class}表示算子类型,如matmul类。 | 35 | +# ${op_class}表示算子类型,如reliability类。 |
| 36 | # ${op_name}表示算子名的小写下划线形式,如`AddExample`算子对应为add_example。 | 36 | # ${op_name}表示算子名的小写下划线形式,如`AddExample`算子对应为add_example。 |
| 37 | bash build.sh --genop_aicpu=${op_class}/${op_name} | 37 | bash build.sh --genop_aicpu=${op_class}/${op_name} |
| 38 | ``` | 38 | ``` |
| @@ -0,0 +1,466 @@ | |||
| 1 | +# 算子跨平台迁移指导 | ||
| 2 | + | ||
| 3 | +本指南介绍算子在多平台间迁移的适配要点与方案。以算子从Atlas A2系列迁移至Ascend 950系列为例,对比硬件架构差异项及所涉适配点,并提供相关算子适配样例。 | ||
| 4 | + | ||
| 5 | +## 一、硬件架构及规格参数对比 | ||
| 6 | + | ||
| 7 | +### Atlas A2系列硬件架构 | ||
| 8 | + | ||
| 9 | +<div align="center"> | ||
| 10 | + <img src="../figures/Atlas A2硬件架构.png" width="900" alt="Atlas A2硬件架构" /> | ||
| 11 | +</div> | ||
| 12 | + | ||
| 13 | +### Ascend 950系列硬件架构 | ||
| 14 | + | ||
| 15 | +<div align="center"> | ||
| 16 | + <img src="../figures/Ascend 950硬件架构.png" width="900" alt="Ascend 950硬件架构" /> | ||
| 17 | +</div> | ||
| 18 | + | ||
| 19 | +### 代际规格参数对比 | ||
| 20 | + | ||
| 21 | +通常根据不同的应用场景、工艺或硬件配置划分为多个产品型号,各型号在性能、资源配置等方面可能存在一定差异。为便于说明与直接对比,本节选择代表性配置作为参数展示与差异解析对象,其他相关调整请以实际手册或官方发布为准。 | ||
| 22 | + | ||
| 23 | +<table> | ||
| 24 | + <tr> | ||
| 25 | + <th colspan="2" style="width: 25%;">规格项</th> | ||
| 26 | + <th style="width:37.5%;">Atlas A2</th> | ||
| 27 | + <th style="width:37.5%;">Ascend 950</th> | ||
| 28 | + </tr> | ||
| 29 | + <tr> | ||
| 30 | + <td rowspan="4">AICore</td> | ||
| 31 | + <td>核数</td> | ||
| 32 | + <td>24</td> | ||
| 33 | + <td>32</td> | ||
| 34 | + </tr> | ||
| 35 | + <tr> | ||
| 36 | + <td>频率</td> | ||
| 37 | + <td>1.8</td> | ||
| 38 | + <td>1.65</td> | ||
| 39 | + </tr> | ||
| 40 | + <tr> | ||
| 41 | + <td>Cube算力规格</td> | ||
| 42 | + <td>353T/376T @BF16,FP16</td> | ||
| 43 | + <td>426T@BF16,FP16 757T@FP8,HIFP8,MXFP8,INT8 1514T@MXFP4</td> | ||
| 44 | + </tr> | ||
| 45 | + <tr> | ||
| 46 | + <td>Vector算力规格(FP16)</td> | ||
| 47 | + <td>23.5T</td> | ||
| 48 | + <td>54T</td> | ||
| 49 | + </tr> | ||
| 50 | + <tr> | ||
| 51 | + <td rowspan="2">Memory</td> | ||
| 52 | + <td>Memory容量(GB)</td> | ||
| 53 | + <td>64</td> | ||
| 54 | + <td>128</td> | ||
| 55 | + </tr> | ||
| 56 | + <tr> | ||
| 57 | + <td>Memory带宽</td> | ||
| 58 | + <td>1.6TB/s</td> | ||
| 59 | + <td>1.6TB/s</td> | ||
| 60 | + </tr> | ||
| 61 | +</table> | ||
| 62 | + | ||
| 63 | +## 二、硬件能力变更引入适配点 | ||
| 64 | + | ||
| 65 | +<table> | ||
| 66 | + <tr> | ||
| 67 | + <th style="width: 25%;">硬件单元</th> | ||
| 68 | + <th style="width:35%;">硬件能力变更</th> | ||
| 69 | + <th style="width:40%;">典型影响范围</th> | ||
| 70 | + </tr> | ||
| 71 | + <tr> | ||
| 72 | + <td rowspan="5">搬运单元</td> | ||
| 73 | + <td>删除L1到GM的数据通路</td> | ||
| 74 | + <td>依赖L1直接回写GM的kernel需改为L1→UB→GM或L0C/FIXPIPE→GM路径;相关DataCopy链路、事件同步与缓冲规划需调整</td> | ||
| 75 | + </tr> | ||
| 76 | + <tr> | ||
| 77 | + <td>删除GM到L0A、L0B的数据通路</td> | ||
| 78 | + <td>GM→L0A/L0B直连不再可用,需通过GM→L1→L0A/L0B完成;L1切块策略和MTE1/2流水需重构</td> | ||
| 79 | + </tr> | ||
| 80 | + <tr> | ||
| 81 | + <td>ND DMA灵活数据搬运,支持随路ND->NZ转换</td> | ||
| 82 | + <td>可用ND2NZ/DN2NZ在MTE2阶段完成格式转换,减少中间buffer和格式转换开销;需关注步长、对齐与NZ形状映射</td> | ||
| 83 | + </tr> | ||
| 84 | + <tr> | ||
| 85 | + <td>支持Cube->Vector高效内部数据通路:L1<->UB、L0C->UB、FIXP->UB</td> | ||
| 86 | + <td>可在UB侧做中间累加/激活/融合(如切K累加、后处理),减少GM往返;对应同步与管线切分需调整</td> | ||
| 87 | + </tr> | ||
| 88 | + <tr> | ||
| 89 | + <td>引入集合通信加速器CCU1.0</td> | ||
| 90 | + <td>通算融合算子在Eager模式下调整HcclServerType;在Graph模式下改用CCU系列GE接口</td> | ||
| 91 | + </tr> | ||
| 92 | + <tr> | ||
| 93 | + <td rowspan="3">计算单元</td> | ||
| 94 | + <td>Vector新增Regbase范式</td> | ||
| 95 | + <td>原依赖Membase的访存pattern、对齐方式、寄存器数量假设等需要重新审查;模板/tiling可能需要更新到Regbase版本</td> | ||
| 96 | + </tr> | ||
| 97 | + <tr> | ||
| 98 | + <td>Cube不再支持int4_t</td> | ||
| 99 | + <td>所有使用int4_t的算子需要切换到支持的数据类型(如int8),并更新量化解算逻辑</td> | ||
| 100 | + </tr> | ||
| 101 | + <tr> | ||
| 102 | + <td>不支持4:2稀疏矩阵计算</td> | ||
| 103 | + <td>原依赖4:2稀疏特性提速的kernel需要改为稠密或其他支持的稀疏策略,并更新性能预期说明</td> | ||
| 104 | + </tr> | ||
| 105 | + <tr> | ||
| 106 | + <td rowspan="1">存储单元</td> | ||
| 107 | + <td>Local Buffer内存改进:Cube L0C 256KB、Vector UB 256KB</td> | ||
| 108 | + <td>更大L0C/UB允许增大基本块与双缓冲容量,减少切K/切块轮次;需重新评估L1/L0/UB配比与tile尺寸</td> | ||
| 109 | + </tr> | ||
| 110 | + <tr> | ||
| 111 | + <td rowspan="2">其他</td> | ||
| 112 | + <td>多核同时访问Global Memory同地址性能优化</td> | ||
| 113 | + <td>涉及矩阵乘相关算子的模板可优化</td> | ||
| 114 | + </tr> | ||
| 115 | + <tr> | ||
| 116 | + <td>SIMT</td> | ||
| 117 | + <td>SIMT引入后可用线程级并行处理分支/不规则计算,但需要适配线程划分、共享内存与同步语义;部分Vector实现可迁移为SIMT版本</td> | ||
| 118 | + </tr> | ||
| 119 | +</table> | ||
| 120 | + | ||
| 121 | +## 三、推荐迁移步骤 | ||
| 122 | + | ||
| 123 | +1. 确认算子涉及的计算单元(Cube/Vector)和对应单元支持的数据类型是否在平台间存在差异。 | ||
| 124 | +2. 确认涉及的数据搬运单元(ND->NZ、GM<->Lx、集合通信等)是否在平台间存在差异。 | ||
| 125 | +3. 按硬件能力变更点逐项对照修改(Vector架构、Cube支持数据类型、L1/L0/UB大小、CCU通信等)。 | ||
| 126 | +4. 参考算子迁移样例调整/补齐Atlas A2/Ascend 950分支逻辑。 | ||
| 127 | + | ||
| 128 | +## 四、算子迁移样例 | ||
| 129 | + | ||
| 130 | +### Cube矩阵计算类算子 | ||
| 131 | + | ||
| 132 | +#### Global Memory同地址访问冲突优化 | ||
| 133 | + | ||
| 134 | +Ascend 950硬件新增同地址请求并行处理特性,不需要在各种分核场景额外规避同地址访问冲突。迁移时可将Atlas A2上为“错位规避冲突”设计的分核策略简化为更规则的滑动窗口模板(如行组窗口+列向往返扫描),减少无效偏移与冗余地址变换。实践中建议先以功能等价为目标保留原tile尺寸,再逐步放开分核约束,结合profiling数据观察MAC利用率、MTE2利用率、L2命中率等关键指标,确认模板调整是否带来稳定收益。 | ||
| 135 | + | ||
| 136 | +<div align="center"> | ||
| 137 | + <img src="../figures/SWAT滑动窗口模板.png" width="900" alt="SWAT滑动窗口模板" /> | ||
| 138 | +</div> | ||
| 139 | + | ||
| 140 | +#### Tile尺寸大小调整 | ||
| 141 | + | ||
| 142 | +Atlas A2上L0C大小为128KB,Ascend 950提升到256KB,意味着单次可承载更大的累加结果块。迁移时可优先增大Tile块切分粒度或提高K方向单轮处理深度,以减少切块与切K轮次,降低循环控制和搬运开销。同时需要重新平衡L1/L0/UB容量预算,避免L0C放大后挤压A/B/scale缓冲导致流水断点。 | ||
| 143 | + | ||
| 144 | +### Vector向量计算类算子 | ||
| 145 | + | ||
| 146 | +#### SIMT | ||
| 147 | + | ||
| 148 | +Ascend 950系列新增了SIMT单元。SIMT在处理非规整离散访问方面相比SIMD有较大优势,适合地址不连续、访存跨度变化大、分支路径不一致的场景(如scatter/gather、索引重排、稀疏更新等)。 | ||
| 149 | + | ||
| 150 | +迁移时建议优先识别“访存主导”且“向量化效率低”的算子子流程:若原有SIMD实现存在大量掩码分支、无效lane占比高、或需要复杂地址拼装,可将该部分改写为SIMT路径,通常可降低控制开销并提升有效访存吞吐。 | ||
| 151 | + | ||
| 152 | +实践中需重点关注以下事项:一是线程任务切分要与数据稀疏性匹配,避免线程负载极不均衡;二是减少高频随机访存导致的流水空转,尽量在上游完成索引规整与分桶;三是将边界处理与主路径解耦,避免在热点循环中引入过多分支。建议在迁移后同时对比“纯SIMD实现”和“SIMD+SIMT混合实现”,按数据分布选择最优策略,而非固定单一路径。 | ||
| 153 | + | ||
| 154 | +**以gather_v2算子为例:SIMD与SIMT实现对比** | ||
| 155 | + | ||
| 156 | +gather_v2算子根据合轴后的尾轴为单位进行gather,因此模板选择的依据是:尾轴 ≤ 2048时走SIMT模板,尾轴 > 2048时走SIMD模板。因为尾轴小时,需要离散访问多个不连续的小块地址,simt效率高。以下对比两种实现的核心差异: | ||
| 157 | + | ||
| 158 | +**1. 编程模型差异** | ||
| 159 | + | ||
| 160 | +SIMD实现采用传统的向量化编程模型,需显式管理UB缓冲区和流水队列: | ||
| 161 | + | ||
| 162 | +```cpp | ||
| 163 | +// SIMD: 使用队列机制管理数据缓冲 | ||
| 164 | +TQueBind<QuePosition::VECIN, QuePosition::VECOUT, BUFFER_NUM> inQueue_; | ||
| 165 | +TBuf<QuePosition::VECCALC> indexBuf_; | ||
| 166 | + | ||
| 167 | +// SIMD: 逐行处理,显式搬运和同步 | ||
| 168 | +for (int64_t j = 0; j < rows; j++) { | ||
| 169 | + INDICES_T index = GetIndex(yIdx, indiceEndIdx); // 标量读取索引 | ||
| 170 | + int64_t xIndex = index * tilingData_->innerSize; | ||
| 171 | + DataCopyPad(xLocal[j * colsAlign], xGm[offset], dataCoptExtParams, dataCopyPadExtParams); // 批量连续数搬入 | ||
| 172 | +} | ||
| 173 | +inQueue_.EnQue<int8_t>(xLocal); // 入队等待输出 | ||
| 174 | +``` | ||
| 175 | + | ||
| 176 | +SIMT采用线程级并行模型,每个线程独立处理元素: | ||
| 177 | + | ||
| 178 | +```cpp | ||
| 179 | +// SIMT: 使用线程级并行,无需显式buffer管理 | ||
| 180 | +__simt_vf__ LAUNCH_BOUND(2048) void GatherSimt(...) { | ||
| 181 | + for (INDEX_SIZE_T index = Simt::GetThreadIdx(); | ||
| 182 | + index < currentCoreElements; | ||
| 183 | + index += Simt::GetThreadNum()) { // 线程跳跃式并行 | ||
| 184 | + // 每个线程独立计算单点索引并访问 | ||
| 185 | + INDEX_SIZE_T gatherI = Simt::UintDiv(yIndex, m0, shift0); | ||
| 186 | + INDICES_T indicesValue = indices[gatherI]; // 根据单点索引gatherI直接访问GM | ||
| 187 | + y[yIndex] = idxOutOfBound ? 0 : x[xIndex]; // 直接写回GM | ||
| 188 | + } | ||
| 189 | +} | ||
| 190 | +``` | ||
| 191 | + | ||
| 192 | +**2. 访存模式差异** | ||
| 193 | + | ||
| 194 | +| 特性 | SIMD实现 | SIMT实现 | | ||
| 195 | +|------|----------|----------| | ||
| 196 | +| 数据访问 | 通过DataCopyPad显式搬运到UB | 线程直接通过`__gm__`指针访问GM | | ||
| 197 | +| Buffer管理 | 需AllocTensor/EnQue/DeQue/FreeTensor | 无需显式buffer,硬件自动管理 | | ||
| 198 | +| 同步机制 | 显式事件同步(HardEvent::MTE2_V等) | 线程间隐式同步 | | ||
| 199 | + | ||
| 200 | +**3. 适用场景差异** | ||
| 201 | + | ||
| 202 | +SIMD适合连续访问大块地址的场景,通过向量化指令高效处理连续数据; | ||
| 203 | + | ||
| 204 | +SIMT适合离散访存,线程并行处理; | ||
| 205 | + | ||
| 206 | +#### Regbase | ||
| 207 | + | ||
| 208 | +Ascend 950系列引入了Regbase编程范式,相比传统的Membase(Vector API)编程,Regbase更接近底层硬件的寄存器操作,提供更精细的向量化控制能力。 | ||
| 209 | + | ||
| 210 | +**特点** | ||
| 211 | + | ||
| 212 | +- 使用`AscendC::MicroAPI`命名空间下的底层API | ||
| 213 | +- 直接操作寄存器`RegTensor<T>`而非显式管理UB缓冲队列 | ||
| 214 | +- 通过`MaskReg`实现灵活的元素级掩码控制 | ||
| 215 | + | ||
| 216 | +**与Membase编程模型对比** | ||
| 217 | + | ||
| 218 | +| 特性 | Membase(传统Vector API) | Regbase(MicroAPI) | | ||
| 219 | +|------|---------------------------|---------------------| | ||
| 220 | +| 数据载体 | `LocalTensor<T>` + Queue机制 | `RegTensor<T>`寄存器 | | ||
| 221 | +| 内存管理 | 显式Alloc/EnQue/DeQue/Free | 寄存器自动分配 | | ||
| 222 | +| 掩码控制 | 函数参数控制 | `MaskReg`寄存器控制 | | ||
| 223 | +| 数据搬运 | `DataCopy`/`DataCopyPad` | `MicroAPI::DataCopy` + 分发模式 | | ||
| 224 | + | ||
| 225 | +**代码示例** | ||
| 226 | + | ||
| 227 | +```cpp | ||
| 228 | +__simd_vf__ __aicore__ void GenIndexBuf(ubuf int32_t* helpAddr, int32_t colFactor) | ||
| 229 | +{ | ||
| 230 | + // 声明寄存器张量 | ||
| 231 | + AscendC::MicroAPI::RegTensor<int32_t> v0; | ||
| 232 | + AscendC::MicroAPI::RegTensor<int32_t> v1; | ||
| 233 | + AscendC::MicroAPI::RegTensor<int32_t> vd1; | ||
| 234 | + | ||
| 235 | + // 创建全量掩码 | ||
| 236 | + AscendC::MicroAPI::MaskReg preg = | ||
| 237 | + AscendC::MicroAPI::CreateMask<int32_t, AscendC::MicroAPI::MaskPattern::ALL>(); | ||
| 238 | + | ||
| 239 | + // 标量复制到寄存器 | ||
| 240 | + AscendC::MicroAPI::Duplicate(v1, colFactor, preg); | ||
| 241 | + // 生成序列 [0, 1, 2, ...] | ||
| 242 | + AscendC::MicroAPI::Arange(v0, 0); | ||
| 243 | + // 向量运算 | ||
| 244 | + AscendC::MicroAPI::Div(vd1, v0, v1, preg); | ||
| 245 | + AscendC::MicroAPI::Mul(vd2, vd1, v1, preg); | ||
| 246 | + AscendC::MicroAPI::Sub(vd3, v0, vd2, preg); | ||
| 247 | + // 寄存器数据写回UB | ||
| 248 | + AscendC::MicroAPI::DataCopy(helpAddr, vd3, preg); | ||
| 249 | +} | ||
| 250 | +``` | ||
| 251 | + | ||
| 252 | +```cpp | ||
| 253 | +// 动态掩码:处理尾部不完整数据 | ||
| 254 | +__simd_vf__ __aicore__ void GatherProcess(ubuf int8_t* curYAddr, uint16_t repeatimes, uint16_t computeSize) | ||
| 255 | +{ | ||
| 256 | + MicroAPI::RegTensor<int8_t> vregTemp; | ||
| 257 | + MicroAPI::MaskReg preg; | ||
| 258 | + | ||
| 259 | + for (uint16_t r = 0; r < repeatTimes; r++) { | ||
| 260 | + // 根据剩余元素数更新掩码 | ||
| 261 | + preg = MicroAPI::UpdateMask<int8_t>(sreg); | ||
| 262 | + // 创建地址偏移寄存器 | ||
| 263 | + MicroAPI::AddrReg offset = MicroAPI::CreateAddrReg<int8_t>(r, computeSize); | ||
| 264 | + MicroAPI::DataCopy(vregTemp, curXAddr, offset); | ||
| 265 | + // 带掩码的数据存储 | ||
| 266 | + MicroAPI::DataCopy(curYAddr, vregTemp, offset, preg); | ||
| 267 | + } | ||
| 268 | +} | ||
| 269 | +``` | ||
| 270 | + | ||
| 271 | +```cpp | ||
| 272 | +// 数据聚合 | ||
| 273 | +__VEC_SCOPE__ | ||
| 274 | +{ | ||
| 275 | + MicroAPI::RegTensor<uint32_t> indicesReg; | ||
| 276 | + MicroAPI::RegTensor<int32_t> vd0; | ||
| 277 | + | ||
| 278 | + for (uint16_t indices = 0; indices < indicesLoopNum; indices++) { | ||
| 279 | + // 加载索引(E2B分发模式:将标量广播到向量) | ||
| 280 | + MicroAPI::DataCopy<uint32_t, MicroAPI::LoadDist::DIST_E2B_B32>(indicesReg, indicesAddr); | ||
| 281 | + // 根据索引进行Gather数据聚合 | ||
| 282 | + MicroAPI::DataCopyGather(vd0, curXAddr, indicesReg, preg); | ||
| 283 | + // 数据块拷贝输出 | ||
| 284 | + MicroAPI::DataCopy<int32_t, MicroAPI::DataCopyMode::DATA_BLOCK_COPY>( | ||
| 285 | + curYAddr, vd0, blockStride, preg); | ||
| 286 | + } | ||
| 287 | +} | ||
| 288 | +``` | ||
| 289 | + | ||
| 290 | +**关键Regbase API说明** | ||
| 291 | + | ||
| 292 | +| API分类 | API名称 | 功能说明 | | ||
| 293 | +|---------|---------|----------| | ||
| 294 | +| 寄存器类型 | `RegTensor<T>` | 向量寄存器张量类型 | | ||
| 295 | +| 掩码类型 | `MaskReg` | 掩码寄存器类型 | | ||
| 296 | +| 掩码创建 | `CreateMask<T, Pattern>()` | 创建掩码(ALL/HALF等模式) | | ||
| 297 | +| 掩码更新 | `UpdateMask<T>(count)` | 根据剩余元素数动态更新掩码 | | ||
| 298 | +| 标量操作 | `Duplicate(reg, val, mask)` | 将标量值复制到寄存器所有元素 | | ||
| 299 | +| 序列生成 | `Arange(reg, start)` | 生成连续序列 | | ||
| 300 | +| 算术运算 | `Add/Sub/Mul/Div(dst, src1, src2, mask)` | 向量算术运算 | | ||
| 301 | +| 标量运算 | `Adds/Muls(dst, src, scalar, mask)` | 向量与标量运算 | | ||
| 302 | +| 类型转换 | `Cast<DT, ST>(dst, src, mask)` | 数据类型转换 | | ||
| 303 | +| 比较运算 | `Compare<T, CMPMODE>(mask, src1, src2, pred)` | 向量比较生成掩码 | | ||
| 304 | +| 数据加载 | `DataCopy<T, LoadDist>(reg, addr)` | 从UB加载到寄存器 | | ||
| 305 | +| 数据存储 | `DataCopy<T>(addr, reg, mask)` | 从寄存器存储到UB | | ||
| 306 | +| Gather | `DataCopyGather(dst, base, indices, mask)` | 根据索引收集数据 | | ||
| 307 | +| 地址偏移 | `CreateAddrReg<T>(loop, stride)` | 创建循环地址偏移寄存器 | | ||
| 308 | + | ||
| 309 | +**分发模式(LoadDist)说明** | ||
| 310 | + | ||
| 311 | +| 模式 | 说明 | 典型用途 | | ||
| 312 | +|------|------|----------| | ||
| 313 | +| `DIST_NORM` | 正常连续加载 | 连续数据处理 | | ||
| 314 | +| `DIST_UNPACK_B16` | 16位解包加载 | FP16/BF16转FP32 | | ||
| 315 | +| `DIST_BRC_B32/B16` | 广播加载 | 标量scale广播 | | ||
| 316 | +| `DIST_E2B_B32` | 标量到向量广播 | 索引值广播 | | ||
| 317 | + | ||
| 318 | +**迁移建议** | ||
| 319 | + | ||
| 320 | +1. 适合Regbase的场景:需要精细控制寄存器分配、复杂掩码逻辑、Gather/Scatter访存模式 | ||
| 321 | +2. 保留Membase的场景:简单的连续数据搬运和计算、双缓冲流水线 | ||
| 322 | +3. 混合使用:可在同一算子中结合两种范式,用Regbase处理核心计算逻辑,用Membase管理数据搬运 | ||
| 323 | + | ||
| 324 | +### Cube-Vector融合类算子 | ||
| 325 | + | ||
| 326 | +#### MTE数据搬运路径变化 | ||
| 327 | + | ||
| 328 | +Ascend 950新架构引入UB2L1 & L0C2UB间的直连通路,实现矩阵计算数据的快速搬移,旨在简化CV融合算子开发并提升性能。 | ||
| 329 | +<div align="center"> | ||
| 330 | + <img src="../figures/Ascend950新增CV直连通路.png" width="700" alt="Ascend950新增CV直连通路" /> | ||
| 331 | +</div> | ||
| 332 | + | ||
| 333 | +**矩阵搬入** | ||
| 334 | + | ||
| 335 | +启用UB至L1(UB2L1)直连通路,通过DataCopy接口,支持融合算子的向量计算结果直接搬入L1。 | ||
| 336 | + | ||
| 337 | +**矩阵搬出** | ||
| 338 | + | ||
| 339 | +启用L0C至UB(L0C2UB)直连通路,通过DataCopy接口,支持融合算子的矩阵计算结果直接搬入UB进行后续向量计算。 | ||
| 340 | + | ||
| 341 | +对于切K或多阶段融合场景,可将“L0C搬回GM再读回UB”改为“L0C直达UB累加/后处理”,降低GM往返带宽压力和时延。迁移时建议把中间结果归并、激活/量化前处理放到UB侧完成,并显式梳理MTE1/MTE2/MTE3与计算单元的事件同步顺序,确保跨单元流水连续,避免由于新增通路引入数据可见性或同步时序问题。关键开启接口定义可参考: | ||
| 342 | + | ||
| 343 | +```cpp | ||
| 344 | +// 1. 新增: 搬入接口增加UB2L1的Nd2Nz搬入,支持Src&Dst都是LocalTensor的形式 | ||
| 345 | +template <typename T> | ||
| 346 | +__aicore__ inline void DataCopy(const LocalTensor<T>& dst, const LocalTensor<T>& src, const Nd2NzParams& intriParams); | ||
| 347 | + | ||
| 348 | +// 2. 新增: 搬出接口增加L0C2UB的搬出,支持直接从L0C搬出到UB,支持Src&Dst都是LocalTensor的形式 | ||
| 349 | +template <typename T, typename U, const FixpipeConfig& config = CFG_ROW_MAJOR> | ||
| 350 | +__aicore__ inline void Fixpipe(const LocalTensor<T>& dst, const LocalTensor<U>& src, const FixpipeParamsC310<config.format>& intriParams); | ||
| 351 | +template <CO2Layout format = CO2Layout::ROW_MAJOR> | ||
| 352 | +struct FixpipeParamsC310 { | ||
| 353 | + // ... | ||
| 354 | + uint8_t dualDstCtl = 0; | ||
| 355 | +}; | ||
| 356 | + | ||
| 357 | +// 3. 能力增强: 核间同步接口新增模式3 | ||
| 358 | +template <uint8_t modeId, pipe_t pipe> | ||
| 359 | +__aicore__ inline void CrossCoreSetFlag(uint16_t flagId) | ||
| 360 | +template <uint8_t modeId = 0, pipe_t pipe = PIPE_S> | ||
| 361 | +__aicore__ inline void CrossCoreWaitFlag(uint16_t flagId) | ||
| 362 | + | ||
| 363 | +``` | ||
| 364 | + | ||
| 365 | +#### 核间同步信号量匹配 | ||
| 366 | + | ||
| 367 | +`CrossCoreSetFlag`和`CrossCoreWaitFlag`是核间同步信号量接口,广泛用于多核间的数据依赖与协同控制。本质上以“信号量”的方式实现不同AICore之间的数据处理阶段解耦与有序推进,常用于流水线控制、双缓冲切换、跨核协作等场景。 | ||
| 368 | + | ||
| 369 | +- `CrossCoreSetFlag`:当前核(或线程)在完成某个阶段的数据处理后,主动设置指定的flag信号,告知依赖方(一般是其它核或下游流水线阶段)本阶段已完成,可以继续执行后续流程。 | ||
| 370 | +- `CrossCoreWaitFlag`:当前核(或线程)需等待某个flag信号被设置(即依赖的数据或事件完成),检测flag后才会继续向下执行。 | ||
| 371 | + | ||
| 372 | +这套信号量的本质是保证多线程/多流水阶段间一致的同步序列,防止因资源未就绪或依赖没完成而发生数据竞争或死锁等硬件异常。详细的接口说明可参考官方文档:[CrossCoreSetFlag与CrossCoreWaitFlag核间同步接口详解](https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/900beta1/API/ascendcopapi/atlasascendc_api_07_0273.html)。 | ||
| 373 | + | ||
| 374 | +在Ascend 950上`CrossCoreWaitFlag`和`CrossCoreSetFlag`数量必须严格匹配,且建议在同一同步语义域内按“先生产后消费”的顺序成对设计。Atlas A2上算子与算子间若存在多余`CrossCoreSetFlag`信号量,HWTS会进行特殊处理清零计数器,Ascend 950系列为减少硬件开销,不再依赖该类兜底机制,要求单算子内核间同步信号量一一匹配,否则会出现必现卡死。 | ||
| 375 | + | ||
| 376 | +迁移时请重点排查以下问题:其一,异常分支提前返回导致只执行`Set`未执行对应`Wait`(或反之);其二,多stage流水复用同一`flagId`但生命周期重叠,造成“跨阶段串扰”;其三,循环内条件触发同步但循环边界未对齐,导致迭代次数不一致。以上问题在Atlas A2上可能被掩盖,在Ascend 950上会直接暴露为阻塞超时或死锁。对跨核流水较复杂的算子,可先构建最小数据集进行单stage验证,再逐步叠加双缓冲和多stage,以降低定位同步问题的复杂度。 | ||
| 377 | + | ||
| 378 | +### 集合通信类算子 | ||
| 379 | + | ||
| 380 | +Ascend 950引入集合通信加速器CCU1.0,降低了访存需求,减少了调度时延,为有效利用该特性,将算子跨片通信方式由A2的AICPU改为CCU通信。 | ||
| 381 | + | ||
| 382 | +**Eager模式** | ||
| 383 | + | ||
| 384 | +在aclnn两段式接口中的第二段接口中,为算子执行器aclOpExecutor指定集合通信类型。 | ||
| 385 | + | ||
| 386 | +以[MatmulAllReduce](https://gitcode.com/cann/ops-transformer/tree/master/mc2/matmul_all_reduce)算子迁移适配为例: | ||
| 387 | +设置NnopbaseSetHcclServerType枚举值,A2为NNOPBASE_HCCL_SERVER_AICPU,950为NNOPBASE_HCCL_SERVER_TYPE_CCU。 | ||
| 388 | + | ||
| 389 | +```CPP | ||
| 390 | +// ... | ||
| 391 | +aclnnStatus aclnnMatmulAllReduce( | ||
| 392 | + void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, const aclrtStream stream) | ||
| 393 | +{ | ||
| 394 | + // ... | ||
| 395 | + if (NnopbaseSetHcclServerType) { | ||
| 396 | + if (op::GetCurrentPlatformInfo().GetCurNpuArch() == NpuArch::DAV_3510) { | ||
| 397 | + NnopbaseSetHcclServerType(executor, NnopbaseHcclServerType::NNOPBASE_HCCL_SERVER_TYPE_CCU); | ||
| 398 | + } | ||
| 399 | + } | ||
| 400 | + // ... | ||
| 401 | + return ACLNN_SUCCESS; | ||
| 402 | +} | ||
| 403 | +``` | ||
| 404 | + | ||
| 405 | +**Graph模式** | ||
| 406 | + | ||
| 407 | +1. 用于资源计算与申请,涉及附属流相关信息的CalcParamFunc回调接口中,为GE的上下文context区分附属流的集合通信类型。 | ||
| 408 | +2. 用于设置主流/附属流上自定义任务、参数定制的GenerateTask回调接口中,区分两套GE的KernelLaunch接口,分别调用AICPU通信或CCU通信的创建及定制流程。 | ||
| 409 | + | ||
| 410 | +静态图GE侧创建通信task的任务类型,A2为aicpu kfc server + kfc_stream;950为ccu server + ccu_stream。涉及代码文件:[matmul_all_reduce_gen_task.cpp](https://gitcode.com/cann/ops-transformer/blob/master/mc2/matmul_all_reduce/op_graph/matmul_all_reduce_gen_task.cpp) | ||
| 411 | + | ||
| 412 | +```CPP | ||
| 413 | +// ... | ||
| 414 | +ge::Status MatmulAllReduceCalcParamFunc(gert::ExeResGenerationContext *context) | ||
| 415 | +{ | ||
| 416 | + if (Mc2GenTaskOpsUtils::IsTargetPlatformNpuArch(context->GetNodeName(), NPUARCH_A5)) { | ||
| 417 | + // 950 | ||
| 418 | + return Mc2GenTaskOpsUtils::CommonKFCMc2CalcParamFunc(context, "ccu server", "ccu_stream"); | ||
| 419 | + } | ||
| 420 | + // A2 | ||
| 421 | + return Mc2GenTaskOpsUtils::CommonKFCMc2CalcParamFunc(context, "aicpu kfc server", "kfc_stream"); | ||
| 422 | +} | ||
| 423 | +// ... | ||
| 424 | +``` | ||
| 425 | + | ||
| 426 | +静态图GenTask调用接口有区别,流程有差异。涉及代码文件:[matmul_all_reduce_gen_task.cpp](https://gitcode.com/cann/ops-transformer/blob/master/mc2/matmul_all_reduce/op_graph/matmul_all_reduce_gen_task.cpp) | ||
| 427 | + | ||
| 428 | +```CPP | ||
| 429 | +// ... | ||
| 430 | +// A2 | ||
| 431 | +ge::Status MatmulAllReduceGenTaskOpsUtils::MatmulAllReduceGenTaskCallback( | ||
| 432 | + const gert::ExeResGenerationContext *context, std::vector<std::vector<uint8_t>>& tasks) { | ||
| 433 | + // ... | ||
| 434 | + // aicpu task | ||
| 435 | + ge::KernelLaunchInfo aicpu_task = | ||
| 436 | + ge::KernelLaunchInfo::CreateAicpuKfcTask(context, SO_NAME.c_str(), KERNEL_NAME_V1.c_str()); | ||
| 437 | + // ... | ||
| 438 | +} | ||
| 439 | + | ||
| 440 | +// 950 | ||
| 441 | +ge::Status Mc2Arch35GenTaskOpsUtils::Mc2Arch35GenTaskCallBack(const gert::ExeResGenerationContext *context, std::vector<std::vector<uint8_t>> &tasks) { | ||
| 442 | + // ... | ||
| 443 | + // ccu task | ||
| 444 | + ge::KernelLaunchInfo ccuTask = ge::KernelLaunchInfo::CreateCcuTask(context, ccuGroups); | ||
| 445 | + // ... | ||
| 446 | +} | ||
| 447 | + | ||
| 448 | +ge::Status MatmulAllReduceGenTaskFunc(const gert::ExeResGenerationContext *context, std::vector<std::vector<uint8_t>> &tasks) | ||
| 449 | +{ | ||
| 450 | + if (Mc2GenTaskOpsUtils::IsTargetPlatformNpuArch(context->GetNodeName(), NPUARCH_A5)) { | ||
| 451 | + // 950 | ||
| 452 | + return Mc2Arch35GenTaskOpsUtils::Mc2Arch35GenTaskCallBack(context, tasks); | ||
| 453 | + } | ||
| 454 | + // A2 | ||
| 455 | + return MatmulAllReduceGenTaskOpsUtils::MatmulAllReduceGenTaskCallback(context, tasks); | ||
| 456 | +} | ||
| 457 | +// ... | ||
| 458 | +``` | ||
| 459 | + | ||
| 460 | +## 五、常见问题与性能调优建议(FAQ/性能小贴士) | ||
| 461 | + | ||
| 462 | +若算子在Ascend 950上性能不升反降时,可优先排查: | ||
| 463 | + | ||
| 464 | +1. 是否仍然使用Atlas A2的错位分核模板 | ||
| 465 | +2. 是否未开启CCU通信仍走AICPU | ||
| 466 | +3. tiling是否沿用了Atlas A2的L1/L0/UB切分策略,导致Ascend 950更大的片上缓存未被充分利用 | ||
| @@ -37,8 +37,9 @@ bash build.sh --help | |||
| 37 | | --ops | 可选 | 指定待编译的算子,如:mat_mul_v3,mse_loss,多个算子用英文逗号“,”分隔,不可与--ophost、--opapi、--opgraph同时使用。 | | 37 | | --ops | 可选 | 指定待编译的算子,如:mat_mul_v3,mse_loss,多个算子用英文逗号“,”分隔,不可与--ophost、--opapi、--opgraph同时使用。 | |
| 38 | | --soc | 可选 | 指定NPU型号,每次编译只支持1个NPU型号。 | | 38 | | --soc | 可选 | 指定NPU型号,每次编译只支持1个NPU型号。 | |
| 39 | | --jit | 可选 | 配置后,表示不编译算子的二进制文件。 | | 39 | | --jit | 可选 | 配置后,表示不编译算子的二进制文件。 | |
| 40 | +| --static | 可选 | 配置后,表示生成静态库文件,包含libcann_ras_static.a和aclnn接口头文件,搭配--pkg参数,生成静态库压缩包。| | ||
| 40 | | --vendor_name | 可选 | 指定自定义算子包的名称,默认值为custom。 | | 41 | | --vendor_name | 可选 | 指定自定义算子包的名称,默认值为custom。 | |
| 41 | -| --build-type | 可选 | 启用调试模式。可选类型:Release/Debug,默认为Release。值为Debug时,不可与--mssanitizer、--oom同时使用。 | | 42 | +| --build-type | 可选 | 启用调试模式。可选类型:Release/Debug,默认为Release。值为Debug时,不可与--mssanitizer、--oom、--dump_cce同时使用。 | |
| 42 | | --cov | 可选 | 启用覆盖率统计。 | | 43 | | --cov | 可选 | 启用覆盖率统计。 | |
| 43 | | --noexec | 可选 | 仅编译单元测试二进制文件,不自动执行编译后的UT可执行文件。 | | 44 | | --noexec | 可选 | 仅编译单元测试二进制文件,不自动执行编译后的UT可执行文件。 | |
| 44 | | --opkernel | 可选 | 编译二进制内核。 | | 45 | | --opkernel | 可选 | 编译二进制内核。 | |
| @@ -54,6 +55,7 @@ bash build.sh --help | |||
| 54 | | --genop | 可选 | 创建AI Core自定义算子初始目录。 | | 55 | | --genop | 可选 | 创建AI Core自定义算子初始目录。 | |
| 55 | | --genop_aicpu | 可选 | 创建AI CPU自定义算子初始目录。 | | 56 | | --genop_aicpu | 可选 | 创建AI CPU自定义算子初始目录。 | |
| 56 | | --experimental | 可选 | 编译experimental目录下的用户算子。 | | 57 | | --experimental | 可选 | 编译experimental目录下的用户算子。 | |
| 57 | -| --mssanitizer | 可选 | 开启kernel侧mssanitizer内存检测功能。不可与--oom同时使用。 | | 58 | +| --mssanitizer | 可选 | 开启kernel侧mssanitizer内存检测功能。不可与--oom、--dump_cce同时使用。 | |
| 58 | -| --oom | 可选 | 开启kernel侧oom内存检测功能。不可与--mssanitizer同时使用。 | | 59 | +| --oom | 可选 | 开启kernel侧oom内存检测功能。不可与--mssanitizer、--dump_cce同时使用。 | |
| 60 | +| --dump_cce | 可选 | 开启kernel侧dump预编译文件功能。不可与--mssanitizer、--oom同时使用。 | | ||
| 59 | | --cann_3rd_lib_path| 可选 | 离线编译场景下第三方库存放的目录。 | | 61 | | --cann_3rd_lib_path| 可选 | 离线编译场景下第三方库存放的目录。 | |
| @@ -0,0 +1,266 @@ | |||
| 1 | +# 源码构建 | ||
| 2 | + | ||
| 3 | +源码构建前,请参考本项目README完成环境准备和源码下载,此处不再赘述。 | ||
| 4 | + | ||
| 5 | +## 安装第三方依赖 | ||
| 6 | + | ||
| 7 | +> **说明**:对于CANNLab或Docker环境,默认联网,编译过程中会自动下载第三方依赖,无需手动安装,可跳过本章操作。 | ||
| 8 | + | ||
| 9 | +本项目编译过程依赖的第三方开源软件列表如下: | ||
| 10 | + | ||
| 11 | +| 开源软件 | 版本 | 下载地址 | | ||
| 12 | +|---|---|---| | ||
| 13 | +| json | 3.11.3 | [include.zip](https://gitcode.com/cann-src-third-party/json/releases/download/v3.11.3/include.zip) | | ||
| 14 | +| makeself | 2.5.0 | [makeself-release-2.5.0-patch1.tar.gz](https://gitcode.com/cann-src-third-party/makeself/releases/download/release-2.5.0-patch1.0/makeself-release-2.5.0-patch1.tar.gz) | | ||
| 15 | +| eigen | 5.0.0 | [eigen-5.0.0.tar.gz](https://gitcode.com/cann-src-third-party/eigen/releases/download/5.0.0-h0.trunk/eigen-5.0.0.tar.gz) | | ||
| 16 | +| protobuf | 25.1.0 | [protobuf-25.1.tar.gz](https://gitcode.com/cann-src-third-party/protobuf/releases/download/v25.1/protobuf-25.1.tar.gz) | | ||
| 17 | +| abseil-cpp | 20230802.1 | [abseil-cpp-20230802.1.tar.gz](https://gitcode.com/cann-src-third-party/abseil-cpp/releases/download/20230802.1/abseil-cpp-20230802.1.tar.gz) | | ||
| 18 | +| opbase(自CANN 9.0.0及以后版本需要下载) | master | [opbase](https://gitcode.com/cann/opbase) | | ||
| 19 | +| cann-cmake | master-015 | [cmake-master-015.tar.gz](https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/cmake/cmake-master-015.tar.gz) | | ||
| 20 | + | ||
| 21 | +若您的编译环境可以访问网络,请参考[联网编译](#联网编译),编译脚本会自动联网下载第三方软件。否则,请参考[未联网编译](#未联网编译)手动下载第三方软件。 | ||
| 22 | + | ||
| 23 | +准备好开源第三方软件后,可采用如下编译方式,请按需选择: | ||
| 24 | + | ||
| 25 | +- **自定义算子包**: | ||
| 26 | + | ||
| 27 | + 选择部分算子编译生成的包称为自定义算子包,以**挂载**形式作用于CANN包,不改变原始包内容。生成的自定义算子包优先级高于原始CANN包。该包支持aclnn和图模式调用AI Core、AI CPU算子。 | ||
| 28 | + | ||
| 29 | +- **ops-ras包**: | ||
| 30 | + | ||
| 31 | + 选择整个项目编译生成的包称为ops-ras包,可**完整替换**CANN包对应部分。该包支持aclnn和图模式调用AI Core算子。 | ||
| 32 | + | ||
| 33 | +- **ops-ras静态库**: | ||
| 34 | + | ||
| 35 | + > 说明:若您需要**基于本项目进行二次发布**并且对**软件包大小有要求**时,建议采用静态库编译,该库可以链接您的应用开发程序,仅保留业务所需的算子,从而实现软件最小化部署。 | ||
| 36 | + | ||
| 37 | + 表示整个项目编译为一个静态库文件,包含libcann_ras_static.a和aclnn接口头文件。该包仅支持aclnn调用AI Core算子。 | ||
| 38 | + | ||
| 39 | +## 联网编译 | ||
| 40 | + | ||
| 41 | +若在有互联网的环境下编译,编译过程中会自动安装第三方依赖,无需手动安装。不同场景下源码编译和部署命令如下: | ||
| 42 | + | ||
| 43 | +### 自定义算子包 | ||
| 44 | + | ||
| 45 | +1. **编译自定义算子包** | ||
| 46 | + | ||
| 47 | + 进入项目根目录,执行如下编译命令: | ||
| 48 | + | ||
| 49 | + ```bash | ||
| 50 | + bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] [-j${n}] | ||
| 51 | + # 以AddExample算子编译为例 | ||
| 52 | + # bash build.sh --pkg --soc=ascend910b --ops=add_example -j16 | ||
| 53 | + # 编译experimental贡献目录下的用户算子(以AddExample算子为例,编译时请以实际贡献算子为准) | ||
| 54 | + # bash build.sh --pkg --experimental --soc=ascend910b --ops=add_example -j16 | ||
| 55 | + ``` | ||
| 56 | + | ||
| 57 | + - --soc:\$\{soc\_version\}表示NPU型号。Atlas A2 训练系列产品/Atlas A2 推理系列产品使用"ascend910b"(默认),Atlas A3 训练系列产品/Atlas A3 推理系列产品使用"ascend910_93",Ascend 950PR/Ascend 950DT产品使用"ascend950"。 | ||
| 58 | + - --vendor_name(可选):\$\{vendor\_name\}表示构建的自定义算子包名,默认名为custom。 | ||
| 59 | + - --ops(可选):\$\{op\_list\}表示待编译算子,不指定时默认编译所有算子。格式形如"add_example,crypto,...",多算子之间用英文逗号","分隔。 | ||
| 60 | + - --experimental(可选):表示编译用户保存在experimental贡献目录下的算子。 | ||
| 61 | + - -j(可选):指定编译线程数,加快编译速度。 | ||
| 62 | + | ||
| 63 | + 若\$\{vendor\_name\}和\$\{op\_list\}都不传入编译的是ops-ras包;若编译所有算子的自定义算子包,需传入\$\{vendor\_name\}。当提示如下信息,说明编译成功。 | ||
| 64 | + | ||
| 65 | + ```bash | ||
| 66 | + Self-extractable archive "cann-ops-ras-${vendor_name}_linux-${arch}.run" successfully created. | ||
| 67 | + ``` | ||
| 68 | + | ||
| 69 | + 编译成功后,run包存放于项目根目录的build_out目录下。 | ||
| 70 | + | ||
| 71 | +2. **安装自定义算子包** | ||
| 72 | + | ||
| 73 | + ```bash | ||
| 74 | + ./build_out/cann-ops-ras-${vendor_name}_linux-${arch}.run | ||
| 75 | + ``` | ||
| 76 | + | ||
| 77 | + 自定义算子包默认安装路径为```${ASCEND_HOME_PATH}/opp/vendors```,\$\{ASCEND\_HOME\_PATH\}已通过环境变量配置,表示CANN toolkit包安装路径,一般为\$\{install\_path\}/cann。 | ||
| 78 | + | ||
| 79 | + > 说明:可通过配置--install-path=\$\{install\_path\}参数定义算子包安装目录,在使用自定义算子包前,需执行source \$\{install_path\}/vendors/${vendor_name}/bin/set_env.bash命令,set\_env.bash脚本将自定义算子包安装路径追加到环境变量ASCEND\_CUSTOM\_OPP\_PATH中,使自定义算子包在当前环境中生效。 | ||
| 80 | + | ||
| 81 | +3. **(可选)卸载自定义算子包。** | ||
| 82 | + | ||
| 83 | + 自定义算子包安装后在```${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_ras/scripts```目录会生成`uninstall.sh`,通过该脚本可卸载自定义算子包,命令如下: | ||
| 84 | + | ||
| 85 | + ```bash | ||
| 86 | + bash ${ASCEND_HOME_PATH}/opp/vendors/${vendor_name}_ras/scripts/uninstall.sh | ||
| 87 | + ``` | ||
| 88 | + | ||
| 89 | +### ops-ras包 | ||
| 90 | + | ||
| 91 | +> **说明**:全量编译会构建仓库内全部算子,耗时较长,与机器配置、`-j` 并行度及是否联网下载第三方依赖有关;日常开发请优先使用单算子编译(`--ops=<算子名>`)。 | ||
| 92 | + | ||
| 93 | +1. **编译ops-ras包** | ||
| 94 | + | ||
| 95 | + 进入项目根目录,执行如下编译命令: | ||
| 96 | + | ||
| 97 | + ```bash | ||
| 98 | + # 编译除experimental目录外的所有算子 | ||
| 99 | + bash build.sh --pkg [--jit] --soc=${soc_version} [-j${n}] | ||
| 100 | + # 编译experimental目录下的所有算子 | ||
| 101 | + # bash build.sh --pkg --experimental [--jit] --soc=${soc_version} [-j${n}] | ||
| 102 | + ``` | ||
| 103 | + | ||
| 104 | + - --soc:\$\{soc\_version\}表示NPU型号。Atlas A2 训练系列产品/Atlas A2 推理系列产品使用"ascend910b"(默认),Atlas A3 训练系列产品/Atlas A3 推理系列产品使用"ascend910_93",Ascend 950PR/Ascend 950DT产品使用"ascend950"。 | ||
| 105 | + - --jit(可选):设置后表示不编译算子二进制文件,如需使用aclnn调用算子,该选项无需设置。 | ||
| 106 | + - --experimental(可选):表示编译用户保存在experimental目录下的算子。 | ||
| 107 | + - -j(可选):指定编译线程数,加快编译速度。 | ||
| 108 | + | ||
| 109 | + 若提示如下信息,说明编译成功。 | ||
| 110 | + | ||
| 111 | + ```bash | ||
| 112 | + Self-extractable archive "cann-${soc_name}-ops-ras_${cann_version}_linux-${arch}.run" successfully created. | ||
| 113 | + ``` | ||
| 114 | + | ||
| 115 | + \$\{soc\_name\}表示NPU型号名称,即\$\{soc\_version\}删除"ascend"后剩余的内容。编译成功后,run包存放于build_out目录下。 | ||
| 116 | + | ||
| 117 | +2. **安装ops-ras包** | ||
| 118 | + | ||
| 119 | + ```bash | ||
| 120 | + # 安装命令 | ||
| 121 | + ./build_out/cann-${soc_name}-ops-ras_${cann_version}_linux-${arch}.run --full --install-path=${install_path} | ||
| 122 | + ``` | ||
| 123 | + | ||
| 124 | + \$\{install\_path\}:表示指定安装路径,需要与toolkit包安装在相同路径,默认安装在`/usr/local/Ascend`目录。 | ||
| 125 | + | ||
| 126 | +3. **(可选)卸载ops-ras包** | ||
| 127 | + | ||
| 128 | + ```bash | ||
| 129 | + # 卸载命令 | ||
| 130 | + ./${install_path}/cann/share/info/ops_ras/script/uninstall.sh | ||
| 131 | + ``` | ||
| 132 | + | ||
| 133 | +### ops-ras静态库 | ||
| 134 | + | ||
| 135 | +> 说明:静态库仅支持Atlas A2、Atlas A3系列产品。experimental算子暂不支持使用静态库。 | ||
| 136 | + | ||
| 137 | +1. **编译ops-ras静态库** | ||
| 138 | + | ||
| 139 | + 进入项目根目录,执行如下编译命令: | ||
| 140 | + | ||
| 141 | + ```bash | ||
| 142 | + bash build.sh --pkg --static --soc=${soc_version} [-j${n}] | ||
| 143 | + ``` | ||
| 144 | + | ||
| 145 | + - --soc:\$\{soc\_version\}表示NPU型号。Atlas A2系列产品使用"ascend910b"(默认),Atlas A3系列产品使用"ascend910_93"。 | ||
| 146 | + - -j(可选):指定编译线程数,加快编译速度。 | ||
| 147 | + 若提示如下信息,说明编译并压缩成功。 | ||
| 148 | + | ||
| 149 | + ```bash | ||
| 150 | + [SUCCESS] Build static lib success! | ||
| 151 | + Successfully created compressed package: ${repo_path}/build_out/cann-${soc_name}-ops-ras-static_${cann_version}_linux-${arch}.tar.gz | ||
| 152 | + ``` | ||
| 153 | + | ||
| 154 | + \$\{repo\_path\}表示项目根目录,\$\{soc\_name\}表示NPU型号名称,即\$\{soc\_version\}删除"ascend"后剩余的内容。编译成功后,压缩包存放于build_out目录下。 | ||
| 155 | + | ||
| 156 | +2. **解压ops-ras静态库** | ||
| 157 | + | ||
| 158 | + 进入build_out目录执行解压命令: | ||
| 159 | + | ||
| 160 | + ```bash | ||
| 161 | + tar -zxvf ./cann-${soc_name}-ops-ras-static_${cann_version}_linux-${arch}.tar.gz -C ${static_lib_path} | ||
| 162 | + ``` | ||
| 163 | + | ||
| 164 | + \$\{static\_lib\_path\}表示静态库解压路径。解压后目录结构如下: | ||
| 165 | + | ||
| 166 | + ```text | ||
| 167 | + ├── cann-${soc_name}-ops-ras-static_${cann_version}_linux-${arch} | ||
| 168 | + │ ├── lib64 | ||
| 169 | + │ │ ├── libcann_ras_static.a # 静态库文件 | ||
| 170 | + │ └── include | ||
| 171 | + | ├── ... # aclnn接口头文件 | ||
| 172 | + ``` | ||
| 173 | + | ||
| 174 | +## 未联网编译 | ||
| 175 | + | ||
| 176 | +若在没有连接互联网的环境下编译,需要提前准备好依赖的第三方软件,再进行源码编译。具体过程如下: | ||
| 177 | + | ||
| 178 | +1. **下载第三方依赖** | ||
| 179 | + | ||
| 180 | + 在联网环境中提前下载第三方软件,目前有如下方式,请按需选择: | ||
| 181 | + | ||
| 182 | + - 方式1:根据[第三方软件依赖](#安装第三方依赖)提供的表格手动下载,若从其他地址下载,请确保版本号一致。 | ||
| 183 | + | ||
| 184 | +2. **编译算子包** | ||
| 185 | + | ||
| 186 | + 将下载好的第三方软件上传至离线环境,可存放在`third_party`目录或自定义目录下。**推荐前者,其编译命令与联网编译场景下的命令一致。** | ||
| 187 | + | ||
| 188 | + - **third\_party目录**(推荐) | ||
| 189 | + | ||
| 190 | + 请在本项目根目录创建`third_party`目录(若有则无需创建),将第三方软件拷贝到该指定目录。此时编译命令与联网编译命令一致,具体参考[联网编译](#联网编译)。 | ||
| 191 | + | ||
| 192 | + - **自定义目录** | ||
| 193 | + | ||
| 194 | + 在离线环境的任意位置新建`${cann_3rd_lib_path}`目录,将第三方软件拷贝到该目录,请确保该目录有权限访问。 | ||
| 195 | + | ||
| 196 | + ```bash | ||
| 197 | + mkdir -p ${cann_3rd_lib_path} | ||
| 198 | + ``` | ||
| 199 | + | ||
| 200 | + 此时编译命令需在联网编译命令基础上额外增加`--cann_3rd_lib_path=${cann_3rd_lib_path}`用于指定第三方软件所在路径。假设存放路径为`/path/cann_3rd_lib_path`,不同编译方式对应的命令如下: | ||
| 201 | + | ||
| 202 | + - 自定义算子包 | ||
| 203 | + | ||
| 204 | + ```bash | ||
| 205 | + bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] --cann_3rd_lib_path=${cann_3rd_lib_path} | ||
| 206 | + # 以AddExample算子编译为例 | ||
| 207 | + # bash build.sh --pkg --soc=ascend910b --ops=add_example -j16 --cann_3rd_lib_path=/path/cann_3rd_lib_path | ||
| 208 | + ``` | ||
| 209 | + | ||
| 210 | + - ops-ras整包 | ||
| 211 | + | ||
| 212 | + ```bash | ||
| 213 | + bash build.sh --pkg [--jit] --soc=${soc_version} --cann_3rd_lib_path=${cann_3rd_lib_path} | ||
| 214 | + # bash build.sh --pkg --soc=ascend910b --cann_3rd_lib_path=/path/cann_3rd_lib_path | ||
| 215 | + ``` | ||
| 216 | + | ||
| 217 | + - ops-ras静态库 | ||
| 218 | + | ||
| 219 | + ```bash | ||
| 220 | + bash build.sh --pkg --static --soc=${soc_version} --cann_3rd_lib_path=${cann_3rd_lib_path} | ||
| 221 | + # bash build.sh --pkg --static --soc=ascend910b --cann_3rd_lib_path=/path/cann_3rd_lib_path | ||
| 222 | + ``` | ||
| 223 | + | ||
| 224 | +3. **安装/卸载算子包** | ||
| 225 | + | ||
| 226 | + 未联网和联网场景下编译得到算子包结果一样,默认存放于项目根目录build_out目录下,并且安装和卸载的操作命令也一样,具体参见[联网编译](#联网编译)。 | ||
| 227 | + | ||
| 228 | +## 本地验证 | ||
| 229 | + | ||
| 230 | +源码包部署后,可通过项目根目录build.sh执行UT用例,验证项目功能是否正常。 | ||
| 231 | + | ||
| 232 | +> 说明:执行UT用例依赖googletest单元测试框架,详细介绍参见[googletest官网](https://google.github.io/googletest/advanced.html#running-a-subset-of-the-tests)。 | ||
| 233 | + | ||
| 234 | +```bash | ||
| 235 | +# 安装根目录下test相关requirements.txt依赖 | ||
| 236 | +pip3 install -r tests/requirements.txt | ||
| 237 | +# 方式1: 编译并执行指定算子和对应功能的UT测试用例(选其一) | ||
| 238 | +bash build.sh -u --[opapi|ophost|opkernel] --ops=add_example | ||
| 239 | +# 方式2: 编译并执行所有的UT测试用例 | ||
| 240 | +# bash build.sh -u | ||
| 241 | +# 方式3: 编译所有的UT测试用例但不执行 | ||
| 242 | +# bash build.sh -u --noexec | ||
| 243 | +# 方式4: 编译并执行对应功能的UT测试用例(选其一) | ||
| 244 | +# bash build.sh -u --[opapi|ophost|opkernel] | ||
| 245 | +# 方式5: 编译对应功能的UT测试用例但不执行(选其一) | ||
| 246 | +# bash build.sh -u --noexec --[opapi|ophost|opkernel] | ||
| 247 | +# 方式6: 执行UT测试用例时可指定soc编译 | ||
| 248 | +# bash build.sh -u --[opapi|ophost|opkernel] [--soc=${soc_version}] | ||
| 249 | +``` | ||
| 250 | + | ||
| 251 | +以验证ophost功能是否正常为例,执行如下命令: | ||
| 252 | + | ||
| 253 | +```bash | ||
| 254 | +bash build.sh -u --ophost | ||
| 255 | +``` | ||
| 256 | + | ||
| 257 | +执行完成后出现如下内容,表示执行成功。 | ||
| 258 | + | ||
| 259 | +```bash | ||
| 260 | +Global Environment TearDown | ||
| 261 | +[==========] ${n} tests from ${m} test suites ran. (${x} ms total) | ||
| 262 | +[ PASSED ] ${n} tests. | ||
| 263 | +[100%] Built target ras_op_host_ut | ||
| 264 | +``` | ||
| 265 | + | ||
| 266 | +\$\{n\}表示执行了n个用例,\$\{m\}表示m项测试,\$\{x\}表示执行用例消耗的时间,单位为毫秒。 | ||
| @@ -0,0 +1,241 @@ | |||
| 1 | +# 项目目录 | ||
| 2 | + | ||
| 3 | +> 本章罗列的部分目录是可选的,请以实际交付件为准。尤其**单算子目录**,不同场景下交付件有差异,具体说明如下: | ||
| 4 | +> | ||
| 5 | +> - 若缺少op_host目录,可能是调用了其他算子op_host实现,调用逻辑参见该算子op_api目录下源码实现;如有需要,欢迎开发者参考[贡献指南](../../../CONTRIBUTING.md)补充贡献该算子。 | ||
| 6 | +> - 若缺少op_api目录,说明该算子暂不支持aclnn调用。 | ||
| 7 | +> - 若缺少op_graph或op_kernel目录,说明该算子暂不支持图模式调用或暂无Ascend C Kernel实现。 | ||
| 8 | + | ||
| 9 | +项目全量目录层级介绍如下: | ||
| 10 | + | ||
| 11 | +```text | ||
| 12 | +├── cmake # 项目工程编译目录 | ||
| 13 | +│ ├── modules # CMake Find模块目录 | ||
| 14 | +│ │ ├── FindOPBASE.cmake # OPBASE依赖查找 | ||
| 15 | +│ │ ├── Findaicpu.cmake # aicpu依赖查找 | ||
| 16 | +│ │ ├── Finddlog.cmake # dlog依赖查找 | ||
| 17 | +│ │ ├── Findmetadef.cmake # metadef依赖查找 | ||
| 18 | +│ │ ├── Findnnopbase.cmake # nnopbase依赖查找 | ||
| 19 | +│ │ ├── Findplatform.cmake # platform依赖查找 | ||
| 20 | +│ │ ├── Findruntime.cmake # runtime依赖查找 | ||
| 21 | +│ │ ├── Findsecurec.cmake # securec依赖查找 | ||
| 22 | +│ │ └── Findtilingapi.cmake # tilingapi依赖查找 | ||
| 23 | +│ ├── third_party # 第三方依赖CMake配置目录 | ||
| 24 | +│ │ ├── build # 第三方依赖构建目录(含patch等) | ||
| 25 | +│ │ ├── abseil-cpp.cmake # abseil-cpp依赖配置 | ||
| 26 | +│ │ ├── ascend_protobuf.cmake # protobuf依赖配置 | ||
| 27 | +│ │ ├── eigen.cmake # eigen依赖配置 | ||
| 28 | +│ │ ├── gtest.cmake # gtest依赖配置 | ||
| 29 | +│ │ ├── makeself-fetch.cmake # makeself获取配置 | ||
| 30 | +│ │ └── nlohmann_json.cmake # nlohmann_json依赖配置 | ||
| 31 | +│ ├── Third_Party_Open_Source_Software_List.yaml # 第三方开源软件清单 | ||
| 32 | +│ ├── aclnn_ops_ras.h.in # aclnn汇总头文件模板 | ||
| 33 | +│ ├── custom_kernel.cmake # 自定义Kernel编译配置 | ||
| 34 | +│ ├── dependencies.cmake # 项目依赖管理 | ||
| 35 | +│ ├── func.cmake # 公共CMake函数定义 | ||
| 36 | +│ ├── gen_ops_info.cmake # 算子信息生成脚本 | ||
| 37 | +│ ├── intf_pub_linux.cmake # Linux接口发布配置 | ||
| 38 | +│ ├── intf_pub_llt_gccnative.cmake # LLT GCC Native接口发布配置 | ||
| 39 | +│ ├── makeself_built_in.cmake # makeself内置配置 | ||
| 40 | +│ ├── makeself_custom.cmake # makeself自定义配置 | ||
| 41 | +│ ├── opbuild.cmake # 算子构建配置 | ||
| 42 | +│ ├── package.cmake # 打包配置 | ||
| 43 | +│ ├── runtimeKB.cmake # 运行时知识库配置 | ||
| 44 | +│ ├── static.cmake # 静态库编译配置 | ||
| 45 | +│ ├── symbol.cmake # 符号导出配置 | ||
| 46 | +│ ├── ut.cmake # UT测试编译配置 | ||
| 47 | +│ └── variables.cmake # 全局变量定义 | ||
| 48 | +├── common # 项目公共头文件和公共代码 | ||
| 49 | +│ ├── CMakeLists.txt | ||
| 50 | +│ ├── act # Activation相关公共实现 | ||
| 51 | +│ │ ├── epilogue # Epilogue处理(如反量化、SwishGLU量化等) | ||
| 52 | +│ │ ├── matmul # 矩阵乘相关实现(block、kernel、policy、tile) | ||
| 53 | +│ │ ├── prologue # Prologue处理(如Cast、广播等) | ||
| 54 | +│ │ └── utils # 公共工具(架构检测、坐标工具等) | ||
| 55 | +│ ├── inc # 公共头文件目录 | ||
| 56 | +│ │ ├── common # 公共定义 | ||
| 57 | +│ │ ├── err # 错误码定义 | ||
| 58 | +│ │ ├── fallback # Fallback相关 | ||
| 59 | +│ │ ├── framework # 框架适配头文件 | ||
| 60 | +│ │ ├── kernel # Kernel相关头文件 | ||
| 61 | +│ │ ├── op_api # op_api相关头文件 | ||
| 62 | +│ │ ├── op_graph # op_graph相关头文件 | ||
| 63 | +│ │ ├── op_host # op_host相关头文件 | ||
| 64 | +│ │ ├── op_kernel # op_kernel相关头文件 | ||
| 65 | +│ │ ├── tiling_base # Tiling基础头文件 | ||
| 66 | +│ │ ├── error_util.h # 错误处理工具头文件 | ||
| 67 | +│ │ ├── legacy_common_manager.h # 旧版公共管理器头文件 | ||
| 68 | +│ │ └── op_util.h # 算子工具头文件 | ||
| 69 | +│ ├── src # 公共代码目录 | ||
| 70 | +│ │ ├── framework # 框架适配实现 | ||
| 71 | +│ │ ├── op_host # op_host公共实现 | ||
| 72 | +│ │ └── legacy_common_manager.cpp # 旧版公共管理器实现 | ||
| 73 | +│ └── stub # Stub实现目录 | ||
| 74 | +│ ├── CMakeLists.txt | ||
| 75 | +│ ├── inc/framework # 框架Stub头文件 | ||
| 76 | +│ └── op_api # op_api Stub实现(aclnn_kernels、level0) | ||
| 77 | +├── reliability # RAS算子分类目录(可靠性、可用性、可维护性类算子) | ||
| 78 | +│ ├── CMakeLists.txt # reliability目录CMakeList入口 | ||
| 79 | +│ ├── ${op_name} # 算子工程目录,${op_name}表示算子名(小写下划线形式),如crypto、obfuscation_calculate、obfuscation_setup | ||
| 80 | +│ │ ├── CMakeLists.txt # 算子CMakeList入口 | ||
| 81 | +│ │ ├── docs # 算子文档目录 | ||
| 82 | +│ │ │ ├── aclnn${OpName}.md # 算子aclnn接口介绍文档,${OpName}表示算子名(大驼峰形式) | ||
| 83 | +│ │ │ └── aclnn${OpName}V2.md # 可选,V2版本接口文档 | ||
| 84 | +│ │ ├── op_host # Host侧实现 | ||
| 85 | +│ │ │ ├── CMakeLists.txt # Host侧CMakeList文件 | ||
| 86 | +│ │ │ ├── ${op_name}_aicpu_infershape.cpp # 可选,AI CPU场景下的InferShape实现 | ||
| 87 | +│ │ │ └── op_api # 算子aclnn实现文件目录 | ||
| 88 | +│ │ │ ├── aclnn_${op_name}.cpp # 算子aclnn接口实现文件 | ||
| 89 | +│ │ │ ├── aclnn_${op_name}.h # 算子aclnn接口实现头文件 | ||
| 90 | +│ │ │ ├── ${op_name}.cpp # 算子l0接口实现文件 | ||
| 91 | +│ │ │ └── ${op_name}.h # 算子l0接口实现头文件 | ||
| 92 | +│ │ └── tests # 算子测试用例目录 | ||
| 93 | +│ │ ├── CMakeLists.txt | ||
| 94 | +│ │ └── ut # UT测试用例 | ||
| 95 | +│ │ ├── CMakeLists.txt # UT用例CMakeList文件 | ||
| 96 | +│ │ └── op_host # op_host测试用例目录 | ||
| 97 | +│ │ ├── CMakeLists.txt | ||
| 98 | +│ │ ├── test_aclnn_${op_name}.cpp # 算子aclnn测试用例文件 | ||
| 99 | +│ │ └── test_${op_name}_infershape.cpp # 算子InferShape测试用例文件 | ||
| 100 | +│ └── ... | ||
| 101 | +├── docs # 项目相关文档目录 | ||
| 102 | +│ ├── QUICKSTART.md # 快速入门指南 | ||
| 103 | +│ ├── README.md # 文档总览 | ||
| 104 | +│ ├── en # 英文文档目录 | ||
| 105 | +│ └── zh # 中文文档目录 | ||
| 106 | +│ ├── context # 基础概念与上下文文档(数据类型、数据结构、目录结构等) | ||
| 107 | +│ ├── debug # 调试相关文档 | ||
| 108 | +│ ├── develop # 开发指南(AI Core、AI CPU、图开发) | ||
| 109 | +│ ├── figures # 文档图片资源 | ||
| 110 | +│ ├── invocation # 算子调用说明 | ||
| 111 | +│ ├── op_api_list.md # op_api接口列表 | ||
| 112 | +│ └── op_list.md # 算子列表 | ||
| 113 | +├── examples # 端到端算子开发和调用示例 | ||
| 114 | +│ ├── add_example # AI Core算子示例目录 | ||
| 115 | +│ │ ├── CMakeLists.txt # 算子编译配置文件 | ||
| 116 | +│ │ ├── README.md # 示例介绍文档 | ||
| 117 | +│ │ ├── examples # 算子使用示例目录 | ||
| 118 | +│ │ ├── op_graph # 算子构图相关目录 | ||
| 119 | +│ │ ├── op_host # 算子信息库、Tiling、InferShape相关实现目录 | ||
| 120 | +│ │ ├── op_kernel # 算子Kernel目录 | ||
| 121 | +│ │ └── tests # 算子测试用例目录 | ||
| 122 | +│ ├── add_example_aicpu # AI CPU算子示例目录 | ||
| 123 | +│ │ ├── CMakeLists.txt # 算子编译配置文件 | ||
| 124 | +│ │ ├── README.md # 示例介绍文档 | ||
| 125 | +│ │ ├── examples # 算子使用示例目录 | ||
| 126 | +│ │ ├── op_graph # 算子构图相关目录 | ||
| 127 | +│ │ ├── op_host # 算子信息库、InferShape相关实现 | ||
| 128 | +│ │ ├── op_kernel_aicpu # 算子Kernel目录 | ||
| 129 | +│ │ └── tests # 算子测试用例目录 | ||
| 130 | +│ ├── fast_kernel_launch_example # 轻量级,高性能的算子开发工程模板 | ||
| 131 | +│ │ ├── ascend_ops # 示例算子实现目录 | ||
| 132 | +│ │ ├── cmake # 构建相关cmake脚本目录 | ||
| 133 | +│ │ ├── CMakeLists.txt # 算子编译配置文件 | ||
| 134 | +│ │ ├── csrc # C/C++扩展源码目录 | ||
| 135 | +│ │ ├── README.md # 轻量级,高性能的算子开发工程说明资料 | ||
| 136 | +│ │ ├── requirements.txt | ||
| 137 | +│ │ ├── setup.py # 构建脚本 | ||
| 138 | +│ │ └── tests # 测试用例目录 | ||
| 139 | +│ ├── CMakeLists.txt | ||
| 140 | +│ └── README.md # 项目示例介绍文档 | ||
| 141 | +├── experimental # 用户自定义算子存放目录 | ||
| 142 | +│ └── reliability # 用户开发的reliability类算子目录 | ||
| 143 | +│ └── CMakeLists.txt | ||
| 144 | +├── scripts # 脚本目录,包含自定义算子、Kernel构建相关配置文件 | ||
| 145 | +│ ├── ci # CI持续集成脚本 | ||
| 146 | +│ │ ├── gen_ops_soc.py # 算子SoC信息生成脚本 | ||
| 147 | +│ │ └── ops_run_repackage.sh # 算子运行重打包脚本 | ||
| 148 | +│ ├── custom # 自定义算子安装脚本 | ||
| 149 | +│ │ ├── install.sh # 安装脚本 | ||
| 150 | +│ │ └── upgrade.sh # 升级脚本 | ||
| 151 | +│ ├── kernel # Kernel构建相关脚本 | ||
| 152 | +│ │ ├── binary_config # 二进制配置文件目录(ascendc_config.json等) | ||
| 153 | +│ │ └── binary_script # 二进制构建脚本目录(构建、打包、信息生成等) | ||
| 154 | +│ ├── opgen # 算子代码生成工具 | ||
| 155 | +│ │ ├── template # 算子工程模板(add_example、add_example_aicpu) | ||
| 156 | +│ │ └── opgen_standalone.py # 独立算子生成脚本 | ||
| 157 | +│ ├── package # 打包相关脚本 | ||
| 158 | +│ │ ├── common # 打包公共模块(配置、Python/Shell工具) | ||
| 159 | +│ │ ├── latest_manager # 最新版本管理脚本 | ||
| 160 | +│ │ ├── module # 打包模块定义 | ||
| 161 | +│ │ ├── ops_ras # ops-ras专属打包配置 | ||
| 162 | +│ │ └── package.py # 打包入口脚本 | ||
| 163 | +│ └── util # 构建工具脚本目录 | ||
| 164 | +│ ├── ascendc_bin_param_build.py # Ascend C二进制参数构建 | ||
| 165 | +│ ├── ascendc_gen_options.py # Ascend C编译选项生成 | ||
| 166 | +│ ├── ascendc_impl_build.py # Ascend C实现构建 | ||
| 167 | +│ ├── ascendc_ops_config.py # Ascend C算子配置 | ||
| 168 | +│ ├── ascendc_replay_build.py # Ascend C回放构建 | ||
| 169 | +│ ├── build_opp_kernel_static.py # OPP Kernel静态库构建 | ||
| 170 | +│ ├── code_channel_infer.py # 代码通道推导 | ||
| 171 | +│ ├── const_var.py # 常量变量定义 | ||
| 172 | +│ ├── dependency_parser.py # 依赖解析 | ||
| 173 | +│ ├── gen_version_info.sh # 版本信息生成 | ||
| 174 | +│ ├── generate_cpp_cov.sh # C++覆盖率生成 | ||
| 175 | +│ ├── get_opfile_from_opsinfo.py # 从算子信息获取文件 | ||
| 176 | +│ ├── insert_op_info.py # 插入算子信息 | ||
| 177 | +│ ├── insert_simplified_keys.py # 插入简化Key | ||
| 178 | +│ ├── kernel_entry.py # Kernel入口处理 | ||
| 179 | +│ ├── merge_aicpu_info_json.sh # 合并AI CPU信息JSON | ||
| 180 | +│ ├── merge_proto.py # 合并Proto文件 | ||
| 181 | +│ ├── modify_gen_aclnn_static.py # 修改aclnn静态库生成 | ||
| 182 | +│ ├── opdesc_parser.py # 算子描述解析 | ||
| 183 | +│ ├── parse_changed_files.py # 解析变更文件 | ||
| 184 | +│ ├── parse_compile_changed_files.py # 解析编译变更文件 | ||
| 185 | +│ ├── parse_ini_to_json.py # INI转JSON | ||
| 186 | +│ ├── replay_codegen.py # 回放代码生成 | ||
| 187 | +│ └── tiling_data_def_build.py # TilingData定义构建 | ||
| 188 | +├── tests # 项目级测试目录 | ||
| 189 | +│ ├── requirements.txt # 测试用例依赖的第三方组件 | ||
| 190 | +│ └── ut # UT用例工程 | ||
| 191 | +│ ├── CMakeLists.txt # UT工程的CMakeList脚本 | ||
| 192 | +│ ├── empty.cpp # 空文件,用于CMake编译占位 | ||
| 193 | +│ ├── common # UT工程中使用的公共代码 | ||
| 194 | +│ │ ├── CMakeLists.txt | ||
| 195 | +│ │ ├── any_value.h # 通用值类型工具 | ||
| 196 | +│ │ ├── infer_shape_context_faker.cpp/h # InferShape上下文Mock | ||
| 197 | +│ │ ├── infer_datatype_context_faker.cpp/h # InferDataType上下文Mock | ||
| 198 | +│ │ ├── infershape_test_util.cpp/h # InferShape测试工具 | ||
| 199 | +│ │ ├── tiling_context_faker.cpp/h # Tiling上下文Mock | ||
| 200 | +│ │ ├── tiling_parse_context_faker.cpp/h # Tiling解析上下文Mock | ||
| 201 | +│ │ ├── ut_op_common.cpp/h # UT公共测试用例 | ||
| 202 | +│ │ ├── ut_op_util.cpp/h # UT公共工具 | ||
| 203 | +│ │ └── ... | ||
| 204 | +│ ├── op_api # op_api测试工程 | ||
| 205 | +│ │ ├── CMakeLists.txt | ||
| 206 | +│ │ ├── op_api_ut_common # op_api UT公共模块 | ||
| 207 | +│ │ │ ├── inc # 公共头文件(tensor_desc、array_desc等) | ||
| 208 | +│ │ │ └── src # 公共实现 | ||
| 209 | +│ │ ├── stub # op_api测试Stub实现 | ||
| 210 | +│ │ └── ut_main.cpp # op_api测试入口 | ||
| 211 | +│ ├── op_host # op_host测试工程 | ||
| 212 | +│ │ ├── CMakeLists.txt | ||
| 213 | +│ │ └── test_op_host_main.cpp # op_host测试入口 | ||
| 214 | +│ ├── op_kernel # op_kernel测试工程 | ||
| 215 | +│ │ ├── CMakeLists.txt | ||
| 216 | +│ │ ├── data_utils.cpp/h # 数据工具 | ||
| 217 | +│ │ ├── scripts # 测试脚本(tiling头文件生成等) | ||
| 218 | +│ │ └── test_op_kernel_main.cpp # op_kernel测试入口 | ||
| 219 | +│ └── op_kernel_aicpu # op_kernel_aicpu测试工程 | ||
| 220 | +│ ├── CMakeLists.txt | ||
| 221 | +│ ├── stub # AI CPU测试Stub实现 | ||
| 222 | +│ ├── utils # AI CPU测试工具(文件读取、测试辅助等) | ||
| 223 | +│ └── test_op_kernel_aicpu_main.cpp # op_kernel_aicpu测试入口 | ||
| 224 | +├── third_party # 第三方依赖源码目录 | ||
| 225 | +│ ├── abseil-cpp # abseil-cpp库源码 | ||
| 226 | +│ ├── ascend_protobuf # protobuf库源码 | ||
| 227 | +│ └── pkg # 其他第三方依赖包 | ||
| 228 | +├── .clang-format # 代码格式化配置文件 | ||
| 229 | +├── CMakeLists.txt # 项目工程CMakeList入口 | ||
| 230 | +├── CONTRIBUTING.md # 项目贡献指南文件 | ||
| 231 | +├── LICENSE # 项目开源许可证信息 | ||
| 232 | +├── OAT.xml # 配置脚本,代码仓工具使用,用于检查License是否规范 | ||
| 233 | +├── README.md # 项目工程总介绍文档 | ||
| 234 | +├── SECURITY.md # 项目安全声明文件 | ||
| 235 | +├── Third_Party_Open_Source_Software_Notice # 第三方开源软件声明 | ||
| 236 | +├── build.sh # 项目工程编译脚本 | ||
| 237 | +├── classify_rule.yaml # 组件划分信息 | ||
| 238 | +├── install_deps.sh # 项目安装依赖包脚本 | ||
| 239 | +├── requirements.txt # 项目的第三方依赖包 | ||
| 240 | +└── version.info # 项目版本信息 | ||
| 241 | +``` | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | # 算子调用 | 1 | # 算子调用 |
| 2 | ## 前提条件 | 2 | ## 前提条件 |
| 3 | 3 | ||
| 4 | -- 环境部署:调用算子之前,请先参考[环境部署](../context/quick_install.md)完成基础环境搭建。 | 4 | +- 环境部署:调用算子之前,请先参考[环境部署](../install/quick_install.md)完成基础环境搭建。 |
| 5 | - 调用算子列表:项目可调用的算子参见[算子列表](../op_list.md),算子对应的aclnn接口参见[aclnn列表](../op_api_list.md)。 | 5 | - 调用算子列表:项目可调用的算子参见[算子列表](../op_list.md),算子对应的aclnn接口参见[aclnn列表](../op_api_list.md)。 |
| 6 | 6 | ||
| 7 | ## 编译执行 | 7 | ## 编译执行 |
| @@ -22,18 +22,18 @@ | |||
| 22 | 22 | ||
| 23 | 进入项目根目录,执行如下编译命令: | 23 | 进入项目根目录,执行如下编译命令: |
| 24 | 24 | ||
| 25 | - > **说明**:编译过程依赖第三方开源软件,联网场景会自动下载,离线编译场景需要自行安装,具体参考[离线编译](../context/build_offline.md)。 | 25 | + > **说明**:编译过程依赖第三方开源软件,联网场景会自动下载,离线编译场景需要自行安装,具体参考[离线编译](../install/compile.md#未联网编译)。 |
| 26 | 26 | ||
| 27 | ```bash | 27 | ```bash |
| 28 | bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] | 28 | bash build.sh --pkg --soc=${soc_version} [--vendor_name=${vendor_name}] [--ops=${op_list}] |
| 29 | - # 以TransposeBatchMatMul算子编译为例 | 29 | + # 以AddExample算子编译为例 |
| 30 | - # bash build.sh --pkg --soc=ascend910b --vendor_name=transpose_batch_mat_mul --ops=transpose_batch_mat_mul | 30 | + # bash build.sh --pkg --soc=ascend910b --vendor_name=add_example --ops=add_example |
| 31 | # 编译experimental贡献目录下的用户算子 | 31 | # 编译experimental贡献目录下的用户算子 |
| 32 | # bash build.sh --pkg --experimental --soc=ascend910b --ops=${experimental_op} | 32 | # bash build.sh --pkg --experimental --soc=ascend910b --ops=${experimental_op} |
| 33 | ``` | 33 | ``` |
| 34 | - --soc:\$\{soc\_version\}表示NPU型号。Atlas A2系列产品使用"ascend910b"(默认),Atlas A3系列产品使用"ascend910_93",Ascend 950PR/Ascend 950DT产品使用"ascend950"。 | 34 | - --soc:\$\{soc\_version\}表示NPU型号。Atlas A2系列产品使用"ascend910b"(默认),Atlas A3系列产品使用"ascend910_93",Ascend 950PR/Ascend 950DT产品使用"ascend950"。 |
| 35 | - --vendor_name(可选):\$\{vendor\_name\}表示构建的自定义算子包名,默认名为custom。 | 35 | - --vendor_name(可选):\$\{vendor\_name\}表示构建的自定义算子包名,默认名为custom。 |
| 36 | - - --ops(可选):\$\{op\_list\}表示待编译算子,不指定时默认编译所有算子。格式形如"transpose_batch_mat_mul,gemm,...",多算子之间用英文逗号","分隔。 | 36 | + - --ops(可选):\$\{op\_list\}表示待编译算子,不指定时默认编译所有算子。格式形如"add_example,...",多算子之间用英文逗号","分隔。 |
| 37 | - --experimental(可选):表示编译experimental贡献目录下的算子,${experimental_op}为新贡献算子目录名,贡献说明参见[贡献指南](../../../CONTRIBUTING.md)。 | 37 | - --experimental(可选):表示编译experimental贡献目录下的算子,${experimental_op}为新贡献算子目录名,贡献说明参见[贡献指南](../../../CONTRIBUTING.md)。 |
| 38 | 38 | ||
| 39 | 若\$\{vendor\_name\}和\$\{op\_list\}都不传入编译的是ops-ras包;若编译所有算子的自定义算子包,需传入\$\{vendor\_name\}。当提示如下信息,说明编译成功。 | 39 | 若\$\{vendor\_name\}和\$\{op\_list\}都不传入编译的是ops-ras包;若编译所有算子的自定义算子包,需传入\$\{vendor\_name\}。当提示如下信息,说明编译成功。 |
| @@ -63,7 +63,7 @@ | |||
| 63 | 63 | ||
| 64 | 进入项目根目录,执行如下编译命令: | 64 | 进入项目根目录,执行如下编译命令: |
| 65 | 65 | ||
| 66 | - > **说明**:编译过程依赖第三方开源软件,联网场景会自动下载,离线编译场景需要自行安装,具体参考[离线编译](../context/build_offline.md)。 | 66 | + > **说明**:编译过程依赖第三方开源软件,联网场景会自动下载,离线编译场景需要自行安装,具体参考[离线编译](../install/compile.md#未联网编译)。 |
| 67 | 67 | ||
| 68 | ```bash | 68 | ```bash |
| 69 | # 编译除experimental贡献目录外的所有算子 | 69 | # 编译除experimental贡献目录外的所有算子 |
| @@ -155,7 +155,7 @@ | |||
| 155 | 155 | ||
| 156 | ## 本地验证 | 156 | ## 本地验证 |
| 157 | 157 | ||
| 158 | -通过项目根目录build.sh执行算子和UT用例,验证项目功能是否正常,build参数参见[build参数说明](../context/build.md)。目前算子支持API方式(aclnn接口)和图模式调用,**推荐aclnn调用**。 | 158 | +通过项目根目录build.sh执行算子和UT用例,验证项目功能是否正常,build参数参见[build参数说明](../install/build.md)。目前算子支持API方式(aclnn接口)和图模式调用,**推荐aclnn调用**。 |
| 159 | 159 | ||
| 160 | - **执行算子样例** | 160 | - **执行算子样例** |
| 161 | 161 | ||
| @@ -164,11 +164,11 @@ | |||
| 164 | - 完成自定义算子包安装后,执行如下命令: | 164 | - 完成自定义算子包安装后,执行如下命令: |
| 165 | ```bash | 165 | ```bash |
| 166 | bash build.sh --run_example ${op} ${mode} ${pkg_mode} [--example_name=${example_name}] [--vendor_name=${vendor_name}] [--soc=${soc_version}] | 166 | bash build.sh --run_example ${op} ${mode} ${pkg_mode} [--example_name=${example_name}] [--vendor_name=${vendor_name}] [--soc=${soc_version}] |
| 167 | - # 以TransposeBatchMatMul算子执行test_aclnn_transpose_batch_mat_mul.cpp为例 | 167 | + # 以AddExample算子执行test_aclnn_add_example.cpp为例 |
| 168 | - # bash build.sh --run_example transpose_batch_mat_mul eager cust --example_name=transpose_batch_mat_mul --vendor_name=transpose_batch_mat_mul | 168 | + # bash build.sh --run_example add_example eager cust --example_name=add_example --vendor_name=add_example |
| 169 | ``` | 169 | ``` |
| 170 | 170 | ||
| 171 | - - \$\{op\}:表示待执行算子,算子名为小写下划线形式,如transpose_batch_mat_mul。 | 171 | + - \$\{op\}:表示待执行算子,算子名为小写下划线形式,如add_example。 |
| 172 | - \$\{mode\}:表示执行模式,目前支持eager(aclnn调用)、graph(图模式调用)。 | 172 | - \$\{mode\}:表示执行模式,目前支持eager(aclnn调用)、graph(图模式调用)。 |
| 173 | - \$\{pkg_mode\}:表示包模式,目前仅支持cust,即自定义算子包。 | 173 | - \$\{pkg_mode\}:表示包模式,目前仅支持cust,即自定义算子包。 |
| 174 | - \$\{example_name\}(可选):表示待执行样例名,名称为各个算子examples文件夹下的文件名称,去掉`test_aclnn_`前缀和`.cpp`后缀。 | 174 | - \$\{example_name\}(可选):表示待执行样例名,名称为各个算子examples文件夹下的文件名称,去掉`test_aclnn_`前缀和`.cpp`后缀。 |
| @@ -180,15 +180,15 @@ | |||
| 180 | - 完成ops-ras包安装后,执行命令如下: | 180 | - 完成ops-ras包安装后,执行命令如下: |
| 181 | ```bash | 181 | ```bash |
| 182 | bash build.sh --run_example ${op} ${mode} [--soc=${soc_version}] | 182 | bash build.sh --run_example ${op} ${mode} [--soc=${soc_version}] |
| 183 | - # 以TransposeBatchMatMul算子example执行为例 | 183 | + # 以AddExample算子example执行为例 |
| 184 | - # bash build.sh --run_example transpose_batch_mat_mul eager | 184 | + # bash build.sh --run_example add_example eager |
| 185 | ``` | 185 | ``` |
| 186 | 186 | ||
| 187 | - - \$\{op\}:表示待执行算子,算子名为小写下划线形式,如transpose_batch_mat_mul。 | 187 | + - \$\{op\}:表示待执行算子,算子名为小写下划线形式,如add_example。 |
| 188 | - \$\{mode\}:表示算子执行模式,目前支持eager(aclnn调用)、graph(图模式调用)。 | 188 | - \$\{mode\}:表示算子执行模式,目前支持eager(aclnn调用)、graph(图模式调用)。 |
| 189 | - \$\{soc_version\}(可选):表示NPU型号。当设置为"ascend950"时会额外运行"arch35"目录下的示例文件。 | 189 | - \$\{soc_version\}(可选):表示NPU型号。当设置为"ascend950"时会额外运行"arch35"目录下的示例文件。 |
| 190 | 190 | ||
| 191 | - 执行算子样例后会打印结果,以TransposeBatchMatMul算子执行为例: | 191 | + 执行算子样例后会打印结果,以AddExample算子执行为例: |
| 192 | 192 | ||
| 193 | ``` | 193 | ``` |
| 194 | result[0] is: 0.000000 | 194 | result[0] is: 0.000000 |
| @@ -205,7 +205,7 @@ | |||
| 205 | # 安装根目录下test相关requirements.txt依赖 | 205 | # 安装根目录下test相关requirements.txt依赖 |
| 206 | pip3 install -r tests/requirements.txt | 206 | pip3 install -r tests/requirements.txt |
| 207 | # 方式1: 编译并执行指定算子和对应功能的UT测试用例(选其一) | 207 | # 方式1: 编译并执行指定算子和对应功能的UT测试用例(选其一) |
| 208 | - bash build.sh -u --[opapi|ophost|opkernel] --ops=transpose_batch_mat_mul | 208 | + bash build.sh -u --[opapi|ophost|opkernel] --ops=add_example |
| 209 | # 方式2: 编译并执行所有的UT测试用例 | 209 | # 方式2: 编译并执行所有的UT测试用例 |
| 210 | # bash build.sh -u | 210 | # bash build.sh -u |
| 211 | # 方式3: 编译所有的UT测试用例但不执行 | 211 | # 方式3: 编译所有的UT测试用例但不执行 |
| @@ -228,6 +228,6 @@ | |||
| 228 | Global Environment TearDown | 228 | Global Environment TearDown |
| 229 | [==========] ${n} tests from ${m} test suites ran. (${x} ms total) | 229 | [==========] ${n} tests from ${m} test suites ran. (${x} ms total) |
| 230 | [ PASSED ] ${n} tests. | 230 | [ PASSED ] ${n} tests. |
| 231 | - [100%] Built target nn_op_host_ut | 231 | + [100%] Built target ras_op_host_ut |
| 232 | ``` | 232 | ``` |
| 233 | \$\{n\}表示执行了n个用例,\$\{m\}表示m项测试,\$\{x\}表示执行用例消耗的时间,单位为毫秒。 | 233 | \$\{n\}表示执行了n个用例,\$\{m\}表示m项测试,\$\{x\}表示执行用例消耗的时间,单位为毫秒。 |
| @@ -7,9 +7,13 @@ | |||
| 7 | 调用算子API时,需引用依赖的头文件和库文件,一般头文件默认在`${INSTALL_DIR}/include/aclnnop`,库文件默认在`${INSTALL_DIR}/lib64`,具体文件如下: | 7 | 调用算子API时,需引用依赖的头文件和库文件,一般头文件默认在`${INSTALL_DIR}/include/aclnnop`,库文件默认在`${INSTALL_DIR}/lib64`,具体文件如下: |
| 8 | 8 | ||
| 9 | - 依赖的头文件:①方式1 (推荐):引用算子总头文件aclnn\_ops\_\$\{ops\_project\}.h。②方式2:按需引用单算子API头文件aclnn\_\*.h。 | 9 | - 依赖的头文件:①方式1 (推荐):引用算子总头文件aclnn\_ops\_\$\{ops\_project\}.h。②方式2:按需引用单算子API头文件aclnn\_\*.h。 |
| 10 | -- 依赖的库文件:按需引用算子总库文件libopapi\_\$\{ops\_project\}.so。 | 10 | +- 依赖的库文件:按需引用算子总库文件libopapi\_\$\{ops\_project\}.so。注意,原所有算子仓总库文件libopapi.so后续会废弃,不推荐使用,也不支持与单个算子仓库文件同时使用。 |
| 11 | 11 | ||
| 12 | -其中${INSTALL_DIR}表示CANN安装后文件路径;\$\{ops\_project\}表示算子仓(如math、nn、cv、transformer),请配置为实际算子仓名。 | 12 | +其中${INSTALL_DIR}表示CANN安装后文件路径;\$\{ops\_project\}表示算子仓名(如ras、nn、math等),请配置为实际算子仓名。 |
| 13 | + | ||
| 14 | +- **V版本演进说明** | ||
| 15 | + | ||
| 16 | + 请注意,部分API存在多个V版本,使用时选择最高V版本即可(高版本API已兼容低版本API的所有能力)。 | ||
| 13 | 17 | ||
| 14 | ## 接口列表 | 18 | ## 接口列表 |
| 15 | 19 | ||
| @@ -19,10 +23,11 @@ | |||
| 19 | > - 性能说明:同一个算子采用确定性计算通常比非确定性慢,因此模型单次运行性能可能会下降。但在实验、调试调测等需要保证多次运行结果相同来定位问题的场景,确定性计算可以提升效率。 | 23 | > - 性能说明:同一个算子采用确定性计算通常比非确定性慢,因此模型单次运行性能可能会下降。但在实验、调试调测等需要保证多次运行结果相同来定位问题的场景,确定性计算可以提升效率。 |
| 20 | > - 线程说明:同一线程中只能设置一次确定性状态,多次设置以最后一次有效设置为准。有效设置是指设置确定性状态后,真正执行了一次算子任务下发。如果仅设置,没有算子下发,只能是确定性变量开启但未下发给算子,因此不执行算子。 | 24 | > - 线程说明:同一线程中只能设置一次确定性状态,多次设置以最后一次有效设置为准。有效设置是指设置确定性状态后,真正执行了一次算子任务下发。如果仅设置,没有算子下发,只能是确定性变量开启但未下发给算子,因此不执行算子。 |
| 21 | > 解决方案:暂不推荐一个线程多次设置确定性。该问题在二进制开启和关闭情况下均存在,在后续版本中会解决该问题。 | 25 | > 解决方案:暂不推荐一个线程多次设置确定性。该问题在二进制开启和关闭情况下均存在,在后续版本中会解决该问题。 |
| 26 | +> - 符号说明:表中“- ”符号表示该接口暂不支持当前列产品。 | ||
| 22 | 27 | ||
| 23 | 算子接口列表如下: | 28 | 算子接口列表如下: |
| 24 | 29 | ||
| 25 | -| 接口名 | 说明 | 确定性说明(A2/A3) | 确定性说明(A5) | | 30 | +| 接口名 | 说明 | 确定性说明(A2/A3) | 确定性说明(Ascend 950) | |
| 26 | |-----------|------------|------------|------------| | 31 | |-----------|------------|------------|------------| |
| 27 | | [aclnnObfuscationCalculate](../../reliability/obfuscation_calculate/docs/aclnnObfuscationCalculate.md) | 将张量x和配置参数(如param、cmd)发送至PMCC混淆引擎。引擎的CA模块调用TA模块,进行张量混淆处理,最终返回shape与x一致的混淆后的张量y。 |默认确定性实现| | 32 | | [aclnnObfuscationCalculate](../../reliability/obfuscation_calculate/docs/aclnnObfuscationCalculate.md) | 将张量x和配置参数(如param、cmd)发送至PMCC混淆引擎。引擎的CA模块调用TA模块,进行张量混淆处理,最终返回shape与x一致的混淆后的张量y。 |默认确定性实现| |
| 28 | | [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。 |默认确定性实现| |
| @@ -1,7 +1,7 @@ | |||
| 1 | # 算子列表 | 1 | # 算子列表 |
| 2 | 2 | ||
| 3 | > 说明: | 3 | > 说明: |
| 4 | -> - **算子目录**:目录名为算子名小写下划线形式,每个目录承载该算子所有交付件,包括代码实现、examples、文档等,目录介绍参见[项目目录](./context/dir_structure.md)。 | 4 | +> - **算子目录**:目录名为算子名小写下划线形式,每个目录承载该算子所有交付件,包括代码实现、examples、文档等,目录介绍参见[项目目录](./install/dir_structure.md)。 |
| 5 | > - **算子执行硬件单元**:大部分算子运行在AI Core,少部分算子运行在AI CPU。默认情况下,项目中提到的算子一般指AI Core算子。关于AI Core和AI CPU详细介绍参见[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语 > 硬件架构与数据处理原理”。 | 5 | > - **算子执行硬件单元**:大部分算子运行在AI Core,少部分算子运行在AI CPU。默认情况下,项目中提到的算子一般指AI Core算子。关于AI Core和AI CPU详细介绍参见[《Ascend C算子开发》](https://hiascend.com/document/redirect/CannCommunityOpdevAscendC)中“概念原理和术语 > 硬件架构与数据处理原理”。 |
| 6 | > - **算子接口列表**:为方便调用算子,CANN提供一套C API执行算子,一般以aclnn为前缀,全量接口参见[aclnn列表](op_api_list.md)。 | 6 | > - **算子接口列表**:为方便调用算子,CANN提供一套C API执行算子,一般以aclnn为前缀,全量接口参见[aclnn列表](op_api_list.md)。 |
| 7 | 7 | ||
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | ## 环境部署 | Prerequisites | 3 | ## 环境部署 | Prerequisites |
| 4 | 4 | ||
| 5 | -- 请先参考[环境部署](../../docs/zh/context/quick_install.md)完成基础环境搭建 | 5 | +- 请先参考[环境部署](../../docs/zh/install/quick_install.md)完成基础环境搭建 |
| 6 | - GCC 9.4.0+ | 6 | - GCC 9.4.0+ |
| 7 | - Python 3.8+ | 7 | - Python 3.8+ |
| 8 | - PyTorch>=2.6.0 | 8 | - PyTorch>=2.6.0 |