Introducing CUDA Rust: Two Tracks for Writing GPU Kernels NVIDIA announced CUDA Rust, a native GPU programming toolchain for Rust, with two tracks: SIMT (cuda-oxide) and Tile, to mature through 2027. The SIMT track, cuda-oxide, is a custom rustc codegen backend that compiles Rust kernels to PTX, requiring Linux, a GPU with compute capability 8.0+, and CUDA toolkit 12.x or newer. NVIDIA recommends the Tile model for new projects, as it abstracts architecture-specific choices. 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 Rust into 2027 and beyond The systems layer of AI spans inference engines, serving infrastructure, drivers, and agent runtimes, and it churns constantly as models and techniques change. More and more of it is written in Rust, which catches whole classes of bugs at compile time without giving up performance. NVIDIA is part of that shift for the same reason. The Nova Linux driver is written in Rust. NVIDIA Dynamo https://www.nvidia.com/en-us/ai/dynamo/ is built on a Rust core. NVTX has Rust bindings. The GPU kernel is the exception. You can launch kernels from Rust, but the kernel itself often has to be written in another language. NVIDIA CUDA Rust closes that gap. GPU kernels can be written in Rust, compiled natively to PTX, rather than a wrapper around code from somewhere else. There are two tracks to use Rust, matching the two tracks CUDA itself has. SIMT is the model you already write in CUDA C++ or numba-cuda https://nvidia.github.io/numba-cuda/ . You indicate what one thread does, and launch thousands of them. Tile is a newer programming model, which is also available in C++ https://docs.nvidia.com/cuda/cuda-tile-cpp-api-reference/ and Python https://docs.nvidia.com/cuda/cutile-python/ . All of these frontends let you say what one tile of data does, and the Tile IR compiler https://docs.nvidia.com/cuda/tile-ir/latest/index.html does the rest. When you are picking one to build on, reach for Tile first. The compiler decides how tiles map onto each architecture, so your source doesn’t encode architecture-specific choices, and you drop to SIMT when you need that control or want to manage memory and threads yourself. Which language you reach for is a separate question from which model. Use the CUDA exposure that best fits the stack you already have. The two projects below are for when that stack is Rust. We plan to support inter-language interop, so the choice does not lock you out of the others. Below is the same kernel on each track, which performs elementwise addition over 1,024 floats. Both are complete programs, both run, and both print the same line, so you can read them side by side and see what changes. The SIMT track: cuda-oxide cuda-oxide https://github.com/NVlabs/cuda-oxide is a custom rustc codegen backend. It intercepts compilation, routes kernel functions through Rust MIR, the community Pliron https://github.com/pliron-org/pliron IR framework, and LLVM IR down to PTX, and hands everything else to the standard backend. The GPU dialects on top of Pliron are ours. The dialects and every transform stay in Rust until the standard LLVM backend takes over. You will need Linux, a GPU with compute capability 8.0 or later, a CUDA toolkit 12.x or newer , clang with its libclang headers, and the pinned nightly toolchain. cargo oxide doctor checks all of it, including the optional system LLVM. Install cargo-oxide , the Cargo subcommand that drives the build: cargo +nightly-2026-04-03 install --git https://github.com/NVlabs/cuda-oxide.git cargo-oxide Then scaffold a project and run it. The template is a complete vector addition program: cargo oxide new vecadd demo cd vecadd demo cargo oxide doctor cargo oxide run The first cargo oxide run builds the codegen backend, so expect it to take a while. Later runs reuse the cache. It prints PASSED: all 1024 elements correct . This is the whole program that did it, exactly what cargo oxide new wrote, with comments added here: use cuda device::{kernel, launch bounds, launch contract, thread, DisjointSlice}; use cuda host::cuda module; use cuda core::{CudaContext, DeviceBuffer, LaunchConfig1D}; // === DEVICE CODE - everything in here is compiled to PTX === // The macro also generates the host-side API used further down: // load , prepare vecadd , and the safe vecadd launch method. cuda module mod kernels { use super:: ; kernel // GPU entry point launch bounds 256 // max threads per block; lets the compiler budget registers launch contract domain = 1, block = 256, 1, 1 // indexes in 1-D, 256-thread blocks pub fn vecadd a: & f32 , b: & f32 , mut c: DisjointSlice