昇腾 Ascend C 算子开发指南
Ascend C 算子概述
Ascend C 算子是基于 CANN 平台推出的支持 C/C++ 标准规范的编程语言所开发的算子。编写好的算子程序经编译器编译和运行时调度后,可在昇腾硬件上高效运行。相比传统开发方式,使用 Ascend C 开发自定义算子具有显著优势:遵循 C/C++ 编程规范、自动并行调度以获得最优执行性能、结构化核函数简化逻辑、以及 CPU/NPU 孪生调试提升效率。
编程模型与核函数
核函数是算子在设备侧 AI Core 的执行入口,也是连接 CPU 与 NPU 的桥梁。它定义了设备端的计算逻辑,编译后可在昇腾硬件上并行执行,是自定义算子的核心载体。
SPMD 并行模型
Ascend C 采用 SPMD(单程序多数据)模型。开发者只需编写一份核函数代码,设备会自动将其分发到多个 AI Core。各核心通过内置变量 block_idx 区分身份,独立处理数据分片,从而实现'一份代码、多核心并行处理不同数据'。
核函数开发规则
- 限定符:需添加特定限定符明确运行载体和类型。
__global__:标识为可被主机端调用的设备函数。__aicore__:明确在昇腾 AI Core 上执行(区别于 CUDA 的核函数)。
- 参数与变量:入参仅支持指针(需用
gm标识指向全局内存,如gm float*)或 C/C++ 内置类型(如int32_t)。 - 调用流程:主机端通过特定语法触发核函数,需指定并行配置:
blockDim:指定参与执行的 AI Core 数量。l2ctrl:保留参数,暂设为nullptr。stream:任务队列(aclrtStream类型),用于管理设备端任务的并行或串行执行。
硬件架构抽象与编程范式
Ascend C 基于硬件抽象架构,屏蔽底层差异,采用流水线式编程范式。它将算子拆分为多个流水任务,通过 Queue 实现任务通信同步,Pipe 统一管理内存资源。
核心的 Vector 编程范式明确了 CopyIn、Compute、CopyOut 三阶段流程:
- CopyIn:数据搬入。
- Compute:向量计算。
- CopyOut:数据搬出。
结合逻辑存储位置 TPosition 和张量对象 GlobalTensor/LocalTensor 管理数据,并通过 Pipe、TBuf 分别完成常规与临时变量的内存分配回收,以此支撑算子在昇腾硬件上的高效开发与执行。
API 体系分层
Ascend C 的 API 体系分为基础 API 和高层 API,分别支撑底层能力的灵活组合与上层算法的快速落地。
基础 API:底层能力拼接
- 计算类 API:分为标量(Scalar)、向量(Vector)、矩阵(Cube)三类,适配不同粒度的计算场景。
- :以 为核心,实现 Global Memory 与 Local Memory 间的数据迁移。


