Supported Features#
This appendix presents the cuda-oxide feature matrix: every compiler capability, runtime API, and hardware feature along with its current support status. The data is drawn from the compiler/runtime sources and the test suite.
Legend: Full = tested and working, Partial = ships and works but has a known gap (called out in the row description), Planned = on the roadmap, N/A = not applicable or no identified need.
Compiler: Memory Model#
Feature |
Status |
Description |
|---|---|---|
HMM / Unified Memory Management |
Full |
GPU directly reads/writes host memory without |
Unified Struct ABI (no |
Full |
Device struct layout matches host exactly. The compiler queries rustc’s actual layout and reproduces it with explicit padding in LLVM IR. Works with |
Dynamic Layout Matching |
Full |
Compiler queries rustc’s |
Packed Layouts ( |
Partial |
Field addresses formed through a pointer ( |
Pointer Distance ( |
Full |
|
Volatile Load/Store |
Full |
|
Bulk Copy ( |
Full |
|
Compiler: Type System#
Feature |
Status |
Description |
|---|---|---|
Generics and Monomorphization |
Full |
Generic kernels and device functions with trait bounds. Monomorphized instances collected from rustc MIR. Const generics supported. |
Enums ( |
Full |
Full enum support including discriminant extraction and payload access. Pattern matching on enums works. |
Struct Construction and Field Access |
Full |
Struct literals, field access, pass-by-value and return values. User-defined structs supported without annotations. |
Array Types ( |
Full |
Static construction, constant- and runtime-index access. Array value constants (bare and nested) materialized. Mutable arrays auto-promoted to memory-backed. |
|
Full |
Generic SIMD register type with named accessors ( |
ABI Scalarization |
Full |
Slices are scalarized at kernel boundaries ( |
Array value constants support primitive leaves (integers, f16, f32,
f64), nested arrays, and tuples recursively composed of supported scalar,
enum, tuple, and zero-sized fields. Tuple element strides and field offsets
come from rustc layout, including internal and trailing padding; direct tuple
value constants use the same layout-aware decoder. Struct constants (direct
and promoted-by-reference) also read every field at its rustc layout offset,
so padded, reordered, #[repr(C)], and nested shapes decode correctly, and a
struct’s stored size is its padded size, which fixes the element stride for
arrays of padded structs inside constants. Pointer-free initialized union
constants are materialized from rustc’s evaluated storage image without
guessing an active field: initialized bytes are preserved, uninitialized
inactive bytes remain undef, and the byte image is transmuted into the
layout-exact union type. This includes direct unions, unions nested in tuple or
struct constants, runtime-indexed [U; N], and MaybeUninit<T> constants.
Bare arrays whose elements are recursively promotable structs use the same
immutable-device-global path as scalar and tuple tables, avoiding a per-thread
local table copy for read-only uses. This promotion also admits supported thin
pointer/reference leaves. Their evaluated byte image remains byte-exact while
pointer slots are preserved as symbolic device-global relocations, including
non-zero byte addends into referenced device statics. Relocation targets are
materialized explicitly, and promoted-global deduplication includes relocation
identity as well as type and bytes so byte-identical tables that point at
different statics cannot alias.
Pointer-to-array constants such as const R: &[Struct; N] = &TABLE use the same
promoted immutable global when every element is recursively promotable and the
converted storage size matches rustc’s layout. When the outer pointer selects a
subrange of a backing allocation, relocation source offsets inside that range
are rebased into the promoted initializer while preserving their target and
addend. Unsupported bare array constants retain the existing element-wise
fallback where available; pointer-to-array constants continue to fail closed
when no correct fallback exists. Zero-byte over-aligned struct leaves (for
example, repr(align(N)) ZSTs) remain on the existing alignment-sensitive value
path instead of this promotion path. Promotion includes repr(packed) and
repr(packed(N)) structs when lowering can reproduce their recorded field
offsets with an exact packed LLVM struct; the value and reference forms
deduplicate to the same immutable initializer. Overlapping or otherwise
non-representable struct layouts remain outside immutable promotion and keep
the existing fail-closed behavior.
Thin pointer fields in array, tuple, and struct const values that do not take
the immutable-table promotion path are materialized via MirGlobalAllocOp per
field, including non-zero byte addends into a static (see
struct_constant_provenance, tuple_constant_provenance,
tuple_array_provenance). The array_constants regression also covers a
promoted pointer-bearing tuple table with both a zero-addend static reference
and a non-zero static-subobject addend, and verifies that optimized code does
not retain a per-thread table depot.
Slice fat-pointer fields in aggregate constants are also supported when their
data pointer relocates to a device static and the pointee is a same-element
array-to-slice view. Their literal usize length metadata is decoded
independently, including non-zero static byte addends and nested aggregate field
offsets. Thin-pointer-only union constants preserve the same relocation
provenance, including non-zero addends, by reconstructing one typed pointer
carrier instead of transmuting placeholder bytes. Compatible SharedRef
alternatives must have the same translated pointee type; UniqueRef union
constants remain rejected. Raw-pointer
alternatives may differ only in pointee view while retaining the same raw kind,
mutability, and address space. Relocation-free pointer/integer unions whose
storage is exactly one fully initialized, naturally aligned pointer word, whose
pointer alternatives are generic raw pointers of one kind, and whose integer
alternatives are full-width may instead use rustc’s evaluated byte image. The
importer transmutes that image only to the integer field and inserts the field
into the union, so no inactive pointer alternative is materialized.
Relocation-bearing pointer/integer unions, fat or nested pointer storage in
unions, over-aligned/padded pointer unions, unsupported fat-pointer metadata,
and pointer-to-array union constants (&[U; N]) remain rejected. Top-level
thin-pointer-only device-global union initializers may preserve one full-width
relocation at byte zero; mixed pointer/integer device-global initializers remain
rejected.
Enum constants preserve payload relocations to device statics, including
non-zero byte addends. This includes niche-encoded Option<&T> and
direct-tagged enum layouts, both for direct thin-reference payloads and for
pointers nested inside tuple, struct, or array payload fields. Relocation-carrying
enum constants can also be nested inside tuple, struct, and array constants.
Anonymous promoted allocations remain unsupported.
Compiler: Closures#
Feature |
Status |
Description |
|---|---|---|
Move Closures ( |
Full |
Closures that capture by value. The whole closure struct is pushed as one byval kernel argument. |
Reference Closures ( |
Full |
Non-move closures that capture by reference. The closure struct (containing host pointers) still travels as one byval argument; the GPU reads through those pointers via HMM. |
Host-to-Device Closures |
Full |
Closures defined on host passed to generic kernels. Polynomial evaluation with captured coefficients tested. |
Device-Internal Closures |
Full |
Closures created and used entirely on device, including closures passed to device functions. |
Compiler: Control Flow#
Feature |
Status |
Description |
|---|---|---|
Match Expressions (integer switch) |
Full |
Multi-way match on integers. Generates chain of conditional branches. |
Match on Enums |
Full |
Pattern matching on |
For Loops (range, iterator, enumerate) |
Full |
Full iterator desugaring: range-based, |
While Loops / If-Else |
Full |
Baseline control flow fully supported. |
Break and Continue |
Full |
|
Loop Unroll Annotations |
Partial |
|
Monomorphization-Dead Branches |
Partial |
Branches that become dead after generic specialization (e.g. the const-false arm of |
Compiler: Arithmetic and Casting#
Feature |
Status |
Description |
|---|---|---|
64-bit Arithmetic |
Full |
Full 64-bit integer arithmetic including shifts, bitwise ops, and descriptor field packing. |
Type Casting (all kinds) |
Full |
IntToInt, IntToFloat, FloatToInt, FloatToFloat, Transmute (bitcast), PtrToPtr, PtrToInt, IntToPtr, pointer coercions. |
Packed bf16x2 FMA |
Full |
|
Compiler: Interop#
Feature |
Status |
Description |
|---|---|---|
Bi-directional LTOIR Support |
Full |
Rust kernels call CUDA C++ device functions and C++ calls Rust device functions. Via NVVM IR → libNVVM → LTOIR → nvJitLink. |
Device FFI ( |
Full |
|
MathDx FFI (cuFFTDx / cuBLASDx) |
Full |
cuFFTDx (8/16/32-point thread-level FFT), cuBLASDx (32x32x32 block-level GEMM) via LTOIR. |
Tile interop |
Experimental |
Inter-kernel interop works today: a cutile-rs Tile kernel and a cuda-oxide SIMT PTX kernel can run in one host process on the same CUDA stream over shared device tensors. Intra-kernel Tile interop is work in progress and tracked in #96. |
Cross-Crate Kernels |
Full |
Kernels and device functions defined in library crates with monomorphization at the binary crate use site. |
Compiler: Functions#
Feature |
Status |
Description |
|---|---|---|
|
Full |
Marks functions as GPU kernel entry points ( |
|
Full |
Device-side helper functions callable from kernels. |
Standalone |
Full |
Device functions compiled without any kernel present. Clean export names for C++ consumption. |
Multi-Kernel Modules |
Full |
Multiple |
Compiler: Compilation Pipeline#
Feature |
Status |
Description |
|---|---|---|
Unified Single-Source Compilation |
Full |
Host and device code in the same file. Custom rustc codegen backend intercepts codegen. No |
PTX Output |
Full |
Default output: Rust MIR → |
NVVM IR Output |
Full |
Selects LLVM 7 typed-pointer syntax for pre-Blackwell GPUs and opaque-pointer syntax for Blackwell and newer GPUs. The generated module is verified by libNVVM, and unsupported legacy operations produce a compile error. |
LTOIR Linking |
Full |
Device-side LTO via libNVVM and nvJitLink. |
Float Math Intrinsics (libdevice) |
Full |
Rust |
Pipeline Inspection |
Full |
|
PTX Inspect |
Full |
|
Local Clean |
Full |
|
Compute Sanitizer Wrapper |
Full |
|
cuda-gdb Source Debugging |
Full |
|
cuda-gdb Local / Argument Inspection |
Partial |
|
Compiler: Inline PTX#
Feature |
Status |
Description |
|---|---|---|
|
Partial |
CUDA inline PTX with |
Runtime Library: Safety#
Feature |
Status |
Description |
|---|---|---|
|
Full |
Bounds-checked parallel write output slice. |
|
Full |
Opaque, non-transferable witness. |
Proof-carrying static views |
Full |
A checked |
|
Full |
Checked, reusable launch geometry branded for the exact kernel. Raw |
|
Full |
Compile-time barrier lifecycle: |
Runtime Library: Atomics#
Feature |
Status |
Description |
|---|---|---|
Device-Scope Atomics |
Full |
|
Block-Scope Atomics |
Full |
|
System-Scope Atomics |
Full |
|
|
Full |
Standard library atomic types lowered to PTX |
Runtime Library: Thread and Synchronization#
Feature |
Status |
Description |
|---|---|---|
Thread/Block/Grid Intrinsics |
Full |
|
Block Synchronization |
Full |
|
Async Barriers (mbarrier) |
Full |
Hardware async barriers for Hopper+: init, arrive, test_wait, try_wait, inval. |
Cluster Synchronization |
Full |
|
Fence Operations |
Full |
|
Runtime Library: Warp#
Feature |
Status |
Description |
|---|---|---|
Warp Shuffle Operations |
Full |
|
Warp Vote Operations |
Full |
|
Lane/Warp ID |
Full |
|
Warp Reduction ( |
Full |
One-instruction full-warp reduction. Integers on sm_80+: |
Runtime Library: Cooperative Groups#
Feature |
Status |
Description |
|---|---|---|
Typed Group Handles |
Full |
|
Group Universal API |
Full |
|
Warp Tile Partitioning |
Full |
|
Warp Collectives |
Full |
|
Warp Reductions / Scans |
Full |
|
Block Reductions / Scans |
Full |
|
Cooperative Kernel Launch |
Full |
|
Runtime Library: Debug#
Feature |
Status |
Description |
|---|---|---|
|
Full |
Formatted GPU output with full format specifier support. Lowers to |
|
Full |
The no-message form calls |
Debug Intrinsics |
Full |
|
Runtime Library: Kernel Launch#
Feature |
Status |
Description |
|---|---|---|
|
Full |
Embedded module loading with typed sync/async arguments. Raw configuration methods are unsafe. |
|
Full |
Checked dimensionality, exact block shape, resources, capabilities, context, and kernel identity. |
|
Full |
Unsafe lower-level launch for runtime-loaded modules; requires |
|
Full |
Unsafe lower-level lazy launch; requires |
|
Full |
Occupancy hints: max threads per block, min blocks per SM. |
|
Full |
Compile-time cluster dimensions. Emits |
Runtime Library: TMA#
Feature |
Status |
Description |
|---|---|---|
TMA Bulk Tensor Copy (1D–5D) |
Full |
|
TMA Multicast |
Full |
Single TMA load broadcast to all CTAs in cluster. sm_100a for full multicast. |
TMA Commit/Wait Groups |
Full |
|
Runtime Library: Matrix and Tensor Cores#
Feature |
Status |
Description |
|---|---|---|
Warp-Level MMA ( |
Full |
Register-only |
Sparse MMA |
Full |
Structured-sparsity |
Warpgroup MMA ( |
Partial |
Hopper |
Tensor Core Gen 5 ( |
Full |
Blackwell sm_100+: TMEM alloc/dealloc, MMA, |
Accumulator Fragment Algebra ( |
Full |
Index algebra for the |
FP8 / FP6 / FP4 Formats |
Partial |
Conversions ( |
Not Yet Implemented#
Feature |
Status |
Notes |
|---|---|---|
Rust |
Planned |
Use |
Dynamic Dispatch ( |
N/A |
Use generics with static dispatch. Haven’t found a real need for this. |
Heap Allocation ( |
N/A |
CUDA has a device-side heap ( |
|
N/A |
Use |
Panic / Unwinding |
N/A |
Panic paths exist in MIR but the compiler strips |
Standard Library ( |
N/A |
|
Texture Memory |
N/A |
Lower priority given TMA availability on Hopper+. |