cann/asc-devkit:异构系统编程模型
异构系统与编程模型【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit本文作为算子编程快速入门章节将从昇腾异构系统基础入手逐步拆解编程模型核心要素帮助您快速建立昇腾算子编程的整体认知为后续实操开发奠定基础。什么是异构系统基于昇腾处理器的异构系统核心是通过两类功能互补的处理器协同工作兼顾通用计算与高密度并行计算实现整体性能最优。角色组成职责Host主机CPU Host Memory通用计算、资源管理、任务调度、统筹协调Device设备昇腾NPU Device Memory高密度并行计算深度学习推理/训练、图像处理等通俗理解Host如同项目经理负责规划、分配、协调Device如同专业工程师团队专注于高效完成高强度、重复性的计算工作。两者分工协作提升整体效率。昇腾应用程序的组成基于昇腾异构系统的应用程序必然包含两部分代码分工明确、协同运行代码类型运行位置编程语言核心职责Host代码CPUHost侧标准C/C管理Device设备、搬运数据、启动NPU任务、同步状态Device代码NPUDevice侧Ascend C执行具体的并行计算任务称为核函数✅便捷提示Host代码与Device代码可编写在同一个.asc文件中由毕昇编译器自动识别、分别编译简化开发流程。Host与Device的协作流程Host侧通过调用CANN Runtime API完成与Device的协同工作。典型流程如下分配内存在Device Memory中申请输入/输出所需的空间。数据搬入将输入数据从Host Memory拷贝到Device Memory数据需进入Device侧才能被NPU访问。启动NPU计算任务调用Device侧预先编写的核函数NPU开始并行计算。同步等待Host端等待NPU执行完成确保数据计算完整避免未完成就读取结果。数据搬出将计算结果从Device Memory拷贝回Host Memory供后续处理。关键点Host与NPU是异步执行的第4步的同步必不可少否则可能读取到未完成的数据。AI CoreNPU的核心计算单元NPU是Device侧的计算核心而AI Core则是NPU内部的“最小计算单元”。一枚NPU芯片通常集成多个AI Core可并行处理不同的数据块大幅提升整体计算吞吐量。每个AI Core内部结构高度优化专门适配并行计算需求核心组件包括标量处理单元处理控制流如分支、循环和地址计算类似传统CPU核心是AI Core的“控制核心”。向量处理单元执行向量运算是SIMD/SIMT两种并行模型的主要载体。不同昇腾芯片架构对两种模式的支持有所差异。矩阵运算单元专门优化矩阵乘加运算仅兼容SIMD模式是深度学习卷积、全连接层等算子的“性能加速核心”。本地存储用于缓存计算所需的数据有效降低对全局Device Memory的访问延迟提升计算效率。架构演进Ascend 950PR/Ascend 950DT架构之前AI Core仅支持SIMD从Ascend 950PR/Ascend 950DT架构开始向量处理单元同时支持SIMD和SIMT为不同算子任务提供更灵活的选择。SIMD与SIMT并行模型SIMDSingle Instruction Multiple Data与SIMTSingle Instruction Multiple Threads是昇腾AI Core支持的两种核心并行执行模型也是算子编程的关键。两者在核心逻辑、适用场景上差异显著对比如下模型全称核心思想通俗比喻适用场景SIMD单指令多数据一条指令同时操作多个同构数据一个厨师同时翻炒多份相同的菜规整、高密度计算矩阵乘、卷积、逐元素运算SIMT单指令多线程一条指令驱动多个独立线程一个厨师指挥多个助手各切各的菜不规则访问、分支密集、稀疏计算如稀疏卷积SIMD核函数编程基本步骤遵循SPMD模型SPMDSingle Program, Multiple Data将每个AI Core抽象成一个Block通过内置变量block_idx作为Block索引。每个Block执行同一份算子Kernel代码基于block_idx划分每个Block的数据处理范围实现多核负载均衡与并行调度。Tiling分块将数据划分为均匀的块每个AI Core负责一块实现负载均衡。数据搬入需要显式调用数据搬运API将数据从Device Memory搬到本地存储。数据计算调用SIMD指令对应的API完成计算。注意数据搬运与计算异步需插入同步指令。数据搬出需要显式调用数据搬运API将本地存储中的结果写回Device Memory。SIMT核函数编程基本步骤遵循SPMD模型SPMDSingle Program, Multiple Data每个线程运行同一份程序但每个线程处理不同的数据元素。Tiling分块建立线程索引与数据索引的一一对应关系。数据搬入通过指针直接访问Device Memory硬件自动加载到寄存器无需显式调用数据搬运API。数据计算编写标量代码支持分支、循环多线程协作时需插入同步指令。数据搬出可通过指针将结果直接写回Device Memory无需显式调用数据搬运API。提示Host端可通过语法糖或CANN Runtime API调用并运行核函数。编程模型选型指南为提升向量计算在复杂控制流、离散访存等场景下的编程灵活性在采用SIMD与SIMT深度融合的新同构架构中矩阵计算单元延续SIMD设计向量计算单元则在SIMD的基础上引入SIMT能力。这一设计确立了以SIMD为主、SIMT为辅的新同构编程模型。在该模型下矩阵计算和向量计算中的SIMD部分配置了超过90%的算力为密集计算带来高性能与高算力利用率向量计算中的SIMT则作为灵活性补充专门应对复杂控制流、离散访存等不规则场景提升这类场景下算法开发和优化的效率。编程模型支持范围适用场景芯片支持SIMD(主向量、矩阵、融合计算规整、高密度任务卷积、矩阵乘、逐元素变换昇腾全系列SIMT(辅仅向量计算离散访问、复杂分支、稀疏计算仅限Ascend 950PR/Ascend 950DTSIMDSIMT混合向量、矩阵、融合计算用SIMT处理不规则逻辑用SIMD批量高效计算仅限Ascend 950PR/Ascend 950DT快速选型建议开发常规高性能算子如矩阵乘、逐元素算子时建议使用SIMD编程模型。该模型支持昇腾全系列产品且具有较高的能效比。对于涉及离散数据或复杂分支逻辑的算子建议使用SIMT编程模型。小结昇腾异构计算的核心逻辑可概括为HostCPU调度 DeviceNPU执行Host侧统筹资源、调度任务。Device侧核心是AI Core支持以SIMD为主、SIMT为辅的新同构编程模型。算子编程的关键根据数据的规整度、访存模式、分支密度选择合适的编程模型充分发挥AI Core的硬件性能即可高效开发出高性能的Ascend C算子。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考