开发者生态
morning
CUDA-oxy:Nvidia 的官方 Rust 到 CUDA 编译器
2026-05-11
1 阅读
adamnemecek
cuda-oxy 书 # cuda-oxy 是一个实验性的 Rust 到 CUDA 编译器,可让您使用安全(ish)、惯用的 Rust 编写(SIMT)GPU 内核。它将标准 Rust 代码直接编译为 PTX——没有 DSL,没有外语绑定,只有 Rust。注意本书假设您熟悉 Rust 编程语言,包括所有权、特征和泛型。后面关于异步 GPU 编程的章节还假设具备 async / .await 和 tokio 等运行时的工作知识。如需复习,请参阅 Rust 编程语言、Rust 示例或异步书籍。项目状态 # v0.1.0 版本是早期 alpha 版本:在我们努力改进它的过程中,预计会出现错误、不完整的功能和 API 损坏。我们希望您尝试一下,并通过分享您的体验反馈来帮助确定其方向。 ? 快速入门 # 使用 cuda_device ::{ cuda_module , kernel , thread , DisjointSlice };使用 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 ();设 i = idx 。得到 ();如果让 Some ( c_elem ) = c 。 get_mut ( idx ) { * c_elem = a [ i ] + b [ i ]; } } } fn main () { let ctx = CudaContext::new (0).展开 ();让流 = ctx 。默认_流();让 module = kernels :: load ( & ctx )。展开 ();让 a = DeviceBuffer :: from_host ( & 流 , & [ 1.0 f32 ; 1024 ])。展开 ();让 b = DeviceBuffer :: from_host ( & 流 , & [ 2.0 f32 ; 1024 ])。展开 ();让 mut c = DeviceBuffer :: < f32 > :: 归零(&stream,1024)。展开 ();模块 。 vecadd ( & 流 , LaunchConfig :: for_num_elems ( 1024 ), & a , & b , & mut c ) 。展开 ();让结果 = c 。 to_host_vec(&流)。展开 ();断言_eq! (结果[0],3.0);在安装先决条件后,使用 Cargo Oxide run vecadd 进行构建和运行。注意 #[cuda_module] 将生成的设备工件嵌入到主机二进制文件中,并生成一个类型化的 kernels::load 函数以及每个内核的一个启动方法。下层的load_kernel_module和cuda_launch!当您需要加载特定的 sidecar 工件或构建自定义启动代码时,API 仍然可用。为什么选择cuda-氧化物? # ? GPU 上的 Rust 使用 Rust 的类型系统和所有权模型编写 GPU 内核。安全是首要目标,但 GPU 有微妙之处 - 请阅读安全模型。 ? SIMT 编译器而不是 DSL。一个自定义 rustc codegen 后端,可将纯 Rust 编译为 PTX。 ⚡ 异步执行将 GPU 工作为惰性设备操作图。跨流池进行调度。使用 .await 等待结果。