Skip to content

架构概览

Mini-ImagePipe 采用 DAG 原生运行时分层设计,重点解决三件事:执行确定性、内存行为可控、GPU 利用率可解释。

分层运行时模型

可将架构拆解为四层:

  1. Pipeline 负责构图与执行编排。
  2. TaskGraph 负责依赖拓扑表达与拓扑序计算。
  3. DAGScheduler 负责流分配、事件同步与失败传播。
  4. MemoryManager 负责池化内存和工作区生命周期。

核心组件职责

组件主要职责关键接口
Pipeline图构建、输入连接、缓冲区生命周期addOperator()connect()setInput()execute()
TaskGraphDAG 校验、拓扑排序、独立性分析validate()getTopologicalOrder()areIndependent()
DAGScheduler任务映射到流、跨流同步、错误传播execute()setErrorCallback()、内部 insertSynchronization()
MemoryManagerpinned/device 池化、异步分配模式、工作区管理allocateDevice()allocatePinned()allocateWorkspace()

执行语义

1)图校验与执行序生成

Pipeline::execute() 会先校验图结构,再生成拓扑执行序。 校验失败时,立即返回 cudaErrorInvalidValue

cpp
TaskGraph& graph = pipeline.getTaskGraph();
if (!graph.validate()) {
    return cudaErrorInvalidValue;
}
auto order = graph.getTopologicalOrder();

2)输入输出契约

每个任务读取一个或多个 ImageBuffer 输入,并输出一个 ImageBuffer。 任务维度由上游输出与算子的输出维度推导逻辑共同决定。

3)流分配与跨流同步

DAGScheduler 会优先将独立任务分散到不同流。 跨流依赖通过 CUDA event 建立生产者-消费者同步关系。

4)失败传播机制

若某任务失败,其依赖后继会被标记为 FAILED。 与该失败路径无依赖关系的分支不会被强制终止。

内存体系

Mini-ImagePipe 使用双池化模型:

  • pinned host 内存池用于异步传输路径。
  • device 内存池用于中间结果复用。
  • 每任务工作区用于降低热路径中的临时分配开销。

设计约束与当前行为

  • 当前运行时为每个任务维护主要输出缓冲区模型。
  • 在 fork-join 拓扑中,多输入语义是否完整由算子本身能力决定。
  • 拓扑排序 + 显式同步共同保证执行顺序的可解释性与确定性。

该架构的差异化价值

相较于 "手写 CUDA 调用链",Mini-ImagePipe 的核心价值不止在速度,更在于 结构化控制能力

  • 依赖感知调度,而非手工硬编码执行顺序。
  • 内存生命周期与复用策略显式化。
  • 图语义可通过属性测试验证。
  • 文档与实现、基准、论文形成闭环。

延伸阅读

基于 MIT 许可证发布