Show HN: cuTile Rust:在Rust中编写安全、无数据竞争的GPU内核
摘要
NVIDIA Labs发布了cuTile Rust,这是一个基于瓦片的系统,用于用地道的Rust编写内存安全、无数据竞争的GPU内核。它将Rust的所有权模型扩展到GPU内核,通过JIT将Rust的AST编译为GPU代码,并实现接近原生CUDA的性能。
查看缓存全文
缓存时间: 2026/06/16 23:36
nvlabs/cutile-rs 源代码:https://github.com/nvlabs/cutile-rs Crates.io (https://crates.io/crates/cutile) 构建 (https://github.com/NVlabs/cutile-rs/actions/workflows/pr.yml) 文档 (https://nvlabs.github.io/cutile-rs/) cuTile Rust(cutile-rs)是一个基于图块的系统,用于在地道 Rust 中编写内存安全、无数据竞争的 GPU 内核。它将 Rust 的所有权规则扩展到了 GPU 启动边界:可变张量在启动前被划分为互不相交的片段,不可变张量被共享,而生成的启动器在 GPU 工作运行期间保持所有权。该模型支持同步启动、异步流水线和 CUDA 图重放。#[cutile::module] 宏会将每个内核的捕获的 Rust AST 嵌入到宿主二进制文件中;当需要内核时,cuTile Rust 会将该 AST 通过 CUDA Tile IR 即时编译为 GPU cubin。当需要底层控制时,仍然可以局部选择不采用此机制。
项目状态
我们很高兴发布此研究项目,以展示如何在 Rust 生态系统中进行 GPU 编程。该软件处于早期阶段,正在积极开发中:您可能会遇到错误、功能不完整以及 API 变更,我们正在努力改进它。尽管如此,我们希望您有兴趣在您的工作中试用它,并通过提供您的使用体验反馈来帮助塑造其发展方向。如果您有兴趣贡献,请查看 CONTRIBUTING.md。
快速开始
use cutile::prelude::*;
#[cutile::module]
mod kernel {
use cutile::core::*;
#[cutile::entry()]
fn add(
z: &mut Tensor,
x: &Tensor,
y: &Tensor,
) {
let tx = load_tile_like(x, z);
let ty = load_tile_like(y, z);
z.store(tx + ty);
}
}
fn main() -> Result<(), Error> {
let x = api::ones::<f32>(&[1024]);
let y = api::ones::<f32>(&[1024]);
let z = api::zeros::<f32>(&[1024]).partition([128]);
let (_z, _x, _y) = kernel::add(z, x, y).sync()?;
Ok(())
}
#[cutile::module] 宏将 add 转换为一个 GPU 内核,并生成一个宿主的启动器。宿主代码构造惰性张量操作,将可变输出划分为128元素大小的块,并调用 .sync() 进行即时编译和执行内核。内核签名将访问规则带入设备代码:z 是独占的可变输出,而 x 和 y 是共享的只读输入。函数体加载与输出分区匹配的输入图块,相加并存储结果。启动网格 (8, 1, 1) 从分区推断:1024÷128 = 8 个图块。
- 通过
cargo run -p cutile-examples --example saxpy运行类似示例。 - 更多内核和宿主 API 的使用示例可以在 这里 找到。
论文
cuTile Rust 论文《Fearless Concurrency on the GPU》可在 此处 获取。在 NVIDIA B200 上,cuTile Rust 在逐元素操作中达到 7 TB/s,在 GEMM 中达到 2 PFlop/s,分别约占用峰值内存带宽的 91% 和密集 f16 峰值的 92%。GEMM 结果与 cuBLAS 相当,B200 安全开销微基准测试表明 cuTile Rust 在增加安全性的同时没有可测量的运行时开销:在 M=N=K=8192 时,安全的 Rust 持久 GEMM 达到 2.07 PFlop/s(B200 密集 f16 峰值的 92%),与相应的底层 Tile IR 变体相差在 0.3% 以内。论文还评估了 Grout,这是一个由 cuTile Rust 与 Hugging Face 合作构建的 Qwen3 推理引擎。在批量1的 Qwen3 解码中,Grout 在 NVIDIA GeForce RTX 5090 上对 Qwen3-4B 达到 171 tokens/s,在 B200 上对 Qwen3-32B 达到 82 tokens/s,根据我们的 HBM 屋顶线分析,在内存受限推理任务上展现出具有竞争力的最先进性能。论文评估的复现性工件可在 此处 获得。论文使用的测量针对 cuTile Rust 0.2.0 版本运行,论文中使用的 Grout 版本可在 此处 获取。
引用
如果您在研究中使用 cuTile Rust,请引用论文:
@misc{elibol2026fearlessconcurrencygpu,
title = {Fearless Concurrency on the GPU},
author = {Elibol, Melih and Roesch, Jared and Gelado, Isaac and Buehler, Eric and Garland, Michael},
year = {2026},
eprint = {2606.15991},
archivePrefix = {arXiv},
primaryClass = {cs.PL},
url = {https://arxiv.org/abs/2606.15991}
}
相关项目和参考
- Grout:Hugging Face 用 Rust 实现的 Qwen3 推理引擎,基于 cuTile Rust 构建,可作为生产内核调用点参考。
- cuTile Python:使用 CUDA Tile 进行 Python 内核编程。
- TileGym:CUDA Tile 内核示例和调优模式。
- cuda-oxide:NVlabs 实验性的 Rust 到 CUDA 编译器,用于在 Rust 中编写 SIMT 风格 GPU 内核。
- CUDA Tile IR 文档:CUDA Tile IR 参考文档。
- CUDA 文档:CUDA 工具包文档。
- Rust NVPTX 后端:rustc 对生成 NVIDIA GPU PTX 的目标支持。cuTile Rust 定位基于图块的内核,这些内核通过 CUDA Tile IR 进行降级,API 围绕张量分区和张量核操作构建。
设置
需求
- NVIDIA GPU,计算能力
sm_80或更高(支持的最低架构:sm_80)。 sm_100+由 CUDA 13.1+ 支持。sm_8x支持在 CUDA 13.2 中添加。- CUDA 13.3 添加了
sm_90支持,因此 CUDA 13.3 用户现在拥有sm_80+覆盖范围。 - CUDA 13.3 推荐(支持
sm_80+和 CUDA Tile IR 13.3 功能,如 FP4 打包和块缩放 MMA)。 - Rust 1.89+
- Linux(在 Ubuntu 24.04 上测试)
安装
Rust
安装 Rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup default stable
CUDA
按照官方说明为您的操作系统安装 CUDA 13.3:https://developer.nvidia.com/cuda-downloads
配置环境
将 CUDA_TOOLKIT_PATH 设置为您 CUDA 13.3 安装目录。示例 .cargo/config.toml:
[env]
CUDA_TOOLKIT_PATH = { value = "/usr/local/cuda-13", relative = false }
验证安装
运行 hello world 示例:
cargo run -p cutile-examples --example hello_world
如果一切正常,您应该看到:Hello, I am tile <0, 0, 0> in a kernel with <1, 1, 1> tiles.
使用 Nix
我们提供了一个 Nix flake 用于简化设置和开发。如果尚未启用 Flakes,请在您的 Nix 配置中添加(~/.config/nix/nix.conf):
experimental-features = nix-command flakes
直接运行命令:
nix develop -c cargo run -p cutile-examples --example saxpy
或者打开交互式 shell:
nix develop
# cutile-rs dev shell
# ✓ CUDA /nix/store/...-cuda-toolkit-13.3
# ✓ Rust 1.90.0-nightly
Flake 会自动定位 NixOS 和非 NixOS 系统上的宿主 NVIDIA 驱动库。
测试
- cuTile IR:
cargo test --package cutile-ir - cuTile Rust 编译器:
cargo test --package cutile-compiler - cuTile Rust 库:
cargo test --package cutile - 示例:运行单个示例,例如
cargo run -p cutile-examples --example async_gemm - 基准测试:
cargo bench - 全部:
./scripts/run_all.sh(或重定向到日志文件:./scripts/run_all.sh 2>&1 | tee test_run.log)
工作区 Crate
cutile 面向用户编写和执行图块内核的 crate
├── cutile-macro
├── cutile-compiler
├── cuda-async
└── cuda-core
cutile-kernels 可复用的 cuTile Rust 内核
└── cutile
cutile-macro cuTile Rust proc-macro
└── cutile-compiler
cutile-compiler 将 cuTile Rust 内核编译为可执行文件
├── cutile-ir
├── cuda-async
└── cuda-core
cutile-ir 纯 Rust 的 Tile IR 构建器和字节码写入器
cuda-async 通过异步 Rust 进行异步 CUDA 执行
└── cuda-core
cuda-core 惯用安全的 CUDA API
└── cuda-bindings
cuda-bindings NVIDIA CUDA 绑定
许可证
cuda-bindings crate 根据 NVIDIA Software License 许可:LICENSE-NVIDIA。所有其他 crate 根据 Apache License, Version 2.0 许可:https://www.apache.org/licenses/LICENSE-2.0
相似文章
GPU上的无畏并发:在Rust中进行安全的GPU推理,与vLLM/SGLang竞争 [R]
cuTile Rust 引入了一种基于块(tile)的编程模型,利用 Rust 的所有权机制来保证 GPU 内核的内存安全和无数据竞争,基于该模型构建的 Grout 推理引擎在 Qwen3 模型上实现了与 vLLM/SGLang 相当的吞吐量。
@ericlbuehler: 兴奋地分享 cuTile Rust:将 Rust 的无畏并发性引入 GPU 内核编程。我们的论文《Fearless Concu…
兴奋地分享 cuTile Rust,将 Rust 的无畏并发性引入 GPU 内核编程。他们的论文《Fearless Concurrency on the GPU》现已发布在 arXiv 上。
CUDA-oxide:NVIDIA 官方 Rust 转 CUDA 编译器
CUDA-oxide 是由 NVIDIA 开发的实验性 Rust 转 CUDA 编译器,支持使用地道的 Rust 编写安全的 GPU 核函数,可直接编译为 PTX,无需借助领域特定语言或外部绑定。
cuda-oxide 手册
cuda-oxide 是一个实验性的 Rust 到 CUDA 编译器,允许开发者编写安全、符合 Rust 惯用法的 GPU 内核,并直接编译为 PTX。
Rust SIMD on the GPU
VectorWare announces that Rust's portable SIMD (core::simd) now works on the GPU, mapping SIMD vectors to warp lanes and enabling familiar Rust abstractions for GPU programming.