NVIDIA now lets you write CUDA kernels natively in Rust, compiled to PTX, through two separate projects: cuda-oxide for SIMT and cutile-rs for the tile model.
4 min read
CUDA Rust is NVIDIA's September 2026 effort to let GPU kernels be written natively in Rust and compiled to PTX, through two projects: cuda-oxide for the SIMT model, where you write what one thread does, and cutile-rs for the Tile model, where you write what one tile of data does and the compiler maps it to the hardware. NVIDIA's guidance is to start with cutile-rs, a published crate that runs on stable Rust, and drop to cuda-oxide, which needs a pinned nightly toolchain, only when you need direct control over memory and threads.
cutile-rs is the lighter of the two to get running: it's a published crate, needs no nightly toolchain, and needs no LLVM of your own — just a supported GPU, a compatible CUDA toolkit, a recent stable Rust toolchain, and Linux.
The SIMT track (cuda-oxide) is installed differently, as a custom rustc codegen backend driven by a Cargo subcommand, and needs a pinned nightly toolchain, clang with libclang headers, and a CUDA toolkit:
Both tracks ship the same example — elementwise addition over 1,024 floats — so you can compare them directly. Here is the Tile version. Paste it into src/main.rs and run cargo run:
The equivalent SIMT program (cuda-oxide) is built the same way, via cargo oxide new vecadd_demo && cargo oxide run, but needs a DisjointSlice<f32> type on the output parameter to make the same exclusivity guarantee that Tile gets from .partition() — full listing at the NVIDIA blog post.
Everything about both tracks follows from what unit of work the kernel body describes. In SIMT, the function body is what one thread does, and you're responsible for indexing into flat memory correctly for that thread — which is why cuda-oxide needs a type like DisjointSlice to prove, at compile time, that no two threads can write the same element. In Tile, the function body is what one tile does — a whole sub-tensor treated as a single logical unit — and the compiler, not you, decides how many real GPU threads back that tile and how the mapping changes across architectures. That's the whole reason NVIDIA's guidance is to reach for Tile first: your source code doesn't encode architecture-specific choices, so it doesn't need updating when the target GPU does. You only drop to SIMT when you need that lower-level control over memory and threads yourself (source).
#[cutile::entry] function and PTX.The sources do not give version numbers, pricing, or benchmark figures for either track, and do not describe the promised inter-language interop beyond stating that it's planned.
The SIMT track of CUDA Rust: a custom rustc codegen backend driven by cargo oxide. It needs a pinned nightly toolchain, clang with libclang headers and a CUDA toolkit, and uses types like DisjointSlice to prove no two threads write the same element.
Run cargo add cutile in a new project. It needs a supported GPU, a compatible CUDA toolkit, a recent stable Rust toolchain and Linux, with no nightly and no separate LLVM.
Tile first, per NVIDIA. Tile source doesn't encode architecture-specific choices, so it needn't change when the target GPU does. Use SIMT when you need low-level control over memory and threads.
In September 2026, NVIDIA announced it is leaning into native GPU programming in Rust. CUDA C++ and CUDA Python are mature, enterprise-grade toolchains, and NVIDIA will be growing and maturing CUDA R…
Explore the product
Untested by us. Check what's included, the license and refund terms before you buy.
Generators, lazily: what yield actually does to a function.
Summary12 Oct 20261 min read
Assignment expressions, explained with the examples that actually help.
Summary12 Oct 20261 min read
Use a timezone-aware datetime; utcnow() is deprecated since Python 3.12.
Summary12 Oct 20261 min read