Taskflow

关注
义项:任务流编排软件
Taskflow

Taskflow 是一套面向现代 C++ 的通用任务并行编程系统,以头文件库的形式提供,开发者用有向无环图描述任务之间的依赖关系,运行时负责把任务调度到多个处理器核心与加速器上执行[1]。它由威斯康星大学麦迪逊分校的 Tsung-Wei Huang 主导开发,采用 MIT 许可证,支持静态与动态任务图、条件任务、异构 CPU-GPU 任务以及并行算法等能力[2]。该库把并行程序抽象为任务图,配合工作窃取调度器自动平衡各线程的负载,从而降低编写并行程序的难度[3]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

Taskflow 是一个用现代 C++ 编写的通用任务并行编程系统,其定位是帮助开发者快速编写高性能的任务并行程序[4]。它以头文件库的形式分发,使用时只需包含头文件,不需要单独编译或链接额外的二进制组件。程序员把一个任务写成可调用对象,再用优先、后继一类的接口在任务之间建立依赖边,这些节点与边共同构成有向无环图,即任务图[5]。

在 Taskflow 中,任务图与执行器是两个分离的概念,执行器管理一组工作线程并负责实际调度,一个执行器可以运行多个任务图[1]。库采用 MIT 许可证发布,可以自由再分发与修改[6]。

原理

Taskflow 的调度算法分为任务级与工作级两层。任务级调度决定任务在控制流下如何入队,需要保证控制流存在可行的执行路径,并避免在循环与条件执行中出现任务竞争;工作级调度决定任务由哪个工作线程执行,采用工作窃取策略实现动态负载均衡[7]。工作窃取的基本含义是,某个线程完成自己队列中的任务后,从其他线程的队列尾部取走任务执行[3]。

为处理 CPU 与 GPU 混合的任务图,调度器为每类任务维护独立的执行域,并为每个域配置一组工作线程,线程只从同一域内其他线程处窃取任务[3]。每个工作线程配有本地任务队列,本地队列的持有者从一端压入或弹出任务,其他线程可以从另一端同时窃取,从而在无锁条件下完成任务的插入与窃取[3]。

线程的休眠与唤醒通过两阶段提交协议实现,用待执行任务的谓词判断是否继续等待,以避免在任务不足时浪费处理器周期,也避免新任务到来时无人处理[3]。在条件任务上,库区分弱依赖与强依赖:条件任务返回后继任务的索引,调度器据此直接跳转到对应分支,从而在任务图内表达循环与条件分支[8]。

抽象结构上,每次创建任务或添加依赖都会向当前任务图加入一个节点或一条边,因此尚未执行的任务图可以被导出为 GraphViz 格式的文本用于检查依赖关系;包含动态任务的程序则需要先执行,再导出对应的拓扑结构[9]。库内置名为 TFProf 的性能分析工具,把程序执行过程记录成文件,再在浏览器界面中呈现执行时序图[4]。

发展历程

该项目的早期形态名为 Cpp-Taskflow,是一个用 C++17 编写、只依赖标准库的任务依赖图并行库,相关论文在 2018 年发表,项目本身也在 2018 年创建[5][6]。作者 Tsung-Wei Huang 在伊利诺伊大学厄巴纳-香槟分校攻读博士期间开发了电路分析开源项目,并意识到其中用于加速电路设计自动化的技术可以推广到其他计算负载,这一思路后来发展为 Taskflow[2]。

2020 年 8 月 31 日,Taskflow 作为头文件并行任务库被收录进自由桌面操作系统的软件包集合中[10]。2021 年,项目加入 NumFOCUS 的附属项目,同年发布 3.0.0 版本,增强了核心功能与异构任务能力,并引入用任务图并行方式编写 SYCL 内核的模型[1]。其调度算法与整体系统设计先后发表于 2020 年 IEEE 国际并行与分布式系统会议以及 2022 年 IEEE 并行与分布式系统汇刊[1][3]。

项目在 2022 年和 2023 年两次入选谷歌编程之夏,并在 NumFOCUS 组织框架下参与[1]。3.9.0 版本于 2025 年 1 月 2 日发布,改用去中心化的工作窃取策略改进调度性能,并加强对各类任务异常处理的支持[11]。4.0.0 版本于 2026 年 1 月 1 日发布,代码库迁移到 C++20 标准,引入批量调度、新的任务组能力与配套视频教程,并说明不支持 C++20 的工程可以继续使用 3.11.0[12]。4.1.0 版本于 2026 年 6 月 19 日发布,引入基于索引区间的高维并行迭代与并行归并等算法,并用画布渲染替换原有的分析器渲染方式以提升可扩展性。

应用

Taskflow 面向通用任务并行场景,支持静态与动态任务图构建、条件任务、异步任务、可组合的任务图与常用并行算法,例如并行迭代、并行归约与并行排序。在异构计算方面,它通过 cudaFlow 与 syclFlow 支持把任务卸载到 GPU 上执行,从而利用 CPU 与 GPU 协同计算[1]。

在科研计算中,有研究把 CEDR 运行时与 Taskflow 的任务图模型结合,使应用能够在 CPU、GPU 与 FPGA 之间可移植地执行,并通过集中协调层支持多个应用并发运行。在电子设计自动化领域,该项目被用于加速寄存器传输级仿真,并在 CPU 与 GPU 异构环境中取得结果[1]。此外,3D 图形渲染相关资料也曾把 Taskflow 作为多线程章节的示例工具加以介绍[1]。

在化学过程模拟等采用模块化流程图的场景中,研究者利用 Taskflow 的静态任务模型建立循环定位任务节点,利用条件任务模型建立判断收敛与否的条件任务节点,以调度带循环的仿真子图。

局限

Taskflow 属于任务图计算框架,其任务与计算资源之间的映射通常是静态的,本身不具备动态调度机制,在多份负载同时争用计算资源时可能出现资源利用不充分的情况,这也是后续研究把运行时系统与之结合以补足动态调度能力的原因。

使用条件任务需要开发者自行保证任务图的条件正确性,需要避免没有起始任务以及任务竞争等问题;库的文档把这类情形列为常见的错误用法[8]。在版本兼容方面,4.x 系列要求编译器支持 C++20,不再支持较旧的编译环境[12]。调度器为每个域中的每个工作线程分配独立任务队列,这一设计会带来额外的内存占用,是换取调度速度与线程管理效果所付出的代价[3]。

有研究在评测中指出,Taskflow 的窃取队列在批量窃取大量节点时延迟会随批量比例近似线性增长,而专门为批量操作设计的队列可以保持较为稳定的延迟[13]。

参见

  • 有向无环图 —— Taskflow 用这种图结构描述任务及其依赖关系。

  • 工作窃取 —— Taskflow 调度器实现动态负载均衡所依据的核心策略。

  • CUDA —— Taskflow 通过 cudaFlow 在其之上编排 GPU 任务。

  • SYCL —— Taskflow 通过 syclFlow 支持在该异构编程模型上表达任务图并行。

  • 并行计算 —— Taskflow 所属的更大技术领域。

  • 谷歌编程之夏 —— Taskflow 曾在该计划下获得项目支持。

参考资料

  1. Taskflow [引用日期2026-10-14]
  2. Huang, Tsung-Wei (TW) [引用日期2026-10-14]
  3. Proof [引用日期2026-10-14]
  4. taskflow - ROS Repository Overview [引用日期2026-10-14]
  5. github.io 上的 PDF 文件 [引用日期2026-10-14]
  6. taskflow | Ecosystem Directory | market.dev [引用日期2026-10-14]
  7. []() { std::cout << "Task f2C\n"; } [引用日期2026-10-14]
  8. README [引用日期2026-10-14]
  9. cpp-taskflow [引用日期2026-10-14]
  10. taskflow [引用日期2026-10-14]
  11. release-3-9-0 [引用日期2026-10-14]
  12. release-4-0-0 [引用日期2026-10-14]
  13. acm.org 上的网页 [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T21:13:42Z

历史版本

本条目引用的词条
有向无环图 工作窃取 CUDA SYCL 并行计算 谷歌编程之夏