ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CANN Runtime编程模型详解:Host-Device异步并行、Stream任务队列与典型执行流程

CANN Runtime编程模型详解:Host-Device异步并行、Stream任务队列与典型执行流程 CANN Runtime编程模型详解Host-Device异步并行、Stream任务队列与典型执行流程【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtimeCANN Runtime 是 CANN 软件栈中负责驱动 AI 处理器NPU执行与管理 AI 计算任务的核心组件。它通过统一的 API 提供Host-Device 异步并行编程模型Stream 任务队列机制与典型执行流程帮助应用与 AI 框架高效利用 NPU 算力。本文面向新手用通俗的语言讲清这套编程模型的核心概念帮你快速上手 CANN Runtime 开发。一、CANN Runtime 是什么可以把 CANN Runtime 理解为一位总指挥主机侧的 CPU 负责编排任务准备数据、下发算子NPU 侧的 AI 处理器负责执行计算Runtime 则负责把任务调度到正确的硬件上并管理设备、内存、任务队列等资源。它围绕计算任务的执行生命周期提供几类核心能力功能模块核心能力Device 管理指定/复位/查询计算设备Context 管理逻辑运行环境实现资源隔离Stream 管理创建任务队列、异步下发与同步Memory 管理主机/设备内存的申请、释放、拷贝Kernel 管理算子Kernel加载与执行Event 管理跨 Stream 同步与时间戳记录二、Host-Device 异步并行编程模型理解 CANN Runtime 编程模型先记住两个角色主机HostX86 或 ARM 服务器 CPU通过 PCIe、HCCS 等总线与设备互联负责任务编排。设备Device / NPU安装 AI 处理器的硬件提供神经网络等高性能计算能力。Host 与 Device 协作时有三个关键特征内存空间相互独立️ 主机和设备各有自己的内存必须显式调用拷贝接口如aclrtMemcpy在两者间搬数据设备访问本地内存才能发挥最佳性能。异步并行执行⚡ 主机把任务下发到设备后立即返回不等待执行完成CPU 与 NPU 加速器并行工作。需要结果时再调用同步接口如aclrtSynchronizeStream显式等待。这样能有效隐藏数据传输与主机处理延迟提升整体吞吐。任务下发到 Stream 执行异步接口通常带 Stream 参数表示把任务放进哪条任务队列。快速判断接口同步还是异步带 Stream 参数的 API如aclrtMemcpyAsync一般是异步的立即返回不带 Stream 的 API如aclrtMemcpy一般是同步的阻塞到操作完成。三、Stream 任务队列同流保序跨流并行 Stream 是设备提供的逻辑任务执行队列。把 Stream 想象成多条流水线同一个 Stream 内任务严格按先进先出FIFO顺序执行保证依赖关系正确不同 Stream 之间任务可以并行执行从而充分利用 NPU 上多种加速器。比如主机依次下发 Kernel1、Kernel2、Kernel3Kernel1 与 Kernel3 在同一 StreamKernel3 需等 Kernel1 完成才开始Kernel2 在另一条 Stream可与 Kernel1、Kernel3并行执行。Device、Context、Stream 的关系理解 Stream 还要知道它归属于谁DeviceAI 处理设备Host 与 Device 通常为 1:N 关系ContextDevice 的逻辑运行环境N:1 隶属于 Device负责管理 Stream、Event 等资源不同 Context 间资源完全隔离Stream任务队列N:1 隶属于某个 ContextTask可加入 Stream 的任务包括计算任务、内存拷贝、事件同步等。多线程程序建议每个线程创建并使用各自的 Stream下发任务避免多线程并发写同一条 Stream 引入锁开销与乱序问题。四、典型执行流程从初始化到取回结果 基于 CANN Runtime 的典型执行流程如下图所示左侧 Host 侧负责下发任务右侧 Device 侧的任务调度器从队列取任务分发给 CPU 执行器或 AI Core 等加速单元执行完成后逐级反馈结果从用户编程视角完整流程可归纳为 10 步步骤操作关键 API1️⃣设置计算设备隐式创建默认 Context 和默认 StreamaclrtSetDevice2️⃣在当前 Context 下创建 StreamaclrtCreateStream3️⃣申请主机内存aclrtMallocHost4️⃣申请设备内存aclrtMalloc5️⃣主机→设备同步拷贝输入数据aclrtMemcpyH2D6️⃣向 Stream 异步下发计算任务内核代码首次加载到设备myKernelblocks, nullptr, stream()7️⃣同步等待 Stream 中任务完成aclrtSynchronizeStream8️⃣设备→主机同步拷贝结果aclrtMemcpyD2H9️⃣释放主机与设备内存aclrtFree/aclrtFreeHost复位设备释放资源aclrtResetDeviceForce几个细节值得新手注意步骤 6 是异步的下发内核后立即返回任务描述符进入该 Stream 对应的任务队列设备侧调度器按队列优先级取任务分派到空闲的 AI Core、AI CPU 等加速单元执行步骤 7 通过轮询中断机制同步任务队列状态Stream 上全部任务完成后接口才返回对于简单单设备应用可直接使用默认 Context 和默认 StreamStream 参数传NULL即可不必显式创建。一个真实可运行的完整示例见 hello_cann 示例代码配套说明文档为 Runtime简介。五、高性能实践建议 编写高性能应用时遵循以下原则保持 Host 与 Device 异步执行主机侧持续下发足够多的任务让 NPU 始终处于计算状态避免设备空转多 Stream 并发CANN Runtime 可协同调度 AI Core、AI CPU、DVPP数字视觉预处理、随机数生成器等多种硬件加速器建议按算子执行硬件类型划分多条 Stream按场景选择线程模型单线程性能足够时单线程内创建并使用多个 Stream 即可单线程下发不足时改用多线程且每个线程绑定各自的 Stream小任务合并当单个任务占不满 AI Core 时可用多 Stream 下发可并行任务提升算力利用率。更多开发细节可参考编程模型完整文档Runtime编程模型异步任务执行开发指南03-01 异步任务概览Event 同步机制03-05 事件管理Stream 管理 API 参考06_stream_management.mdStream 编程示例目录example/1_basic_features/stream/Runtime 核心实现源码src/runtime/六、小结 CANN Runtime 的编程模型可以浓缩为一句话主机与设备内存独立、异步并行任务经 Stream 队列同流保序、跨流并行显式同步获取结果。掌握 Host-Device 异步并行思想与 Stream 任务队列机制配合上文的典型执行流程你就能写出高效利用 NPU 算力的 CANN Runtime 应用。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表