编程模型概述
如异构系统章节所述,基于昇腾处理器的应用程序通常分为两部分:Host代码与Device代码。其中,Host代码运行在CPU上,负责设备资源管理、Host Memory与Device Memory间的数据搬运及任务调度等;Device代码运行在NPU(神经网络处理器)上,专门执行实际的计算任务。本编程指南重点讲解如何基于Ascend C编程语言编写Device代码,以及如何通过Host代码完成Device代码的调度与执行。
并行执行模型:SPMD
SPMD(Single Program, Multiple Data,单程序多数据)是一种程序级并行模型:多个独立计算单元同时执行同一份程序代码,但各自处理不同的数据分片。
SIMD(Single Instruction, Multiple Data,单指令多数据)与SIMT(Single Instruction, Multiple Threads,单指令多线程)同属指令驱动的并行执行范式:SIMD由单条指令同时驱动多个运算单元处理不同数据,硬件效率高但分支能力受限;SIMT以单条指令驱动多个线程并行执行,线程可独立分支,灵活性更强。
在Ascend C编程中,SPMD与SIMD/SIMT形成三种典型组合:
- SPMD+SIMD:将AI Core抽象为逻辑核(Block),所有Block运行相同代码,以Block为视角编程,Block内部调用SIMD指令;
- SPMD+SIMT:将硬件抽象为Grid→Thread Block→Thread架构,以Thread为视角编程,关注每个Thread需处理的数据;
- SPMD+SIMD/SIMT混合:核函数本质遵循SPMD+SIMD,内部以向量函数(Vector Function, VF)为粒度进行SIMD与SIMT切换——SIMT VF抽象为一个SIMT Thread Block,内部基于Thread编程;SIMD VF内部直接调用SIMD指令。
为简化表述,下文以SIMD和SIMT分别指代对应的编程模型。二者定义了指令驱动多计算单元协同工作的核心机制,是提升数据吞吐量、优化计算性能的关键技术,也是Ascend C编程的核心内容,下文将分别展开介绍。
SIMD(单指令多数据)
核心概念:SIMD(Single Instruction, Multiple Data)是一种数据并行模型,核心逻辑是:一条指令在同一个时钟周期内,对多个数据元素执行完全相同的操作,实现数据的批量并行处理。
核心特征:
- 单指令驱动:所有并行计算单元同步执行同一条指令,操作完全一致;
- 数据同构:要求参与计算的数据类型统一、长度相同,确保指令可批量处理;
- 同步执行:所有数据的操作在同一个指令周期内完成,无独立调度逻辑,执行节奏完全统一。
适用场景:主要适配数据密集、操作规整、无分支或分支极少的计算任务,典型场景包括:
- 图像像素处理(如灰度化、滤波、像素缩放);
- 音频信号分析(如降噪、信号预处理);
- 矩阵乘法、卷积等深度学习核心运算;
- 逐元素数学函数(如向量加减、乘除、指数/对数运算)。
SIMD核函数(Kernel)编程四步法:SIMD编程模式下,每个AI Core运行同一份核函数(Kernel),分别处理不同的数据块,具体步骤如下:
- Tiling(分块)设计:对全局超大数据进行均匀切分,为各AI Core分配大小均衡的独立数据分片,规避单核算力瓶颈,实现全域负载均衡。
- 数据搬入:调用SIMD专用API,将计算所需数据从Device Memory(通常为HBM)搬运到AI Core的本地缓存,减少全局内存访问延迟。
- 数据计算:调用向量指令,一次处理多个同构数据;需注意,数据搬运与计算过程通常异步执行,需插入同步指令,确保计算时数据已就绪,保证结果准确。
- 数据搬出:调用SIMD专用API,将本地缓存中已完成计算的结果搬运回Device Memory,供后续任务使用。
SIMT(单指令多线程)
核心概念:SIMT是一种线程并行模型,核心逻辑是:一条指令同时驱动多个独立线程,每个线程仅处理一个数据元素;指令同步下发,但线程可根据代码分支(如if-else)独立执行,灵活性更高。
核心特征:
- 单指令控制多线程:一条指令同步调度一组线程(如32个线程组成的Warp),统一发起并执行;
- 线程独立:每个线程拥有独立的程序计数器、寄存器和执行状态,可单独处理一个数据元素,支持复杂分支逻辑;
- 硬件自动调度与掩蔽:线程的调度、切换,以及不活跃线程的掩蔽(Masking)均由硬件自动完成,无需程序员手动管理,降低开发复杂度。
适用场景:主要适配不规则数据访问、分支密集、稀疏计算等任务,典型场景包括:
- 深度学习中的稀疏算子(如稀疏卷积、稀疏矩阵运算);
- 带有复杂if-else分支的逐元素运算;
- 具有动态数据依赖的算法(如并行前缀和、排序网络)。
SIMT核函数(Kernel)编程四步法:SIMT编程模式下,同一份程序运行在每个线程上,各线程处理不同的数据元素,具体步骤如下:
- Tiling(分块)设计:将整体任务拆分为多个独立线程,使线程索引与数据索引一一对应,确保每个线程处理唯一的数据元素,避免数据重复或遗漏。
- 数据搬入:通过指针直接访问Device Memory,无需像SIMD那样调用专用API;硬件会自动将所需数据从Device Memory加载到线程的寄存器中,简化开发流程。
- 数据计算:编程方式类似CPU标量代码,支持分支、循环等复杂控制逻辑;数据搬运与计算过程通常无需显式同步,若涉及多线程协作(如使用共享内存),需插入同步指令。
- 数据搬出:通过指针直接将计算结果写回Device Memory,无需调用专用API,与CPU编程逻辑更接近,降低上手难度。
📌 提示:Host端可通过
<<<>>>语法糖调用并运行核函数(Kernel)。
AI Core硬件基础
上述SIMD与SIMT两类并行执行模型,在昇腾AI处理器中都有清晰的物理硬件对应。Device端的核心计算单元为AI Core,是昇腾AI处理器的主要算力载体。单枚昇腾NPU芯片通常集成多个AI Core,各核心可并行协作,大幅提升设备整体计算吞吐量。每个AI Core内部架构模块化分工明确,核心组成组件如下:
-
标量处理单元:负责处理控制流(如分支、循环)和地址计算,功能类似传统CPU核心,是AI Core的“控制中枢”。
-
向量处理单元:承担向量运算任务,是SIMD、SIMT两种并行执行模型的主要硬件载体,不同昇腾硬件架构对两类并行模式的适配能力存在差异。
-
矩阵运算单元:针对矩阵乘加运算做了深度硬件优化,仅支持SIMD执行模式,是深度学习卷积、全连接层等核心算子的高效加速单元。
-
本地存储:AI Core内置的高速存储资源,用于缓存实时计算所需数据,可有效规避全局Device Memory的高延迟访问问题,显著提升整体计算效率。
需重点区分架构差异:Ascend 950PR&950DT系列产品之前的架构中,AI Core仅支持SIMD单一执行模型;自Ascend 950PR&950DT系列产品架构起,AI Core向量处理单元同时兼容SIMD、SIMT两种并行模型,可根据计算任务灵活选择并行方案,适配更多复杂业务场景。
💡 为什么要了解AI Core内部结构?
理解AI Core硬件架构是开发高性能算子的前提:只有明确数据需主动搬运至本地存储,才能充分发挥SIMD的高带宽算力优势;只有掌握向量处理单元的硬件特性,才能主动将计算逻辑向量化,最大化发挥硬件峰值性能,避免算力浪费。
AI Core编程模型
为提升向量计算在复杂控制流、离散访存等场景下的编程灵活性,新同构架构对SIMD与SIMT进行了深度融合:矩阵计算单元延续SIMD设计,向量计算单元则在SIMD的基础上引入SIMT能力,由此确立了以SIMD为主、SIMT为辅的新同构编程模型。在该模型下,矩阵计算和向量计算中的SIMD部分配置了超过90%的算力,为密集计算带来高性能与高算力利用率;向量计算中的SIMT部分则作为灵活性补充,专门应对复杂控制流、离散访存等不规则场景,提升此类场景下算法开发与优化的效率。
SIMD编程(主流范式,全系列标准支持)
- 能力范围:支持向量计算、矩阵计算,以及向量与矩阵的融合计算,覆盖深度学习的大部分核心场景;
- 适用场景:规整的、高密度的数据并行任务,如卷积、矩阵乘、逐元素变换等,是昇腾NPU开发的主流选择;
- 优势:能效比高,指令执行开销低,可充分发挥硬件性能,接近AI Core的峰值计算能力;
- 学习路径:详见AI Core SIMD编程;算子开发流程参见SIMD算子实现。
SIMT编程(辅助补充)
- 能力范围:仅支持向量计算,不支持矩阵运算或向量与矩阵的融合计算,功能范围相对有限;
- 适用场景:离散数据访问、复杂分支控制的向量算子,也适合熟悉SIMT模型的开发者快速上手Ascend C;
- 限制:当前仅支持Ascend 950PR&950DT系列产品。
- 学习路径:详见AI Core SIMT编程;算子开发参见SIMT算子实现。
SIMD与SIMT混合编程
SIMD与SIMT混合编程的核函数(Kernel)底层仍以SIMD编程模型为基础。开发者可在核函数(Kernel)内部灵活组合两类编程逻辑:先通过SIMT逻辑处理稀疏索引、复杂分支等不规则计算,输出规整化的数据块;再通过SIMD高吞吐的向量/矩阵运算处理规整数据,兼顾代码灵活性与硬件高性能,适配复杂混合计算场景。详细实现方法请参考AI Core SIMD与SIMT混合编程。
AI Core编程小结
Ascend C采用SIMD+SIMT双模并行的设计,既保留了SIMD高能效、高吞吐量的优势,又通过SIMT模型补齐了离散数据、复杂分支等不规则场景的计算能力,实现对全场景计算任务的高效适配。实际开发中,开发者可根据算法的访存模式(连续规整/离散随机)、分支密度(低分支/高分支)及并行粒度,灵活选用单一编程模型或混合编程方案。此外,Host侧通过CANN Runtime API提供内存管理、任务调度等能力,与Device侧代码协同工作,共同实现异构计算的高效运行。
📌 下一步:如果您主要开发规整的高性能算子,建议直接阅读AI Core SIMD编程;如果您需要处理稀疏数据或复杂分支逻辑,可从AI Core SIMT编程开始学习。
AI CPU编程模型
AI CPU是Device上的辅助处理器(基于ARM架构),主要用于执行AI Core难以高效处理的任务,例如控制流复杂、数据依赖强的逻辑等。其编程模型遵循通用CPU编程规范,采用标准C/C++语法即可开发。详细开发指南请阅读AI CPU编程。