cuTile Rust (cutile-rs) 是一个基于瓦片的系统,用于在惯用 Rust 中编写内存安全、无数据竞争的 GPU 内核。它将 Rust 的所有权纪律扩展到 GPU 启动边界之外:可变张量在启动前被分割成不相交的片段,不可变张量被共享,生成的启动器在 GPU 工作执行期间保留所有权。同一模型支持同步启动、异步流水线和 CUDA 图形重放。`#[cutile::module]` 宏在宿主二进制中为每个内核嵌入捕获的 Rust AST;当需要内核时,cuTile Rust 会通过 CUDA Tile IR 将该 AST 即时编译为 GPU cubin。当需要更低层的控制时,仍可使用局部退出机制。
项目状态
我们很高兴发布这个研究项目,以展示如何在 Rust 生态系统中实现 GPU 编程。该软件仍处于早期阶段,正在积极开发中:在我们努力改进它的过程中,你可能会遇到 bug、不完整的功能以及 API 变更。话虽如此,我们希望你有兴趣在项目中试用它,并通过反馈使用体验来帮助塑造其发展方向。
如果你有兴趣参与贡献,请查看 CONTRIBUTING.md。
快速开始
use cutile::prelude::*; #[cutile::module] mod kernel { use cutile::core::*; #[cutile::entry()] fn add<const B: i32>( z: &mut Tensor<f32, { [B] }>, x: &Tensor<f32, { [-1] }>, y: &Tensor<f32, { [-1] }>, ) { 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在不增加可测量的运行时开销的情况下提供了安全性:安全的Rust持久化GEMM在M=N=K=8192时达到2.07 PFlop/s(B200密集f16峰值的92%),与对应的底层Tile IR变体相差在0.3%以内。
该论文还评估了Grout,这是一个由Hugging Face合作使用cuTile Rust构建的Qwen3推理引擎。在batch-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编写的Qwen 3推理引擎,基于cuTile Rust构建,可作为生产内核调用点的参考。
- cuTile Python:使用CUDA Tile进行Python内核编程。
- TileGym:CUDA Tile内核示例与调优模式。
- cuda-oxide:NVlabs的实验性Rust-to-CUDA编译器,用于在Rust中编写SIMT风格的GPU内核。
- CUDA Tile IR文档:CUDA Tile IR参考文档。
- CUDA文档:CUDA工具包文档。
- Rust NVPTX后端:rustc对NVIDIA GPU生成PTX的目标支持。
cuTile Rust的目标是基于tile的内核,这些内核通过CUDA Tile IR进行降级,API围绕张量分区和张量核心导向的操作构建。
配置
要求
- NVIDIA GPU with compute capability
sm_80or higher (minimum supported architecture:sm_80).- CUDA 13.1+支持sm_100+。
- 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,便于设置和开发。如果尚未启用,需在你的 Nix 配置中添加 flakes,在 ~/.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 User-facing crate for authoring and executing tile kernels
├── cutile-macro
├── cutile-compiler
├── cuda-async
└── cuda-core
cutile-kernels Reusable cuTile Rust kernels
└── cutile
cutile-macro cuTile Rust proc-macro
└── cutile-compiler
cutile-compiler Compiles cuTile Rust kernels to executables
├── cutile-ir
├── cuda-async
└── cuda-core
cutile-ir Pure Rust Tile IR builder and bytecode writer
cuda-async Async CUDA execution via async Rust
└── cuda-core
cuda-core Idiomatic safe CUDA API
└── cuda-bindings
cuda-bindings NVIDIA CUDA bindings
许可证
cuda-bindings crate 采用 NVIDIA 软件许可证:LICENSE-NVIDIA。所有其他 crate 均采用 Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0