Ascend C资料设计规范

设计目标

Ascend C资料是开发者使用昇腾NPU进行算子开发的唯一官方入口。资料质量直接影响开发者从"了解→上手→精通"全链路效率。

本设计文档从三个维度定义Ascend C资料的设计要求:

维度 核心问题 目标状态
可获取性(Discoverability) 开发者能否在3步内找到所需信息? 从"搜索→猜测→试错"变为"导航→定位→理解"
可读性(Readability) 找到后能否无歧义地理解? 从"反复推理+交叉验证"变为"一次读完即理解"
完备性(Completeness) 理解后信息是否足够完成开发任务? 从"文档只给一半,另一半靠踩坑"变为"按文档操作可直接完成"

此外,跨版本迁移场景(涉及跨代迁移兼容性指南和版本约束标注规范章节)同时涉及上述三个维度:开发者要能找到迁移信息(可获取性)、看懂迁移步骤(可读性)、迁移后功能不退化(完备性)。


资料体系架构

Ascend C资料体系由五份核心文档组成,通过交叉链接形成可导航的资料网络。

资料体系架构图如下所示:

资料体系架构图

核心导航逻辑:每个文档既是链接的发起方(首次提到其他文档负责的内容时,链接过去),也是链接的接收方(别的文档提到本文档负责的内容时,链接回来)。

五份文档定位与导航原则

文档 负责说清什么 别的文档从这里获取什么 本文档链接出去的方向
入门教程 Ascend C概述、环境准备、快速上手实践(HelloWorld、首个算子) 其他文档可链接到入门教程作为零基础入口 编程概念深入→链接到编程指南;首次提到某个API→链接到API参考手册
编程指南 编程模型、编程范式、编译运行、硬件架构、高级编程的核心概念 其他文档遇到编程概念时链接回编程指南获取权威解释 首次提到某个API→链接到API参考手册;首次提到优化/实践→链接到算子实践参考;提到架构版本差异→链接到跨代迁移指南
API参考手册 每个接口的参数定义、使用约束、代码示例、API之间的关联关系 编程指南和算子实践参考提到某个API时链接到API参考手册获取接口详情 前置概念→链接回编程指南;API有跨版本差异→链接到跨代迁移指南
算子实践参考 算子怎么写、性能怎么优化、怎么调试、典型案例 编程指南点到为止的实践和优化内容链接到算子实践参考展开 首次用到某个API→链接到API参考手册;涉及编程概念→链接回编程指南;优化方案因架构版本不同→链接到跨代迁移指南
跨代迁移兼容性指南 API兼容策略、架构版本间有哪些变更、具体迁移步骤 任何文档涉及版本差异、API废弃/新增时链接到迁移指南获取迁移路径 概念定义→链接回编程指南;迁移后的新API→链接到API参考手册

补充说明

  • 样例库(asc-devkit/examples/不属于Ascend C资料体系,但五份文档中的代码示例均可链接到样例库
  • 技术附录(术语表、原理、语法限制)归入编程指南,作为共享知识基础设施
  • 入门教程独立成册,目录位于 docs/zh/guide/入门教程/,包含概述、环境准备、快速入门(SIMD/SIMT)

可获取性(Discoverability)

三层导航体系

文档提供三层导航,覆盖不同使用场景:

导航层 形式 适用场景 设计要求
全局层 目录树+全文搜索 知道自己要找什么 目录≤5级深度;搜索覆盖代码/参数/概念名
决策层 决策树/对比表/选择指引 知道需求但不知道选哪个 每个多选岔路口必须有决策树或对比表
关联层 双向交叉链接+关联API段 找到A后需要了解关联的B 五份文档互链形成可导航网络

具体要求

  • 编程指南每个多路径章节(SIMD/SIMT选择、API层级选择)开头放决策树或对比表
  • API参考手册每个API族(Reduce系列、Matmul系列、DataCopy系列)开头放选择对照表
  • 算子实践参考每个有多种实现方案的算子开头放方案差异表+选择建议
  • 每个对照表给出明确的默认推荐("不确定时优先使用X")
  • 包含"常见选错场景"说明(如"遇到XXX错误,可能是因为选了A而非B")

五文档链接联动

五份核心文档通过链接形成可导航网络,链接方向遵循"谁提到别人负责的内容,谁就加链接"原则

链接关系(10条链接规则)

链接规则 发起方 链接到 触发时机 说明
L0 入门教程 编程指南 入门教程点到编程概念需深入时 入门教程只给快速上手,概念深入链接到编程指南
L1 编程指南 API参考手册 首次引入新API名称 概念讲解中API名首次出现处加链接
L2 编程指南 算子实践参考 首次引入实践/优化话题 编程指南点到为止,链接到实践参考展开
L3 编程指南 跨代迁移指南 提及架构版本差异/废弃API时 详见跨代迁移兼容性指南
L4 算子实践参考 API参考手册 实践案例中首次使用API 算子样例代码中API首次出现处链接到接口详情
L5 算子实践参考 编程指南 首次引入编程概念 实践中涉及编程模型概念时链接到权威解释
L6 算子实践参考 跨代迁移指南 提及跨架构优化差异时 性能优化方案因架构版本不同时链接
L7 API参考手册 编程指南 首次引入编程概念 "前置知识"段链接到概念介绍章节
L8 API参考手册 跨代迁移指南 标注API版本差异/废弃信息时 API页标注版本范围并链接
L9 跨代迁移指南 API参考手册 迁移目标使用新API时 遗留API→新API映射表中链接到新API详情
L10 跨代迁移指南 编程指南 迁移涉及编程概念变更时 架构变更映射中链接到概念解释

链接规则

  • 同一概念/API首次出现时加链接,后续重复出现不重复链接
  • API参考页面的概念引用就近行内链接(非集中在页面底部)
  • 注意方向:算子实践参考→API参考手册(查接口详情),API参考手册不需要反向链接到算子实践参考
  • 跨代迁移指南同时是链接发起方和接收方:向外链接到编程指南(概念变更)和API参考手册(新API详情);接收其他文档涉及版本差异时指向它的链接
  • 所有资料涉及的完整代码样例引用到样例库

术语统一入口

建立统一术语对照表(独立附录文件),所有文档共享:

对照内容 形式 位置
术语对照表 四列映射:抽象概念↔硬件单元↔编程模型↔接口名 独立附录文件,概述章链接引用
产品型号对照表 产品名↔芯片名↔架构代号 编程指南概述章
同义词索引 同一概念的多种叫法→权威解释页 附录或索引页

具体要求

  • 任何文档中出现的代号/缩写,首次出现时括号注释全称并链接到对照表
  • 同一概念在不同文档中允许用不同层级的名称,但必须在术语对照表中建立等价关系
  • 典型必须映射的术语组:DMA/MTE/DataCopy(同一搬运功能三层名)、Local Memory/L1/__cbuf__(同一存储三层名)

文件职责聚焦

每个文件有明确的单一职责,概述文件定位为导航页

文件类型 职责 禁止
概述/总览文件 导航:主题列表+1-2句概述+子章节链接 展开技术细节、大量代码
概念介绍文件 解释:概念定义+原理+约束+关系 重复其他文件已有内容(改为引用)
操作指南文件 步骤:代码片段+操作步骤+注意事项 概念定义(链接到概念文件)
API参考页 参考:原型+参数+约束+示例+关联API 编程模型解释(链接到编程指南)
迁移指导文件 步骤:变更清单+映射表+验证步骤 编程模型解释(链接到编程指南)、重复已有迁移内容(改为引用)

具体要求

  • 概述文件篇幅:导航表格/链接占比≥60%
  • 如果一个文件超过3个不相关主题,拆分为多个子文件
  • 同一内容的详细描述只出现一次(权威版本),其余位置用"详见X章节"引用
  • 硬件架构描述统一到一份文件,不允许SIMD版/SIMT版各描述一半

可读性(Readability)

按抽象层级使用术语

文档按章节的抽象层级使用对应术语,首次跨界时必须关联

章节层级 使用术语 首次跨界处理
高层(抽象硬件架构、概述) 抽象名:Global Memory、Local Memory、计算单元 不突兀混入UB、L0A等底层名
低层(编程模型、数据搬运) 硬件名:UB、L1 Buffer、L0A/B/C 首次出现时括号关联:UB(即抽象架构中Local Memory的一部分)
API层(API参考手册) API名:DataCopy、LocalTensor 首次出现时关联硬件名:DataCopy(触发MTE数据搬运单元指令)

反面案例(禁止):抽象硬件架构文档直接写"数据通过UB搬入VEC运算",跳过抽象层。

易混概念显式区分

名称相近、层级易混淆的概念必须用对比表或关系图显式区分

必须区分的概念组

概念组 区分维度 区分形式
SPMD vs SIMD vs SIMT SPMD=编程模型、SIMD=指令执行模式、SIMT=线程执行模式 层级关系图
四步法(Tiling→搬→算→搬) vs TPipe四步(Alloc→EnQue→...) 编程流程vs流水管理范式 对比表
DMA vs MTE vs DataCopy 三层名同一件事 术语映射表
MemBase(基础API) vs RegBase(VF融合API) 计算位置不同(UB vs寄存器)、Load/Store次数不同 对比表+场景推荐
Block vs CTA Ascend C编程单元vs CUDA等价概念 竞品映射表
LocalTensor vs GlobalTensor vs TBuf 计算用/外部用/临时用缓冲区 对照表+场景推荐
__ubuf__ vs __cbuf__ vs __gm__ UB空间/L1空间/GM空间地址限定符 对照表
asc_前缀vs Ascend C::前缀vs cce::前缀 C API / C++ API / Intrinsics 命名规则表

具体要求

  • 首次出现混淆可能的位置就给出区分,不延后
  • 禁止用一个概念的代码示例暗示等价于另一概念

约束前置且醒目

所有硬件级/平台级约束在概念首次定义处醒目标注,不依赖后续章节或运行时报错暴露:

约束信息要素

  • 约束类型:地址对齐/数据类型限制/元素数量范围/格式限制/只读语义/时序要求
  • 约束值:具体数值或范围(如"32字节对齐"、"half类型≥128元素")
  • 违反后果:编译报错/运行时越界/结果错误/性能下降

格式要求:独立段落,集中列出(不分散在各参数说明小字中)

放置位置

  • API参考页:函数原型之后、参数说明之前,独立的"约束与限制"段落
  • 编程指南:概念引入时同步给出约束,而非后续补充

参数语义图解化

复杂参数(涉及内存布局、维度映射、stride计算)用图解代替纯文字:

参数类型 图解形式
stride/offset类 内存布局对照图(标注每步偏移)
维度映射类 维度变换映射图(如[K,N]→[N,K]转置)
格式类(ND/NZ) 两种格式的内存排布对比图
mask类 元素对应位掩码图
数据流类 输入→处理→输出流图

判断标准:一个参数用纯文字需要3句以上才能解释清楚→必须配图。图解与文字描述必须一致。

代码片段精简聚焦

每种编程范式/关键流程提供精简代码片段+完整样例链接:

要求 说明
精简聚焦 只展示当前讲解相关代码,用 // ... 其他初始化 省略无关部分
可理解 每个片段配2-3行文字说明"这段代码做了什么"
可追踪 片段末尾链接到样例库完整示例
关键字注释 Ascend C特有关键字(__aicore____ubuf____simd_vf__等)必须行内注释
参数覆盖 覆盖常用参数组合,不仅展示单一用法

前置知识显式铺垫

每个概念/API首次出现时提供前置知识铺垫,确保不逆序阅读

  • API参考页开头放"前置知识"段:使用此API前需要了解的概念(链接到编程指南)
  • 算子实践参考开头放"前置说明"段:阅读本文档需要的知识基础和前置样例链接
  • 编程指南章节按学习路径排列:基础概念→编程模型→编程范式→性能优化(不按功能模块平铺)
  • 概念B依赖概念A时,A先出现或在B处有明确引用链接

Host侧与Kernel侧明确分离

API文档中Host侧和Kernel侧必须明确标注和分离:

  • 每个API页面标注适用侧:Host侧/Kernel侧/Host+Kernel
  • Host侧API(Tiling计算、workspace分配)与Kernel侧API(计算接口、数据搬运)分节展示
  • 编程指南中有Host/Kernel分工全景图
  • 涉及跨侧数据传递的概念(workspace/Tiling),提供端到端调用链路图

SIMT章节业界参考

仅适用于SIMT编程模型章节。SIMT核心概念参考业界的说明方式,提供概念映射表(Block↔CTA、Warp↔Warp、Lane↔Thread、__aicore____global__)和关键差异说明。


完备性(Completeness)

硬件参数与数据通路校验

文档中的硬件参数值(容量、粒度、范围、数据通路路径)必须与芯片规格说明书交叉验证:

必须校验的内容

  • 每个硬件参数值(容量、大小、粒度、范围)有规格说明书佐证
  • "固定值""always""统一为"等绝对性描述经规格核实——很多"固定值"实际由配置参数决定
  • 数据通路描述与实际搬运路径一致(不同文档对同一通路不得矛盾)
  • 不同芯片版本的参数差异已标注

约束信息零遗漏

所有隐式约束在文档中显式记录,不依赖运行时assert或编译错误暴露:

约束类别 覆盖要求 常见遗漏
数据类型限制 每个API列出支持的完整数据类型列表 half类型最小元素数、bf16支持缺失
地址对齐 明确对齐字节数和对齐方向 32B对齐仅写在assert中
元素数量范围 明确最小值、最大值、对齐粒度 "8元素"约束未文档化
格式限制 ND/NZ/FRACTAL等格式支持情况 格式切换的偏移计算差异
使用模式限制 直调/工程模式/调试模式的差异 PipeBarrier仅特定模式可用
多核/多实例限制 kernel内只读、核间同步要求 配置参数只读语义未说明
API组合限制 互斥API/必需搭配API 文档推荐的组合实际不支持

操作要求:约束信息从规格说明书和assert代码中提取,集中展示在首次定义处。

示例分层覆盖

每个API/编程范式提供示例:

示例层级定义

层级 定位 篇幅 要求
Minimal 最小可运行示例 <30行核心代码 单一功能、复制即编译运行
Standard 典型用法示例 50-150行 覆盖核心参数组合
Advanced 进阶示例 >150行 与其他API组合使用、性能优化技巧

各文档的具体要求

  • API参考手册:每个API至少1个最小可运行示例(Minimal),并在示例中覆盖常用参数组合
  • 编程指南:每个编程范式至少1个Minimal示例+样例库完整示例链接
  • 算子实践参考:每个算子实践案例至少1个典型用法示例以及1个进阶用法示例
  • 示例可直接复制编译运行(含CMakeLists.txt引用、数据生成说明、预期输出)

API关联与组合使用说明

每个API页面包含关联API段,说明同一版本内API之间的组合使用关系和禁忌。跨版本的迁移关系归5.5节负责。

包含内容 :互斥API(独立警告框)+ 功能相近API选择指引

要求

  • 互斥组合用独立警告框标注(如"BatchMatmul与SetQuantVector组合不支持")
  • 功能相近API族提供选择决策树
  • API参考手册中提供API关系总览图(高阶API→底层API封装层次)

跨代迁移覆盖完备

跨代迁移兼容性指南必须覆盖完整的迁移路径,确保开发者在架构升级时不因文档缺失而受阻:

必须覆盖的迁移要素

迁移要素 覆盖要求 如果不覆盖会怎样
架构变更清单 列出两个架构版本间所有影响编程的差异项 仅列出API级差异,忽略约束/性能差异
API兼容策略 明确哪些API跨版本可用、哪些废弃、哪些新增 废弃API未标注替代方案
逐API迁移映射表 遗留API→新API一一对应,含参数差异和约束差异 仅给出新API名未给出参数映射
迁移后验证步骤 迁移完成后如何验证功能正确性和性能基线 缺性能回归验证说明
编译选项变更 不同架构版本的编译参数差异 未说明宏定义/编译选项变更

操作要求

  • 跨代迁移指南的每个迁移映射条目(遗留API→新API)必须链接到API参考手册中对应的新旧API详情页
  • 架构变更描述中涉及的编程概念变更(如新增执行模式、内存模型差异)必须链接回编程指南的对应概念章节
  • 迁移实践中的优化技巧应链接到算子实践参考的对应优化章节
  • API参考手册中,每个API页面如果存在跨版本差异(废弃/新增/行为变更),必须在该页面标注并链接到跨代迁移指南对应条目

版本约束标注规范

五份文档中涉及版本差异的内容必须统一标注格式,确保开发者一眼识别适用范围:

标注格式[适用版本:xxx]+> **注意**:xxx

标注场景 格式 示例
API页面标注适用版本 [适用版本:2201+]/[适用版本:3510+]/[适用版本:全版本] DataCopy → [适用版本:全版本]
API已废弃 > **已废弃**(vX.X起),替代方案见→迁移指南 asc_mmad → 已废弃,替代见迁移指南
约束因版本不同 > **版本差异**:2201要求32B对齐;3510要求512B对齐 src_stride → 版本差异见迁移指南
性能优化方案因版本不同 [适用版本:仅2201]/[适用版本:仅3510] IBShare → [适用版本:仅2201]

操作要求

  • 编程指南中涉及版本差异的硬件参数/约束,在参数值旁用[适用版本:xxx]标注
  • API参考手册每个API页面顶部用[适用版本:xxx]标注,废弃API用> **已废弃**醒目标注
  • 算子实践参考中版本特定的优化方案,在标题或开头用[适用版本:仅xxx]标注
  • 跨代迁移指南中每个条目使用统一格式,不自行发明新格式

三维度交叉设计

部分设计要求横跨多个维度,需同时满足:

设计要求 可获取性 可读性 完备性 具体操作
术语对照表 统一入口 按层用词 硬件校验 四列映射表(独立附录文件)
决策树/对比表 三层导航 易混区分 API关联 每个多选岔路口提供
代码示例 链接样例库 精简聚焦 分层覆盖 API页1个Minimal示例;指南片段+链接
约束框 前置醒目 零遗漏 约束信息在首次定义处
参数图解 图解化 约束可视化 stride/layout/mask类必须配图
Host/Kernel分离 找到对应侧 侧别清晰 端到端链路 标签+分节+链路图
版本约束标注 一眼识别版本范围 版本差异不混淆 迁移路径零遗漏 统一格式标注,五份文档一致
跨代迁移映射 遗留API→新API可达 迁移步骤可理解 变更清单零遗漏 逐API映射表+验证步骤+链接到API参考手册