Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发

CANN 组织链接https://atomgit.com/cann
Runtime 仓库链接https://gitcode.com/cann/runtime


1. 任务描述与硬件队列的映射

GE 优化后的执行计划需要被 Runtime 翻译成具体的硬件提交命令。

1.1 任务描述符的构建

Runtime 接收来自 GE 的优化图后,将每个执行单元(包括 ops-nn 算子、自定义核函数、通信操作)封装成一个任务描述符 (Task Descriptor)

  • 硬件绑定:这个描述符详细说明了任务应由哪个硬件单元执行(Cube Unit, Vector Unit, DMA Engine, 或 HCCL 引擎),以及所需的资源(Local Memory 块、Global Memory 偏移量)。
  • 流 ID 关联:每个任务描述符都被标记了它所属的执行流(Stream ID),这是 Runtime 实现并发调度的基础。

1.2 硬件提交队列的管理

NPU 硬件通常通过多个提交队列(Submission Queues)接收来自 Runtime 的任务。

  • 队列的复用 :Runtime 负责管理这些提交队列。为了避免频繁的硬件上下文切换,Runtime 倾向于批量提交属于同一执行流的多个任务描述符,形成一个连续的硬件工作块

2. 执行流的同步与依赖链的驱动

Runtime 的核心职能在于确保任务按照 GE 定义的依赖图顺序执行。

2.1 依赖等待机制(Wait/Signal)

任务间的同步依赖通过硬件同步机制实现,Runtime 负责操作这些机制。

  • 硬件同步点(Fence) :当一个任务 T B T_B TB 依赖于 T A T_A TA 完成时,Runtime 会在 T B T_B TB 提交前,向硬件写入一个同步指令(Fence)。该指令指示硬件核心等待 T A T_A TA 对应的完成信号被硬件更新后,才能启动 T B T_B TB 的执行。
  • 异步操作的同步:这对于通信操作(HCCL)尤为重要。例如,在执行依赖于远程数据的计算任务前,Runtime 必须等待 SHMEM/HCCL 提交的完成信号。

2.2 任务调度策略:抢占与优先级

在多任务(如训练和推理同时进行)或资源竞争场景下,Runtime 需要实施优先级调度。

  • 上下文优先级:推理任务(尤其是低延迟要求的服务)会被赋予更高的优先级。如果高优先级的任务到达,Runtime 可能会向正在执行的低优先级任务(如后台的内存整理)发送抢占信号,以确保关键计算的延迟达标。

3. 资源回收与上下文清理

在任务执行完成后,Runtime 负责清理该任务在所有硬件资源上的引用。

  • 内存句柄释放:释放与该任务相关的 Local Memory 块和任何临时 Global Memory 句柄,将其返回给内存池。
  • 流同步清理:确保所有依赖于该任务的后续任务都能被正确唤醒,并清理掉已完成的同步点标记。

CANN 组织链接https://atomgit.com/cann
Runtime 仓库链接https://gitcode.com/cann/runtime

相关推荐
云泽8082 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦2 小时前
GO---可见性规则
开发语言·golang
逝水无殇2 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子3 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ4 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香4 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI4 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second604 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴4 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
bksczm4 小时前
linux之线程概念和控制
linux·开发语言·c++