【2025年昇腾CANN训练营第二季】关于昇腾Ascend C算子开发入门学习基础,理解算子开发最简单的逻辑内容
摘要:2025年昇腾CANN训练营第二季推出系列课程,助力开发者掌握AscendC算子开发技能。AscendC是华为专为昇腾AI处理器设计的C++扩展语言,通过三级并行计算架构(芯片-核-块)、分层内存管理和专用计算单元,显著提升AI计算效率。课程以向量加法为例,对比展示了AscendC相比传统C++的并行优势:8核处理器每次处理8个数据时,1024次运算仅需16步即可完成。完成课程可获得中级认证
昇腾训练营报名链接: https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro
训练营简介:2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。
第一课:认识昇腾Ascend C
1. Ascend C是什么?
Ascend C是华为为昇腾AI处理器设计的专用编程语言(实际上是C++的扩展),专门用于编写AI计算核心(算子)。
简单比喻:
-
C/C++:通用编程语言,什么都能做
-
Ascend C:专门为AI芯片设计的“方言”,更高效地利用芯片的计算能力
2. 为什么要用Ascend C?
想象你要在工厂生产汽车:
-
用C/C++:就像手工制造,灵活但慢
-
用Ascend C:就像用自动化生产线,专门为造车优化,效率极高
3. 最核心的三个概念
概念一:并行计算层次
昇腾芯片有三个级别的并行:
整个芯片 → 分成多个核(Core) 每个核 → 分成多个块(Block) 每个块 → 可以同时处理多个数据(Vector)
生活比喻:
一个大型快递分拣中心:
-
整个中心 = 芯片
-
每个分拣区 = Core(核)
-
每个分拣员 = Block(块)
-
分拣员的手一次能拿多个包裹 = Vector(向量)
概念二:内存层次
全局内存(Global Memory) → 慢、容量大(仓库) 本地内存(Local Memory) → 快、容量小(工作台) 寄存器(Register) → 极快、容量极小(手上拿的)
概念三:计算单元
向量单元(Vector Unit) → 处理加减乘除等简单运算 立方单元(Cube Unit) → 专门处理矩阵乘法(AI的核心)
第二课:你的第一个Ascend C程序
最简单的例子:向量加法
步骤1:理解问题
我们要实现:C[i] = A[i] + B[i]
比如:[1,2,3] + [4,5,6] = [5,7,9]
步骤2:C++实现(你熟悉的)
// 普通的C++实现
void vector_add_cpu(float* A, float* B, float* C, int n) {
for (int i = 0; i < n; i++) {
C[i] = A[i] + B[i];
}
}
问题:一次只计算一个数,非常慢!
步骤3:Ascend C实现思路
// Ascend C的思维方式: // 1. 把数据分成很多小块 // 2. 让芯片的多个核心同时计算不同的小块 // 3. 每个核心一次计算多个数(向量化)
步骤4:看一个真正的Ascend C核函数
// Ascend C核函数 - 先不用理解全部,只看结构
__global__ __aicore__ void vector_add_kernel(
float* A, // 输入A
float* B, // 输入B
float* C, // 输出C
int totalLength // 数据总长度
) {
// 1. 获取当前核的ID
int coreId = get_core_id();
// 2. 计算这个核负责的数据块
int dataPerCore = totalLength / get_core_num();
int startIdx = coreId * dataPerCore;
int endIdx = startIdx + dataPerCore;
// 3. 一次处理多个数据(向量化)
for (int i = startIdx; i < endIdx; i += 8) { // 一次处理8个数
// 这里会有特殊的向量指令
float8 vecA = load_vector(&A[i]); // 一次加载8个数
float8 vecB = load_vector(&B[i]);
float8 vecC = vecA + vecB; // 一次计算8个加法
store_vector(&C[i], vecC); // 一次存储8个数
}
}
第三课:核心概念详解
1. 核函数
// 核函数的特殊标记 __global__ __aicore__ void my_kernel(...)
-
__global__:这是一个在设备上运行的函数 -
__aicore__:这是为昇腾芯片设计的 -
重要:核函数从主机调用,在设备执行
2. 向量数据类型
Ascend C扩展了向量类型:
// 基本数据类型 向量类型(一次处理多个) float float8 // 一次处理8个float int int16 // 一次处理16个int half half16 // 一次处理16个half
3. 内置函数(Intrinsics)
// 数据搬运 __gm__ uint8_t* global_ptr; // 全局内存指针 LocalTensor<float> local_tensor; // 本地张量 DataCopy(local_tensor, global_ptr, ...); // 拷贝数据 // 向量计算 float8 a, b, c; c = Add(a, b); // 向量加法,一次加8个数
理解Ascend C与C/C++的对比
| 特性 | C/C++ | Ascend C |
|---|---|---|
| 执行位置 | CPU | 昇腾AI处理器 |
| 并行方式 | 需要手动写多线程 | 自动三级并行 |
| 内存管理 | 手动malloc/free | 分层内存自动管理 |
| 计算单元 | 通用ALU | 专用Vector/Cube单元 |
| 一次计算 | 1个数据 | 多个数据(向量) |
思考题1:
如果你要用普通C++实现两个长度为1024的向量加法:
-
你需要循环多少次?
-
如果CPU主频是3GHz,大概需要多少时间?
思考题2:
如果用Ascend C,假设:
-
芯片有8个核
-
每个核一次能处理8个数
-
同时开始计算
总共需要几步完成?
答案提示:
-
思考题1:1024次循环,大约几微秒
-
思考题2:1024 ÷ (8核 × 8数据/核) = 只需16步!
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐


所有评论(0)