一个基于昇腾处理器的异构系统通常包含 CPU 与昇腾 NPU。其中,CPU 及其内存称为 Host 与 Host Memory;NPU 及其内存称为 Device 与 Device Memory。
基于昇腾的应用程序通常包含两部分:一部分运行在 Host CPU 上,使用标准 C/C++ 编程;另一部分运行在 NPU 上,使用 Ascend C 编程语言编写。运行在 NPU 上的代码称为,需由 Host 代码调用执行。此外,Host 端需要通过 CANN Runtime API 完成以下操作:在 Host Memory 与 Device Memory 之间拷贝数据、启动 NPU 上的核函数、等待核函数执行完成等。Host 代码与核函数可编写在同一个 .asc 后缀文件中,由毕昇编译器完成异构编译。
为提升计算效率,NPU 上通常有多个计算核并发执行,每个核一般处理不同的数据。每个 NPU 的计算核称为 AI Core(AI 处理器的计算核心)。传统上,AI Core 遵循 SIMD(Single Instruction Multiple Data,单指令多数据流) 模型,通过一条指令同时操作多个数据实现并行计算。从 Ascend 950PR/Ascend 950DT架构开始,作为 SIMD 的补充(主要用于辅助离散类矢量算子开发),AI Core 也支持 SIMT(Single Instruction Multiple Thread,单指令多线程) 模型,通过一条指令驱动多个线程并行执行。
下图演示了运行在 Host CPU 上的代码通过调用 CANN Runtime API 将核函数下发到 AI Core 的流程。由于 Host Memory 与 Device Memory 拥有独立的内存空间,需要显式调用 Runtime API 进行数据传输。典型流程为:Host 代码将数据从 Host Memory 传输到 Device Memory,供核函数计算使用;等待核函数执行完成;最后将计算结果从 Device Memory 拷贝回 Host Memory。
图 1 Kernel调度示意图[object Object][object Object]
[object Object]