NVIDIA发布CUDA-oxide:用Rust写CUDA内核的官方编译器来了

GPU编程一直是C/C++的领地。想写CUDA内核?你得学CUDA C++、用nvcc编译器、处理各种内存管理陷阱。但NVIDIA Labs最近开源的 cuda-oxide 项目可能改变这一切——它让你直接用Rust写GPU内核,编译器帮你把Rust翻译成PTX。

什么是CUDA-oxide?

CUDA-oxide 是一个实验性的 Rust-to-CUDA 编译器,由 NVIDIA Labs(NVlabs)开发并开源。它的核心理念是:让开发者用安全、地道的Rust代码编写SIMT GPU内核,编译器自动将其编译为PTX汇编,不需要任何DSL或语言绑定。

项目地址:github.com/NVlabs/cuda-oxide
文档:nvlabs.github.io/cuda-oxide

编译流程

CUDA-oxide 的编译管线如下:

  1. 使用 #[cuda_module]#[kernel] 宏标注Rust模块和函数
  2. 编译器从Rust源码提取 MIR(Mid-level IR)
  3. 通过 Pliron IR(类似MLIR的中间表示)进行GPU特化
  4. 最终通过 LLVM 的 NVPTX 后端生成 PTX 代码

整个流程用 cargo oxide 子命令驱动,包括 cargo oxide runcargo oxide buildcargo oxide debug 等。

代码示例:向量加法

下面是一个用CUDA-oxide写的GPU向量加法示例:

use cuda_device::{cuda_module, kernel, thread, DisjointSlice};
use cuda_core::{CudaContext, DeviceBuffer, LaunchConfig};

#[cuda_module]
mod kernels {
    use super::*;
    #[kernel]
    fn vecadd(a: &[f32], b: &[f32], mut c: DisjointSlice<f32>) {
        let idx = thread::index_1d();
        let i = idx.get();
        if let Some(c_elem) = c.get_mut(idx) {
            *c_elem = a[i] + b[i];
        }
    }
}

fn main() {
    let ctx = CudaContext::new(0).unwrap();
    let stream = ctx.default_stream();
    let module = kernels::load(&ctx).unwrap();
    let a = DeviceBuffer::from_host(&stream, &[1.0f32; 1024]).unwrap();
    let b = DeviceBuffer::from_host(&stream, &[2.0f32; 1024]).unwrap();
    let mut c = DeviceBuffer::<f32>::zeroed(&stream, 1024).unwrap();
    module.vecadd(&stream, LaunchConfig::for_num_elems(1024), &a, &b, &mut c).unwrap();
    let result = c.to_host_vec(&stream).unwrap();
    assert_eq!(result[0], 3.0);
}

这段代码定义了一个GPU内核 vecadd,使用Rust的切片引用和 DisjointSlice 来保证GPU上的内存安全。主机端代码负责创建CUDA上下文、分配设备缓冲区、启动内核并读取结果。

安装要求

依赖 版本要求 说明
操作系统 Linux(Ubuntu 24.04测试) 不支持Windows
NVIDIA GPU Ampere+(sm_80+) 驱动545+
CUDA Toolkit 12.x+ 需要nvcc和cuda.h
LLVM 21+ 需要NVPTX后端
Clang 21+ 用于bindgen
Rust Nightly(pinned) nightly-2026-04-03

安装步骤:

# 安装cargo-oxide
cargo install --git https://github.com/NVlabs/cuda-oxide.git cargo-oxide

# 验证环境
cargo oxide doctor

# 运行示例
cargo oxide run vecadd

高级特性

  • GPU安全模型:在GPU代码中支持Rust的所有权和借用检查
  • 异步GPU编程:DeviceOperation模型、组合器、流管理
  • 共享内存:GPU Shared Memory支持
  • Warp级编程:Warp-Level原语
  • TMA:Tensor Memory Accelerator支持
  • 闭包和泛型:GPU上也能用闭包和泛型

现状与限制

CUDA-oxide 目前是 v0.1.0,处于早期实验阶段。有以下限制:

  • 仅支持Linux,不支持Windows
  • 需要最新的LLVM 21和Rust Nightly
  • 仅支持Ampere及以上架构的GPU
  • 文档虽然完整,但生态工具还在早期

简评

对Rust开发者来说,这是一个重大信号——NVIDIA官方在推动Rust进入GPU编程领域。虽然还是实验性项目,但编译管线的设计思路很清晰,文档质量也很高。如果你的团队已经在用Rust做系统级开发,CUDA-oxide值得关注和试用。对于AI/ML开发者,这意味着未来可能用纯Rust栈从训练到推理全链路覆盖。

来源:
CUDA-oxide GitHub仓库
CUDA-oxide 官方文档

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容