以下文章来自微信公众号“觉学社”,作者张汉东,发表于 2026 年 3 月。

图片


刚发现 VectorWare 团队在 2026 年 2 月发布的一篇技术博文中宣布,他们成功在 GPU 上运行了 Rust 的 async/await。

https://www.vectorware.com/blog/async-await-on-gpu/

这解决了传统 GPU 上并发困境。

传统 GPU 编程是数据并行,所有线程对不同数据执行相同操作。但随着 GPU 程序变复杂,开发者开始使用 warp specialization(warp 特化),让不同 warp 跑不同的任务(比如一个 warp 负责加载数据,另一个负责计算)。这本质上是从数据并行转向了任务并行。

问题在于:这种并发和同步完全靠手动管理,没有语言或运行时层面的支持,就像 CPU 上手写线程同步一样容易出错且难以推理。

博客文章梳理了三个已有的高层抽象方案:

JAX 把 GPU 程序建模为计算图,编译器分析图中的依赖关系来决定执行顺序和并行策略。
Triton 用"block"作为独立计算单元,通过 MLIR 多层编译管线来管理并发。
CUDA Tile 则引入了"tile"作为一等公民数据单元,让数据依赖变得显式。

但这些方案有共同的缺点:

它们都要求开发者用全新的方式组织代码,需要新的编程范式和生态,对采用构成显著障碍。 vectorware而且代码复用困难。现有的 CPU 库和 GPU 库都无法直接与这些框架组合。

文章的核心论点是 Rust 的 Future trait 恰好满足了他们想要的所有特性:

1. Future 是延迟的、可组合的值。 跟 JAX 的计算图类似,你先构建程序的"描述",再执行。编译器可以在执行前分析依赖关系。

2. Future 天然表达独立的并发单元。 跟 Triton 的 block 类似,多个 future 可以串行(.await 链)或并行(join!、组合子)执行。

3. Rust 的所有权系统让数据依赖显式化。 跟 CUDA Tile 的显式 tile 类似,future 通过捕获数据来编码数据流向,而 Send/Sync/Pin 等 trait bound 则约束了数据如何在并发单元间共享和传递。

4. 最关键的一点: Warp 特化本质上就是手写的任务状态机,而 Rust 的 future 恰好编译成编译器自动生成和管理的状态机。 vectorware既然 future 只是状态机,没有理由不能在 GPU 上运行。

他们移植了 Embassy,一个为嵌入式系统设计的 no_std 异步执行器。GPU 没有操作系统,不支持 Rust 标准库,这跟嵌入式环境非常相似,所以 Embassy 是天然的选择。将 Embassy 适配到 GPU 上只需要很少的修改,这种复用现有开源库的能力远优于其他非 Rust 的 GPU 生态。

这篇文章表面上在讲 async/await,但它真正在说的是一个更大的事情:用 Rust 的类型系统和零成本抽象来统一 CPU 和 GPU 的编程模型。

Future 不关心自己跑在哪里,线程、核心、block、warp 都可以。同一段 async 代码可以不改一行在 CPU 和 GPU 上运行。

这跟 JAX/Triton 那种"为 GPU 写一套全新的东西"的思路根本不同,是一种从语言层面自底向上的统一。

VectorWare 之前还发过一篇关于在 GPU 上启用 Rust std 的文章,加上这次的 async/await,他们的目标很明确:让 GPU 编程变成"普通的 Rust 编程",而不是一个需要全新心智模型的特殊领域。

Logo

开放原子旋武开源社区(简称“旋武社区”)是由开放原子开源基金会孵化及运营的技术社区,致力于在中国推广和发展Rust编程语言生态,推动Rust在操作系统、终端设备、安全技术、基础软件等关键领域的产业落地,构建安全、可靠、高效的软件基础设施。

更多推荐