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