[object Object]
基于昇腾处理器的异构系统,核心是通过两类功能互补的处理器协同工作,兼顾通用计算与高密度并行计算,实现整体性能最优。
[object Object]
基于昇腾异构系统的应用程序必然包含两部分代码,分工明确、协同运行:
[object Object]
Host侧通过调用CANN Runtime API 完成与 Device 的协同工作。典型流程如下:
- 分配内存:在Device Memory中申请输入/输出所需的空间。
- 搬运数据:将输入数据从Host Memory拷贝到 Device Memory(数据需进入Device侧才能被 NPU 访问)。
- 启动 NPU 计算任务:调用 Device 侧预先编写的,NPU 开始并行计算。
- 同步等待:Host 端等待 NPU 执行完成,确保数据计算完整(避免未完成就读取结果)。
- 回传结果:将计算结果从 Device Memory 拷贝回 Host Memory,供后续处理。
[object Object]
NPU是Device侧的计算核心,而 AI Core 则是NPU内部的“最小计算单元”。一枚NPU芯片通常集成多个AI Core,可并行处理不同的数据块,大幅提升整体计算吞吐量。
每个AI Core内部结构高度优化,专门适配并行计算需求,核心组件包括:
- 标量处理单元:处理控制流(如分支、循环)和地址计算,类似传统CPU核心,是AI Core的“控制核心”。
- 向量处理单元:执行向量运算,是SIMD/SIMT两种并行模型的主要载体。不同昇腾芯片架构对两种模式的支持有所差异。
- 矩阵运算单元:专门优化矩阵乘加运算,仅兼容 SIMD模式,是深度学习卷积、全连接层等算子的“性能加速核心”。
- 本地存储:用于缓存计算所需的数据,有效降低对全局Device Memory的访问延迟,提升计算效率。
[object Object]
SIMD(Single Instruction Multiple Data)与 SIMT(Single Instruction Multiple Threads)是昇腾AI Core支持的两种核心并行执行模型,也是算子编程的关键。两者在核心逻辑、适用场景上差异显著,对比如下:
[object Object]
- Tiling(分块):将数据划分为均匀的块,每个AI Core负责一块,实现负载均衡。
- 数据搬入:一般需要显式调用数据搬运API将数据从Device Memory搬到本地存储。
- 数据计算:一般调用SIMD指令对应的API完成计算。注意数据搬运与计算异步,一般需插入同步指令。
- 结果搬出:一般需要显式调用数据搬运API将本地存储中的结果写回Device Memory。
[object Object]
- Tiling(分块):建立线程索引与数据索引的一一对应关系。
- 数据搬入:通过指针直接访问Device Memory,硬件自动加载到寄存器,一般无需显式调用数据搬运API。
- 数据计算:一般编写标量代码(支持分支、循环);多线程协作时需插入同步指令。
- 结果搬出:一般可通过指针将结果直接写回Device Memory,无需显式调用数据搬运API。
[object Object]
Ascend 950PR/Ascend 950DT架构兼容SIMD与SIMT双编程模型,确立了SIMD为主、SIMT为辅的分层编程架构定位。在算力承载层面,AI Core整机90%以上的计算吞吐量均由SIMD并行机制承载,是硬件算力高效释放的核心路径与主力范式,可充分发挥架构高性能、高算力利用率的核心优势;SIMT模型则作为差异化能力补充,针对性弥补离散、非规整业务场景的开发短板,有效提升复杂分支、离散访存等特殊场景的开发灵活性。
[object Object]
昇腾异构计算的核心逻辑可概括为:Host(CPU)调度 + Device(NPU)执行
- Host侧:统筹资源、调度任务。
- Device侧:核心是 AI Core,支持 SIMD(主力模型,全系列兼容)和 SIMT(补充模型,适配复杂场景)两种并行模式。
算子编程的关键:根据数据的规整度、访存模式、分支密度,选择合适的编程模型,充分发挥AI Core的硬件性能,即可高效开发出高性能的Ascend C算子。