cuTile Rust:安全无数据竞争的 GPU 内核系统
Show HN: cuTile Rust:用 Rust 编写的、安全且无数据竞争的 GPU 内核
cuTile Rust 是一个基于 tile 的 GPU 编程系统,允许用 Rust 编写内存安全、无数据竞争的内核。它通过 `#[cutile::module]` 宏将内核 AST 嵌入主机二进制,在运行时经 CUDA Tile IR JIT 编译为 GPU cubin。可变张量在启动前分割,不可变张量共享,启动器在 GPU 工作期间保持所有权。在 NVIDIA B200 上,逐元素操作达 7 TB/s(约 91% 峰值带宽),GEMM 达 2 PFlop/s(约 92% 密集 f16 峰值)。基于 cuTile Rust 构建的 Grout 推理引擎在 RTX 5090 上解码 Qwen3-4B 达 171 tokens/s,在 B200 上解码 Qwen3-32B 达 82 tokens/s。项目处于早期研究阶段。
用Rust的所有权模型保证GPU内核无数据竞争,性能还能达到峰值的92%,这个方向可能是安全GPU编程的未来,系统编程和推理引擎开发者值得一试。
cuTile Rust(cutile-rs)是一个基于 tile 的系统,用于以地道的 Rust 编写内存安全、无数据竞争的 GPU kernel。它将 Rust 的所有权纪律延伸到了 GPU 启动边界之外:可变张量在启动前被划分为互不重叠的片段,不可变张量则被共享,而生成的启动器在 GPU 工作执行期间保持所有权。同一套模型支持同步启动、异步流水线以及 CUDA graph 重放。#[cutile::module] 宏会将每个 kernel 捕获的 Rust AST 嵌入到宿主二进制文件中;当需要某个 kernel 时,cuTile Rust 会通过 CUDA Tile IR 将该 AST JIT 编译为 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 kernel,并生成一个宿主端启动器。宿主代码会构造惰性张量操作,将可变输出划分为 128 个元素的块,并调用 .sync() 来 JIT 编译并执行该 kernel。
内核签名将访问规则带入设备代码:z 是独占的可变输出,而 x 和 y 是共享的只读输入。函数体加载与输出分区匹配的输入分块,将它们相加,并存储结果。启动网格 (8, 1, 1) 由分区推断得出:1024÷128 = 8 个分块。
- 通过
cargo run -p cutile-examples --example saxpy运行一个类似的示例。 - 更多内核以及主机侧 API 的使用示例可以在这里找到。
安装配置
环境要求
- NVIDIA GPU with compute capability
sm_80or higher (minimum supported architecture:sm_80).sm_100+由 CUDA 13.1+ 支持。sm_8x支持是在 CUDA 13.2 中加入的。- CUDA 13.3 新增了
sm_90支持,因此 CUDA 13.3 用户现在已具备sm_80+覆盖。 - 低于
sm_80的架构(例如sm_70和sm_75)不在支持范围内,我们也不计划支持它们。
- 推荐使用 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 安装目录,以获得可复现的环境配置。如果未设置,cuTile 会搜索标准的 CUDA 13.3/13.2 安装位置,例如 /usr/local/cuda-13.3、/usr/local/cuda-13.2、/usr/local/cuda-13 和 /usr/local/cuda。
示例 .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
相关项目与参考资料
- Grout:由 Hugging Face 用 Rust 编写的 Qwen 3 推理引擎,基于 cuTile Rust 构建,可作为生产环境内核调用点的参考。
- cuTile Python:使用 CUDA Tile 进行 Python 内核编程。
- TileGym:CUDA Tile 内核示例与调优模式,其中包括一组开箱即用的 cuTile Rust 内核,位于
ops/cutile_rs。 - cuda-oxide:NVlabs 的实验性 Rust 到 CUDA 编译器,用于以 Rust 编写 SIMT 风格的 GPU 内核。
- CUDA Tile IR 文档:CUDA Tile IR 参考文档。
- CUDA 文档:CUDA 工具包文档。
- Rust NVPTX 后端:rustc 针对 NVIDIA GPU 生成 PTX 的目标支持。
论文
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 roofline 分析所测,在内存受限的推理任务上展现出具有竞争力的 SOTA 性能。
论文评估的可复现性工件可在此处获取。面向论文的测量均针对 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} }
许可证
所有 crate 均依据 Apache License, Version 2.0 授权:https://www.apache.org/licenses/LICENSE-2.0
来源:Hacker News 热门(buzzing.cc 中文翻译) · github.com