VectorWare 将 Rust 的可移植 SIMD 映射到 NVIDIA GPU 的线程束

Christian Legnitto 的编译器团队正在将普通的 Rust 抽象扩展到 GPU 线程、lane(通道)和异步执行。

By · Published

Primary source: VectorWare

Why it matters

VectorWare is moving GPU programming toward familiar systems code. Portable SIMD fills the lane-level gap, though Rust's API and VectorWare's compiler remain experimental.

The translation and efficient execution of Rust's portable SIMD abstractions onto NVIDIA GPU warps (Flat modernist vector illustration in the spirit of mid-century corporate annual reports — bold simple shapes, textured overprint)

VectorWare 在 8 月 10 日演示了 Rust 的 portable SIMD API 在 NVIDIA GPU 上运行,为创始人 Christian Legnitto (@legneato) 提供了他希望开发者用于 GPU 原生应用的编程模型的又一部分。在 一篇技术帖子 中,VectorWare 展示了普通的 core::simd 代码如何被编译成分布在 GPU warp 的 32 条通道上的操作。

这项工作填补了 VectorWare 技术栈中的一个特定空白。此前 VectorWare 将 Rust 线程映射到 GPU warp,允许不同的 warp 表现得像独立调度的 CPU 线程那样。除非开发者深入使用特定于 GPU 的编程,否则这种方法会导致每个 warp 内的通道被低效使用。portable SIMD 为 Rust 代码提供了一种熟悉的方式来访问这些通道。

Legnitto 的职业生涯常围绕平台转换展开。VectorWare 在其官网列出的过往职位包括 Apple、Mozilla、Facebook 和 Robinhood,而首席投资方 The General Partnership 认为他负责推出了 Facebook 的首个原生移动应用。他还维护着支撑 VectorWare 工作的开源编译器项目 rust-gpurust-cuda

这种背景塑造了 VectorWare 的核心押注:GPU 编程应该成为主流软件开发的延伸,而不是保留为一堆专门的内核、API 和供应商特定的内建函数。VectorWare 在 2025 年 10 月 23 日宣布成立,完成了由 The General Partnership 领投的种子轮融资。VectorWare 指出前 Mozilla CEO John Lilly、Patrick Kavanagh 和 Nick Candito 是其天使投资人。

填补通道内的空白

Rust 的 core::simd 提供了一个通用的 Simd<T, N> 类型,用于表示对固定数量值的操作。在 CPU 上,编译器可以将这类代码下发为 x86-64 或 Arm 硬件可用的向量指令。开发者可以只编写一次加法、比较或规约,而不用为每个指令集维护单独实现。

VectorWare 将 GPU warp 视为另一种向量目标。NVIDIA 将 GPU 线程组织为 32 通道的 warp。VectorWare 将一个 Simd<i16, 32> 值映射到这些通道上,每个通道放置一个元素。两个此类值之间的加法随后就可以成为一次跨整个 warp 的指令。

该演示超越了逐元素算术。VectorWare 的示例使用乘法、比较掩码、条件选择和规约计算了一个小型的类似 ReLU 的点积。编译器将规约映射到 warp shuffle 指令,并使用 GPU 的 vote 和 ballot 操作来实现诸如 allany 之类的掩码查询。

对 VectorWare 的表述需要作出限定。NVIDIA 将 SIMT 与传统 SIMD 区分开来,因为单个 GPU 线程可以维护自己的控制流。VectorWare 正在使用 warp 的共享执行特性作为 Rust 向量抽象的目标。对于许多操作这种映射是直接的,而分歧控制流和不规则的通道移动仍然带有特定于 GPU 的开销。

这一里程碑也完成了 VectorWare 自一月以来一直在组装的编程层次。VectorWare 首先将 Rust 的标准库带到 GPU,随后在二月带来了 async 和 await,并在 3 月 24 日实现了 std::thread。在 VectorWare 的模型中,Rust 线程将工作分配到 warp,而 portable SIMD 则在每个 warp 的通道内分配数据。异步代码可以围绕这两个层级协调并发操作。

VectorWare 在抽象层面上展开竞争

Rust 开发者已经有多条通往 GPU 硬件的路径。CubeCL 提供了一个 Rust 语言扩展、编译器和运行时,可针对 NVIDIA、AMD、Apple、Vulkan、WebGPU 和 CPU。NVIDIA 的实验性项目 cuda-oxide 将 Rust 内核编译为 PTX,并通过 Rust API 暴露 CUDA 概念。

VectorWare 正在追求更广泛的源兼容性论点。VectorWare 希望开发者熟悉的 Rust 功能(如 std、线程、futures 和 core::simd)在编译到 GPU 时仍保留其语义,而不是要求开发者在一个面向 GPU 的语言扩展内编写代码或采用独立的内核模型。围绕这些抽象编写的现有库随后可以以更少的结构性改动成为 GPU 执行的候选者。

这种区别很重要,因为仅有语言熟悉度并不能使 GPU 开发变得平常。开发者仍需考虑内存移动、同步、占用率、通道利用率和硬件特性行为。VectorWare 正在尝试将更多这类复杂性置于 Rust 编译器和类型系统之下,在那里无效的执行形态和不被支持的操作可以更早被拒绝。

VectorWare 表示他们为通道级操作(包括 shuffle、规约、扫描、gather、scatter 和 原子操作)构建了一个带类型的中间表示。该表示使用 Rust 类型、泛型和 trait 约束来描述执行形态。VectorWare 还构建了一个确定性的 CPU 解释器用于对 GPU 行为进行差分测试。

效率约束仍然可见

8 月 10 日的演示是一个编译器里程碑,而不是生产性能结果。VectorWare 的示例证明 portable SIMD 操作可以在保留普通 Rust 源代码的情况下被下发为 GPU 指令。高效执行在很大程度上取决于向量宽度和操作模式与硬件的契合程度。

一个 32 元素向量与 NVIDIA warp 匹配得很干净。更窄的向量会导致通道空闲。更宽的向量则需要每个通道处理多个元素。AMD 硬件可以使用 32 或 64 通道的 wavefront,这为在类型中编码固定 N 的代码创造了另一个可移植性决策点。

跨通道操作的代价也各不相同。对硬件友好的 shuffle 可以被高效下发,而任意置换可能需要多条指令或使用共享内存。规约和横向掩码操作会引入同步点。VectorWare 表示,当 SIMD 宽度与硬件宽度匹配时会出现零成本情形,这一说法比“相同源代码可在 CPU 和 GPU 上执行”的一般承诺更为谨慎。

Rust 的 portable SIMD API 仍处于不稳定状态,需要 nightly 的 portable_simd 特性。VectorWare 还表示在 SIMD 与其他 Rust 特性交互时,为了保持 soundness(安全性)需要对编译器进行改动。这些约束使得该工作处于实验性编译器工具链中,而非通用发布渠道。

VectorWare 目前以 NVIDIA 硬件为目标,尽管 Legnitto 的工程师们认为底层表示可以映射到 AMD 的 wavefronts 和 Vulkan 子组(subgroups)。VectorWare 也在探索 tensor-core 降低和由编译器驱动的自动向量化,这些功能最终可能允许标量 Rust 循环在无需开发者编写显式 Simd 类型的情况下使用 warp 级并行性。

其战略价值在于组合。标准库访问、异步执行、warp 级线程和通道级 SIMD 各自解决 GPU 编程的不同部分。如果 VectorWare 能让这些抽象协同工作而不抹去硬件的性能优势,Legnitto 将拥有在 VectorWare 启动时承诺的更大平台的基础:围绕 GPU 作为主要计算单元构建的软件,使用系统开发者已经熟悉的编程工具。

Reader comments

Conversation for this story loads after sign-in.