Ascend C 算子开发指南:从语法基础到算子实操
什么是 Ascend C 算子

Ascend C 算子是基于 CANN 推出的支持 C/C++ 标准规范的编程语言 Ascend C 所开发的算子。编写的算子程序经编译器编译和运行时调度可在昇腾硬件上运行,助力开发者高效实现自定义创新算法。
使用它开发自定义算子具有显著优势:遵循 C/C++ 编程规范、自动并行调度获得最优执行性能、结构化核函数简化算子开发逻辑、CPU/NPU 孪生调试提升算子调试效率。
编程模型解析
核函数与 SPMD 模型
Ascend C 的核函数是算子在设备侧 AI Core 的执行入口,也是连接 CPU 与 NPU 的桥梁。编写核函数定义设备端计算逻辑,编译后可在昇腾硬件并行执行,是自定义算子的核心载体。
采用 SPMD(单程序多数据)模型,仅需写一份核函数代码,设备会自动分发到多 AI Core。各核心通过内置变量 block_idx 区分身份,独立处理数据分片,实现一份代码、多核心并行处理不同数据。
核函数开发规则
- 限定符:需添加特定限定符,明确运行载体和类型。
global:标识为可被主机端调用的设备函数。__aicore:明确在昇腾 AI Core 上执行(区别于 CUDA 的核函数)。
- 参数与变量规则:
- 入参类型:仅支持指针(需用
gm标识指向全局内存,如gm float*)或 C/C++ 内置类型(如int32_t)。
- 入参类型:仅支持指针(需用
- 调用流程:
- 核函数如何被主机端触发(主机端通过特定语法调用核函数,需指定并行配置)。
blockDim:指定参与执行的 AI Core 数量。l2ctrl:保留参数,暂设为nullptr。stream:任务队列(aclrtStream类型),用于管理设备端任务的并行、串行执行。
实践示例 HelloWorld 核函数全流程包括核函数实现(设备侧逻辑)和主机端调用(CPU 侧控制流程)。需配合 AscendCL(昇腾计算库)完成初始化、资源管理等步骤。
硬件抽象与流水线范式
Ascend C 基于硬件抽象架构,采用流水线式编程范式,将算子拆分为多个流水任务,通过 Queue 实现任务通信同步、Pipe 统一管理内存资源。
其中 Vector 编程范式明确 CopyIn、Compute、CopyOut 三阶段流程,结合逻辑存储位置 TPosition 和张量对象 Global/LocalTensor 管理数据,并通过 Pipe、TBuf 分别完成常规与临时变量的内存分配回收,以此支撑算子在昇腾硬件上的高效开发执行。
这种架构屏蔽底层差异,依托 Pipe 统一管理设备侧资源核心的 Vector 编程范式明确 CopyIn(数据搬入)、Compute(向量计算)、CopyOut(数据搬出)三阶段流程,结合 TPosition 及 GlobalTensor/LocalTensor 实现精细化数据管理,保障内存高效利用。
API 分层设计




