昇腾 Ascend C 编程指南:从语法基础到算子开发实战
Ascend C 算子是什么
Ascend C 算子是基于 CANN 推出的支持 C/C++ 标准规范的编程语言 Ascend C 所开发的算子。编写的算子程序经编译器编译和运行时调度可在昇腾硬件上运行,助力开发者高效实现自定义创新算法。使用它开发自定义算子具有遵循 C/C++ 编程规范、自动并行调度获得最优执行性能、结构化核函数简化算子开发逻辑、CPU/NPU 孪生调试提升算子调试效率等优势。
Ascend C 编程模型
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类型),用于管理设备端任务的并行、串行执行。
需配合 AscendCL(昇腾计算库)完成初始化、资源管理等步骤。
Ascend C 硬件架构抽象与编程范式
Ascend C 基于硬件抽象架构,采用流水线式编程范式,将算子拆分为多个流水任务,通过 Queue 实现任务通信同步、Pipe 统一管理内存资源。
核心的 Vector 编程范式明确 CopyIn、Compute、CopyOut 三阶段流程,结合逻辑存储位置 TPosition 和张量对象 Global/LocalTensor 管理数据,并通过 Pipe、TBuf 分别完成常规与临时变量的内存分配回收,以此支撑算子在昇腾硬件上的高效开发执行。
这种架构屏蔽底层差异,依托 Pipe 统一管理设备侧资源。通过 Queue 实现任务通信同步,保障内存高效利用,支撑算子在昇腾硬件上的高效开发与执行。
Ascend C API 体系:基础与高层 API 的分层赋能
Ascend C 的 API 体系分为基础 API 和高层 API,分别支撑底层功能灵活组合与上层算法快速落地的开发需求。


