架构概览
Mini-ImagePipe 采用 DAG 原生运行时分层设计,重点解决三件事:执行确定性、内存行为可控、GPU 利用率可解释。
分层运行时模型
可将架构拆解为四层:
Pipeline负责构图与执行编排。TaskGraph负责依赖拓扑表达与拓扑序计算。DAGScheduler负责流分配、事件同步与失败传播。MemoryManager负责池化内存和工作区生命周期。
核心组件职责
| 组件 | 主要职责 | 关键接口 |
|---|---|---|
Pipeline | 图构建、输入连接、缓冲区生命周期 | addOperator()、connect()、setInput()、execute() |
TaskGraph | DAG 校验、拓扑排序、独立性分析 | validate()、getTopologicalOrder()、areIndependent() |
DAGScheduler | 任务映射到流、跨流同步、错误传播 | execute()、setErrorCallback()、内部 insertSynchronization() |
MemoryManager | pinned/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 的核心价值不止在速度,更在于 结构化控制能力:
- 依赖感知调度,而非手工硬编码执行顺序。
- 内存生命周期与复用策略显式化。
- 图语义可通过属性测试验证。
- 文档与实现、基准、论文形成闭环。