恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

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

  • 首页
  • 资讯中心
  • /
  • CANN Runtime源码解析:Stream背后的SQ/CQ异步机制与任务调度原理

相关资讯

本地AI代理团队搭建指南:有限预算下的多模型协作方案 2026/9/1 9:55:43
Grok Build 1.0.8 子代理与多任务优化:构建复杂项目的高效实践 2026/9/1 9:55:43
基于DeepSeek Harness构建Obsidian智能助手:从零开发AI知识管理Agent 2026/9/1 9:55:43

最新资讯

CyberChef 安装与快速上手:10 分钟跑起一款加解密与编码转换工具
零基础学大模型应用开发:从智能体搭建到微调私有化部署
ex-skill进化机制完全指南:追加记忆、对话纠正、版本回滚三大机制深度解析
AI角色生成工作流:从ComfyUI到LoRA的角色一致性实战指南
Sunshine 游戏串流指南:书房主机如何变成全家共享的游戏机
年报分析:用股东户数、机构持仓与现金流验证机构抢筹

今日推荐

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

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

发布时间:2026/9/1 10:00:44
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),仅供参考

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号