Ascend C 编程模型概述 编程模型概述【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit如异构系统章节所述基于昇腾处理器的应用程序通常分为两部分Host代码与Device代码。其中Host代码运行在CPU上负责设备资源管理、Host Memory与Device Memory数据搬运及任务调度等Device代码运行在NPU神经网络处理器上专门执行实际的计算任务。本编程指南重点讲解如何基于Ascend C编程语言编写Device代码以及如何通过Host代码完成Device代码的调度与执行。并行执行模型SIMD与SIMT为编写高性能的Device端代码首先需要理解底层的并行计算原理。在高性能并行编程领域SIMD和SIMT是两种主流的并行执行模型它们定义了指令驱动多计算单元协同工作的核心机制是提升程序数据吞吐量、优化计算性能的关键技术也是学习Ascend C编程的核心内容。SIMD单指令多数据流核心概念SIMDSingle Instruction Multiple Data是一种数据并行模型核心逻辑是一条指令在同一个时钟周期内对多个数据元素执行完全相同的操作实现数据的批量并行处理。核心特征单指令驱动所有并行计算单元同步执行同一条指令操作完全一致数据同构要求参与计算的数据类型统一、长度相同确保指令可批量处理同步执行所有数据的操作在同一个指令周期内完成无独立调度逻辑执行节奏完全统一。适用场景主要适配数据密集、操作规整、无分支或分支极少的计算任务典型场景包括图像像素处理如灰度化、滤波、像素缩放音频信号分析如降噪、信号预处理矩阵乘法、卷积等深度学习核心运算逐元素数学函数如向量加减、乘除、指数/对数运算。SIMD核函数Kernel编程四步法SIMD编程遵循SPMD模型Single Program Multiple Data单程序多数据即每个AI Core运行同一份核函数但负责处理不同的数据块具体步骤如下Tiling分块设计对全局超大数据进行均匀切分为各AI Core分配大小均衡的独立数据分片精准适配SPMD多核并行架构规避单核算力瓶颈实现全域负载均衡。数据搬入调用SIMD专用API将计算所需的数据从Device Memory通常为HBM搬运到AI Core的本地缓存减少全局内存访问延迟。数据计算调用向量指令一次处理多个同构数据需注意数据搬运与计算过程通常是异步执行的需插入同步指令确保计算时数据已就绪保证结果准确。数据搬出调用SIMD专用API将本地缓存中完成计算的结果搬运回Device Memory供后续任务使用。SIMT单指令多线程核心概念SIMTSingle Instruction Multiple Threads是一种线程并行模型核心逻辑是一条指令同时驱动多个独立线程每个线程仅处理一个数据元素指令同步下发但线程可根据代码分支如if-else独立执行灵活性更高。核心特征单指令控制多线程一条指令同步调度一组线程如32个线程组成的Warp统一发起执行指令线程独立每个线程拥有独立的程序计数器、寄存器和执行状态可单独处理一个数据元素支持复杂分支逻辑硬件自动调度与掩蔽线程的调度、切换以及不活跃线程的掩蔽Masking均由硬件自动完成无需程序员手动管理降低开发复杂度。适用场景主要适配不规则数据访问、分支密集、稀疏计算等场景典型场景包括深度学习中的稀疏算子如稀疏卷积、稀疏矩阵运算带有复杂if-else分支的逐元素运算具有动态数据依赖的算法如并行前缀和、排序网络。SIMT核函数Kernel编程四步法SIMT编程同样遵循SPMD模型即同一份程序运行在每个线程上每个线程处理不同的数据元素具体步骤如下Tiling分块设计将整体任务拆分为多个独立线程使线程索引与数据索引一一对应确保每个线程处理唯一的数据元素避免数据重复或遗漏。数据搬入通过指针直接访问Device Memory无需调用SIMD那样的专用API硬件会自动将所需数据从Device Memory加载到线程的寄存器中简化开发流程。数据计算编程方式类似CPU标量代码支持分支、循环等复杂控制逻辑数据搬运与计算过程通常无需显式同步若涉及多线程协作如使用共享内存需插入同步指令。数据搬出通过指针直接将计算结果写回Device Memory无需调用专用API与CPU编程逻辑更接近降低上手难度。提示Host端可通过语法糖来调用并运行核函数。AI Core硬件基础上述两类抽象的并行执行模型在昇腾AI处理器中都有着清晰的物理硬件对应。Device端的核心计算单元为AI Core是昇腾AI处理器的核心算力载体。单枚昇腾NPU芯片通常集成多个AI Core各核心可并行协作大幅提升设备整体计算吞吐量。每个AI Core内部架构模块化分工明确核心组成组件如下标量处理单元负责处理控制流如分支、循环和地址计算功能类似传统CPU核心是AI Core的“控制中枢”。向量处理单元承担核心向量运算任务是SIMD、SIMT两种并行执行模型的主要硬件载体不同昇腾硬件架构对两类并行模式的适配能力存在差异。矩阵运算单元针对矩阵乘加运算做深度硬件优化仅支持SIMD执行模式是深度学习卷积、全连接层等核心算子的极速加速单元。本地存储AI Core内置的高速存储资源用于缓存实时计算所需数据可有效规避全局Device Memory的高延迟访问问题显著提升整体计算效率。需重点区分架构差异Ascend 950PR/Ascend 950DT架构之前的AI Core仅支持SIMD单一执行模型自Ascend 950PR/Ascend 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编程辅助补充仅限Ascend 950PR/Ascend 950DT能力范围仅支持向量计算不支持矩阵运算或向量与矩阵的融合计算功能范围相对有限适用场景离散数据访问、复杂分支控制的向量算子同时适合熟悉SIMT模型的开发者快速上手Ascend C限制当前仅支持Ascend 950PR/Ascend 950DT芯片架构学习路径详见AI Core SIMT编程算子开发参见SIMT算子实现。SIMD与SIMT混合编程SIMD与SIMT混合编程的Kernel底层仍以SIMD编程模型为基础。开发者可在Kernel函数内部灵活组合两类编程逻辑通过SIMT逻辑处理稀疏索引、复杂分支等不规则计算场景输出规整化数据块再通过SIMD高吞吐向量/矩阵运算处理规整数据兼顾代码灵活性与硬件高性能适配复杂混合计算场景。详细实现方法请参考AI Core SIMD与SIMT混合编程。AI Core编程小结Ascend C采用SIMDSIMT双模并行的核心设计既保留了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编程。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考