NVIDIA 推出 CUDA Rust:用 cuda-oxide 与 cutile-rs 编写 GPU 内核
两个 NVlabs 开源项目原生编译 Rust GPU 内核,并借助所有权规则在编译期拦截别名错误。
NVIDIA 宣布推出 CUDA Rust,目标是让 Rust 成为编写 GPU 内核(kernel)的一等语言。此前 Rust 代码虽然可以启动 CUDA 内核,但内核主体通常仍需用其他语言编写。两个 NVlabs 开源项目填补了这一空缺:面向 SIMT 模型的 cuda-oxide,以及面向较新 Tile 模型的 cutile-rs。两者都原生编译 Rust 内核,并利用 Rust 的所有权规则在编译期拒绝别名(aliasing)错误。
两种编程模型
SIMT 是 CUDA C++ 与 numba-cuda 使用的模型:描述单个线程做什么,然后启动数千个线程。Tile 则描述一块数据瓦片做什么,线程映射和内存布局交给 Tile IR 编译器处理。NVIDIA 建议优先使用 Tile,需要显式控制线程与内存时再用 SIMT。计划中的跨语言互操作意味着选择 Rust 不会把开发者挡在 C++ 或 Python 之外。
cuda-oxide 是一个定制的 rustc 代码生成后端,把 #[kernel] 函数经由 Rust MIR、社区项目 Pliron IR 和 LLVM IR 一路降到 PTX,其余部分交给标准后端。NVIDIA 在 Pliron 之上编写了 GPU 方言。运行要求较重:Linux、计算能力 8.0 及以上的 GPU、CUDA 12.x 或更新版本、带 libclang 的 clang,以及固定的 nightly-2026-04-03 工具链。
cutile-rs 的抽象层级更高。每个 tile 块把内核主体当作单个逻辑线程在一个子张量上执行一次,实际动用多少 GPU 线程由编译器决定。要求更轻:计算能力 8.0 及以上、CUDA 13.3、稳定版 Rust 1.89 或更新版本、Linux,无需 nightly 也无需定制 LLVM。
安全性主张
在 SIMT 一侧,输出缓冲区类型为 DisjointSlice<f32>,让每个线程独占自己的元素,越界访问返回 Option,从而变成一个可处理的分支。把输出缓冲区当作自身输入传入时,SIMT 侧报 E0502 错误,Tile 侧报 E0382 错误。NVIDIA 认为 cutile-rs 的保证更强,因为所有权会随张量跨越启动边界。Tile 不暴露共享内存和线程索引,而 cuda-oxide 中的共享内存目前仍需 unsafe。
cutile-rs 已发布在 crates.io,并被 Hugging Face 的 Grout 推理引擎和 mistral.rs 采用;cuda-oxide 处于早期 alpha。NVIDIA 表示两个项目均处于 alpha 阶段,尚未确认可用于生产环境。技术细节见 MarkTechPost 的报道。