从基础到实操,一站式掌握Ascend C编程
老师用了一个特别生动的例子来解释SPMD(Single Program Multiple Data)模型:假设有5个人要做20张试卷,那么每人做4张,大家用的是同一套做题方法,但处理的是不同的卷子。将数据拆分并分布在多个核心上运行,多个AI Core共享同一代码。通过这次CANN训练营的学习,我深刻体会到Ascend C编程语言的强大之处。它既保持了C/C++的编程习惯,又提供了强大的并行计算能力
【CANN训练营学习笔记】从基础到实操,一站式掌握Ascend C编程
训练营简介
2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖
报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro
📖 本文思维导图
mindmap
root((Ascend C编程))
Ascend C简介
四大优势
C/C++兼容
自动并行调度
结构化编程
CPU/NPU调试
应用场景
硬件架构
AI Core组成
计算单元
存储系统
控制单元
数据搬运
MT2搬运
MT3搬运
SPMD编程模型
概念理解
Block IDX
并行处理
核函数编程
声明与调用
三段式流水线
CopyIn
Compute
CopyOut
双缓冲优化
内存管理
数据载体
GlobalTensor
LocalTensor
Pipe管理
临时变量
API体系
高阶API
基础API
算子开发实践
向量加法示例
开发流程
性能优化
一、初识Ascend C:为什么要学习它?
最近参加了CANN训练营的课程,深入学习了Ascend C编程语言,收获颇丰。作为一个一直在做AI开发的工程师,我发现Ascend C真的是一个非常强大且易用的算子开发语言。今天想把我的学习笔记分享给大家,希望能帮助更多想要入门昇腾AI开发的朋友们。
1.1 Ascend C的四大核心优势
老师在课上重点强调了Ascend C的四大优势,我觉得这真的是它最吸引人的地方:
1. 遵循C/C++编程规范
这点对于有C++基础的同学来说太友好了!不需要学习全新的语法规则,直接就能上手。我自己之前有C++开发经验,所以学习Ascend C基本没有什么障碍。
2. 自动并行调度
这是我最喜欢的特性!传统的并行编程需要手动管理线程、同步等复杂问题,而Ascend C会自动帮你做并行调度,获得最优的执行性能。这大大降低了开发难度。
3. 结构化核函数编程
通过结构化的编程范式,算子开发逻辑变得非常清晰。老师讲的CopyIn-Compute-CopyOut三段式流水线让我印象特别深刻,这种模式真的把复杂的算子开发简化了很多。
4. 支持CPU和NPU软件调试
这点在实际开发中太重要了!即使没有昇腾硬件,也可以在CPU上进行调试。这对于学习者和没有硬件条件的开发者来说简直是福音。
二、深入理解Ascend硬件架构
2.1 AI Core的三大核心组件
老师用了一个很形象的比喻来解释AI Core的架构,我觉得特别容易理解。AI Core就像一个高效的工厂,由三大核心组件构成:
1. 计算单元
这是整个"工厂"的生产车间,包含了三种不同的计算单元:
- Scalar计算单元:就像工厂的调度中心,负责将指令分发给对应的队列
- 向量计算单元:负责向量运算,通过统一缓冲区(UB)进行数据搬运和计算
- 矩阵计算单元:这是专门为AI计算设计的,输入来自L0A和L0B缓冲区,输出放在L0C
2. 存储系统
这是"工厂"的仓库系统,采用多级缓冲的设计:
- 统一缓冲区(UB)
- 张量缓冲区L0A、L0B
- 矩阵输出结果存放位置L0C
- Global Memory(全局内存)
3. 控制单元
这相当于整个AI Core的"司令部",提供指令控制,协调各个部分的工作。

2.2 数据搬运的门道
这里我自己画了一个简单的示意图来理解数据流:
Global Memory → MT2搬运单元 → Local Memory(UB) → 计算单元处理 → MT3搬运单元 → Global Memory
其中:
- MT2:负责从Global Memory搬到Local Memory
- MT3:负责从Local Memory搬回Global Memory
这种设计的好处是什么呢?就是把高速的计算单元和相对较慢的全局内存隔离开,中间用高速的Local Memory作为缓冲,大大提升了计算效率。
三、SPMD编程模型:化繁为简的智慧
3.1 什么是SPMD?
老师用了一个特别生动的例子来解释SPMD(Single Program Multiple Data)模型:
假设有5个人要做20张试卷,那么每人做4张,大家用的是同一套做题方法,但处理的是不同的卷子。
这就是SPMD的核心思想:将数据拆分并分布在多个核心上运行,多个AI Core共享同一代码。
3.2 如何区分不同核心处理的数据?
这里有一个关键概念:Block IDX
通过Block IDX可以区分不同核心处理的数据范围。比如:
- Block 0处理数据的0-3部分
- Block 1处理数据的4-7部分
- …以此类推
这种设计非常巧妙,既保证了代码的简洁性,又实现了并行处理。
四、核函数编程实战

4.1 核函数的声明与调用
核函数是算子设备侧的入口,使用特殊的限定符:
__global__ __aicore__ void kernel_name(GM_ADDR x, GM_ADDR y, GM_ADDR z)
其中:
__global__表示这是一个全局函数__aicore__表示这个函数运行在AI Core上GM_ADDR表示Global Memory的地址
调用核函数的语法也很特别:
kernel_name<<<block_dim, l2ctrl, stream>>>(x, y, z);
三个尖括号内的参数分别是:
block_dim:使用的核心数量l2ctrl:保留参数(一般不用管)stream:任务队列,用于异步管理
4.2 三段式流水线编程
这是Ascend C编程的核心范式,我把它总结为:
1. CopyIn阶段
将数据从Global Memory搬到Local Memory(AI Core内部)
2. Compute阶段
在Local Memory上进行高效计算
3. CopyOut阶段
将计算结果从Local Memory搬回Global Memory
这种模式的好处是逻辑清晰,而且通过Pipe模块统一管理资源,避免了手动管理内存的复杂性。
五、内存管理与数据载体
5.1 两种基本数据载体
Ascend C中有两种基本的数据操作单元:
- GlobalTensor:位于Global Memory的张量
- LocalTensor:位于Local Memory的张量
通过抽象的内存位置来管理:
QuePosition::VECIN:向量计算输入数据存放位置QuePosition::VECOUT:向量计算输出数据存放位置
5.2 Pipe管理模块
Pipe是片上内存的管理者,内存分配流程如下:
- 通过
Pipe::InitBuffer分配队列内存 - 使用
LocalTensor获取内存 - 计算完成后通过
FreeTensor回收内存
这种管理方式让内存分配变得非常简单和安全。
六、向量加法算子实战案例
6.1 算子需求分析
实现一个简单的向量加法算子:z = x + y
参数设置:
- 固定长度:8192
- 数据类型:half(半精度浮点)
- 数据排布格式:ND
6.2 实现流程
按照三段式流水线的思路:
第一步:数据搬入
将x和y从Global Memory搬运到AI Core内部的Local Memory
第二步:向量加法计算
在Local Memory上调用向量加法API进行计算
第三步:数据搬出
将结果z从Local Memory搬回Global Memory
6.3 双缓冲优化技术
老师特别强调了双缓冲技术,这是提升性能的关键!
目的:隐藏数据搬运时间,提高计算单元利用率
实现方式:将内存切分为两部分,交替进行搬运和计算
时间片1: 缓冲区A搬运数据 | 缓冲区B进行计算
时间片2: 缓冲区A进行计算 | 缓冲区B搬运数据
效果:计算时间可以掩盖搬运时间,大大提高整体效率!
这让我想起了操作系统中的缓冲技术,原理是相通的。
七、开发流程与资源获取
7.1 完整开发步骤
老师给出了一个清晰的开发流程:
- 算子分析:明确数学表达式和计算逻辑
- 接口定义:确定所需的API接口
- 核函数实现:编写设备侧代码
- 主机侧调用:编写主机侧调用逻辑
7.2 工程结构
一个标准的Ascend C工程包含:
- 调用程序源码
- 核函数实现文件
- 数据生成脚本
- 对比校验脚本
- 一键化执行脚本
7.3 学习资源
老师推荐的学习路径:
资源位置:Ascend Community → 开发 → Ascend C → 样例代码
两种模式:
- CPU模式:无需硬件,适合初学者
- NPU模式:需要昇腾硬件,用于实际部署
我个人建议先在CPU模式下学习和调试,等熟练之后再到NPU上运行。
八、我的学习心得与建议
8.1 学习路径建议
- 先理解硬件架构:不要急着写代码,先搞懂AI Core的工作原理
- 从快速开发模式入手:用核函数直调的方式快速验证算法逻辑
- 掌握三段式流水线:这是Ascend C编程的灵魂
- 学习性能优化技巧:双缓冲、内存管理等进阶技术
8.2 常见问题与解决
问题1:不理解为什么要分Local Memory和Global Memory
解答:这是性能优化的关键!Local Memory速度快但容量小,Global Memory容量大但速度慢。通过分级存储,可以在保证容量的同时获得高速计算能力。
问题2:SPMD模型不好理解
解答:可以类比多线程编程,每个AI Core就像一个线程,执行相同的代码但处理不同的数据。
8.3 后续学习方向
学完基础课程后,我计划按以下路径继续深入:
- 学习更复杂的算子开发(卷积、矩阵乘等)
- 掌握标准开发模式,实现可部署的算子
- 学习算子性能调优技术
- 参与开源社区的算子开发
九、总结
通过这次CANN训练营的学习,我深刻体会到Ascend C编程语言的强大之处。它既保持了C/C++的编程习惯,又提供了强大的并行计算能力和自动化调度机制。
核心要点回顾:
- Ascend C具有四大优势:C/C++兼容、自动并行、结构化编程、CPU/NPU调试
- AI Core由计算单元、存储系统、控制单元三部分组成
- SPMD模型是并行编程的关键
- 三段式流水线(CopyIn-Compute-CopyOut)是编程范式的核心
- 双缓冲技术是性能优化的利器
对于想要学习昇腾AI开发的同学,我强烈推荐从Ascend C开始。它不仅能帮助你理解AI硬件的工作原理,还能让你具备开发高性能AI算子的能力。
希望这篇笔记能对大家有所帮助!如果有任何问题,欢迎在评论区讨论交流。让我们一起在昇腾AI的道路上不断前进!
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)