新闻详情

新闻详情

首页 / 资讯中心 / 详情

CANN Runtime源码解析:Stream背后的SQ/CQ异步机制与任务调度原理

发布时间:2026/9/1 10:00:59来源:尧图网络
CANN Runtime源码解析:Stream背后的SQ/CQ异步机制与任务调度原理
CANN Runtime源码解析Stream背后的SQ/CQ异步机制与任务调度原理【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtimeCANN Runtime 是昇腾 AI 处理器上连接应用与硬件的运行时系统。本文深入解析 CANN Runtime 源码中Stream流背后的核心机制任务如何通过SQ提交队列Submission Queue与 CQ完成队列Completion Queue异步下发到设备执行以及任务调度线程如何管理任务的下发、回收与同步。掌握这些原理能帮你更快定位算子卡住、Stream 同步超时、任务提交失败等常见问题。先给结论CANN Runtime 的异步执行模型可以概括为一条流水线——Stream任务序列→ TaskInfo任务对象→ SQE队列条目→ Engine调度线程→ 设备执行 → CQE完成事件→ 任务回收。 Stream 只是这条流水线在用户侧的入口真正干活的是设备侧的 SQ/CQ 环形队列和 Runtime 内的调度线程。一、Stream 是什么按序执行的任务序列源码中 Stream 的定位只有一句话// A stream is a sequence of task that execute in order.—— stream.hpp#L170-L171也就是说Stream 本身不执行任务它是一个任务 FIFO。你在aclrtMemcpyAsync、aclrtLaunchKernel等接口中传入的 Stream 句柄本质是告诉 Runtime把这次操作追加到这个序列的队尾。Stream 内保证顺序执行不同 Stream 之间则天然并行——这正是多流并行加速的基础。1.1 每个 Stream 都自带一对 SQ/CQ打开 stream.hpp 可以看到Stream 类内部持有sqId_、sqAddr_、sqDepth_、cqId_等成员关键常量定义在文件头部STREAM_SQ_MAX_DEPTH 32768单个 SQ 最大深度 32768 个任务槽位STREAM_SQE_BUFFER_MAX_SIZE 2MBSQE 缓冲区上限对应最大深度HOST_SQ_MAX_COUNT 32767单 Stream 可驻留的主机侧 SQE 数量上限。见 stream.hpp#L56-L61。一个巧妙的设计当任务量接近 32767 上限时Runtime 不会报错而是通过**自动切分 SQAuto Split SQ**机制自动创建 slave Stream多个 Stream 共享同一个对外暴露的 StreamId对上层用户完全透明。相关上下文结构见 stream.hpp#L143-L148。1.2 三种失败模式决定了任务出错后 Stream 怎么办stream.hpp#L86-L90 定义了TsStreamFailureMode模式行为典型场景CONTINUE_ON_FAILURE遇错继续后续任务照常执行容错型批处理STOP_ON_FAILURE停止下发新任务大多数在线服务ABORT_ON_FAILURE中止并上报整个 Context训练等需要强一致的场景理解这一点很重要Stream 突然不动了往往不是 Bug而是失败模式在工作。官方对该机制的说明可参考开发指南 Stream管理 与 API 参考 流管理。二、SQ/CQ 队列Runtime 与设备之间的信箱SQ/CQ 的分配与绑定由专门的管家类StreamSqCqManage负责定义在 stream_sqcq_manage.hppAllocStreamSqCq()为新 Stream 申请 SQ 与 CQstreamIdToSqIdMap_/streamIdToCqIdMap_维护 Stream 与队列的双向映射stream_sqcq_manage.hpp#L128-L129logicCqIdMap_按StreamId 线程Id两级键维护逻辑 CQ 映射stream_sqcq_manage.hpp#L144-L145。2.1 逻辑 CQ一个 Stream 可以监听多条 CQ源码中的rtLogicCqInfo_t结构包含isFastCq、isDefaultCq等字段stream_sqcq_manage.hpp#L28-L33说明 Runtime 把物理 CQ抽象成了逻辑 CQFast CQ完成事件上报路径更短适合对同步延迟敏感的 StreamStream 类中可见SetNeedFastcqFlag/IsSteamNeedFastCq接口见 stream.hpp#L389-L391Default CQ多 Stream 共享节省队列资源。物理 SQ/CQ 的内存则从设备级池子里取device_sq_cq_pool.hpp 与 sq_addr_memory_pool.hpp 负责 SQ 地址的统一分配与复用。2.2 SQE任务被打包成队列条目设备不会理解 C 对象只认识定长的队列条目SQESubmit Queue Entry。Runtime 把每个任务转换成对应硬件版本的 SQE各架构的 SQE 定义集中在 inc/sqe/ 目录如 v200 基线的aicpu_sqe.h、memcpy_sqe_common.h任务到 SQE 的转换入口是 task_to_sqe.hpp。三、任务调度Engine 与它的一组工作线程Stream 把任务追加进 SQ 后谁负责盯着队列并驱动执行答案是Engine。它定义在 engine.hpp核心接口一目了然// Submit task to process. virtual rtError_t SubmitTask(TaskInfo* const workTask, ...); virtual rtError_t TaskReclaim(const uint32_t streamId, ...); virtual rtError_t SyncTask(Stream* const stm, const uint32_t taskId, ...);见 engine.hpp#L140-L149。3.1 一条任务的完整生命周期用户线程 RuntimeEngine 线程池 设备 │ aclrtMemcpyAsync │ │ ├───────────────────────►│ 1. 生成 TaskInfo 挂到 Stream │ │ │ 2. 转成 SQE 写入 SQ 环形缓冲区 │ │ 用户线程立即返回 │ 3. 驱动引擎搬运 SQ → 设备 ──────────►│ 执行 │ │ 4. 监听 CQ ◄────────────────────────┤ 写回 CQE │ │ 5. 回收任务资源TaskRecycle │配合 Engine 的任务生命周期观察者EngineObserverTaskSubmited→TaskLaunched→TaskFinished见 engine.hpp#L67-L74可以清晰地看到 Runtime 内部为每个任务建立了完整的埋点闭环——这也是 Profiling 数据能精确到每个任务时间戳的原因。3.2 调度线程分工engine.hpp#L113-L121 中的ThreadType枚举揭示了 Engine 的多线程结构线程职责THREAD_SENDING把 Stream 中的 SQE 提交/下发到设备THREAD_RECVING接收设备侧上报含 CQE 完成事件THREAD_MONITOR监控超时、死锁、设备心跳THREAD_RECYCLE回收已执行完任务占用的 SQ 槽位与参数内存THREAD_CALLBACK执行用户回调如aclrtStreamBeginCapture相关回调值得注意的两个常量RECYCLE_CNT 32、RECYCLE_INTERVAL 10stream.hpp#L51-L52——回收线程是批量、节流工作的而不是一来一个 CQE 就立刻回收这是典型的吞吐优化。3.3 不同硬件路径的提交分流任务提交入口按硬件能力分流见 task_submit.hpp#L21-L22SubmitTaskDc走 DCDirect Command门铃/直接下发路径延迟更低SubmitTaskStars走 STARS 架构路径含 Dvpp 等场景的 CQE 记录队列参见StarsWrRecordEnQueue等接口stream.hpp#L462-L464。四、同步与等待CQE 如何唤醒用户线程aclrtSynchronizeStream之所以看起来会卡住是因为它最终要等 CQE。Stream 提供了完整的等待原语stream.hpp#L497-L505WaitForTask(taskId)/WaitTask()等指定任务Synchronize()等 Stream 内全部任务JudgeTaskFinish/GetFinishedTaskIdBySqHead通过共享内存中的 SQ 头/尾指针轮询式判断完成避免线程频繁唤醒。Event 跨流同步则是把等待本身也变成任务WaitEvent会在 Stream 中插入一个等待型任务stream.hpp#L249-L250从而不阻塞任何用户线程。排障提示同步超时类问题可以按SQ 是否满IsStreamFull→ 设备是否卡住THREAD_MONITOR上报→ CQE 是否回来TASK_NO_SEND_CQ_MAX 32表示最多允许 32 个任务未带 CQE见 stream.hpp#L45三步排查相关方法可参考官方开发指南 10_runtime_troubleshooting.md 与 FAQ Stream同步与Event同步的区别与选择。五、源码导航清单十分钟定位关键文件想继续深入按下表从入口读起即可均位于 src/runtime/ 下想了解从这里读起Stream 主体与任务队列stream/stream.hpp、stream/stream.ccSQ/CQ 分配与逻辑 CQstream/stream_sqcq_manage.hpp设备级队列池device/device_sq_cq_pool.hpp、device/sq_addr_memory_pool.hpp调度线程与提交/回收engine/engine.hpp、task/task_submit.hpp任务转 SQEtask/task_to_sqe.hpp、inc/sqe/回收与资源管理task/task_recycle/对外 C API 层api/api_c_stream.cc、api/impl/v200/配套阅读API 参考 03_runtime_configuration.mdContext/Stream 全局行为与 13_exception_handling.md失败模式的用户侧视角。六、写在最后回到最初的问题Stream 背后的异步机制到底是什么一句话总结Stream 是用户侧的任务序列SQ/CQ 是 Runtime 与设备之间的双向信箱Engine 的多组线程发送/接收/回收/监控则是搬运工与哨兵。任务提交后用户线程立即返回完成事件CQE经逻辑 CQ 上报后驱动任务回收与同步唤醒——三者协作构成了 CANN Runtime 高吞吐、低延迟的异步任务调度体系。掌握这套机制后无论是调优多 Stream 并发、理解同步超时还是排查任务卡住类问题你都有了从源码出发的第一手依据 【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

苹果CMS v10 SEO模板深度解析:从部署到采集优化 2026/9/1 10:43:10

苹果CMS v10 SEO模板深度解析:从部署到采集优化

简介:本资源为专为苹果CMS v10定制的SEO优化型蓝色系自适应模板,面向影视、小说、资讯类网站开发者及站长,解决多端适配差、结构不利于搜索引擎收录、功能模块缺失等建站痛点。压缩包共146个文件(含105个HTML页面模板、16个JS交互…

阅读更多 →
Rufus 绕过 Windows 11 LTSC 在线账户限制:原理拆解与避坑 2026/9/1 10:43:10

Rufus 绕过 Windows 11 LTSC 在线账户限制:原理拆解与避坑

Rufus 绕过 Windows 11 LTSC 在线账户限制:原理拆解与避坑 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus Windows 11 自 24H2 起在首次配置阶段强制要求使用 Microsoft 在线账户&…

阅读更多 →
AI泡沫的技术真相:从信号拆解到周期观察 2026/9/1 10:43:10

AI泡沫的技术真相:从信号拆解到周期观察

这两年,“AI泡沫”从投资圈的饭桌话题,变成了很多程序员也在认真思考的问题。原因很简单:一边是GPT类模型的能力还在迭代,另一边是各种“AI概念”在资本市场的价格波动大得惊人。你可能会纳闷,技术明明在进步&#xff…

阅读更多 →
Deep-Research多智能体开发实战:从任务编排到API封装 2026/9/1 10:43:10

Deep-Research多智能体开发实战:从任务编排到API封装

这次我们来看一套非常契合当下需求的实战内容——Deep-Research 多智能体开发。从技术选型到代码落地,完整串一遍多智能体系统怎么做,如何用多个 Agent 协作完成深度调研、报告生成和 API 封装。如果你想系统掌握 AI Agent 开发,又不满足于只…

阅读更多 →
OpenSRE 云原生日志链路实战:Grafana Log Sink 与 Tempo 追踪深度集成(完整指南) 2026/9/1 10:43:10

OpenSRE 云原生日志链路实战:Grafana Log Sink 与 Tempo 追踪深度集成(完整指南)

OpenSRE 云原生日志链路实战:Grafana Log Sink 与 Tempo 追踪深度集成(完整指南) 【免费下载链接】opensre Build your own AI SRE agents. The open source toolkit for the AI era. 项目地址: https://gitcode.com/GitHub_Trending/op/op…

阅读更多 →
Claude Code编程智能体实战:从Agent原理到工程落地 2026/9/1 10:40:09

Claude Code编程智能体实战:从Agent原理到工程落地

2026年做开发,如果还习惯把 AI 编程工具当成“聊天框 代码粘贴板”,你其实只用了 AI 大模型的一小部分价值。真正拉开效率差距的,是让 AI 以 Agent 的形态直接进入工程现场:它能读你项目的目录结构、能修改文件、能执行命令、能调…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞