昇腾训练营报名链接: 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的向量加法:

  1. 你需要循环多少次?

  2. 如果CPU主频是3GHz,大概需要多少时间?

思考题2
如果用Ascend C,假设:

  • 芯片有8个核

  • 每个核一次能处理8个数

  • 同时开始计算

总共需要几步完成?

答案提示

  • 思考题1:1024次循环,大约几微秒

  • 思考题2:1024 ÷ (8核 × 8数据/核) = 只需16步!

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐