8 个版本

0.3.2 2022年2月16日
0.3.1 2022年2月12日
0.2.2 2021年12月5日
0.2.0 2021年11月26日
0.1.2 2021年11月24日

#640 in 硬件支持

Download history 2496/week @ 2024-03-13 3766/week @ 2024-03-20 1011/week @ 2024-03-27 1158/week @ 2024-04-03 914/week @ 2024-04-10 886/week @ 2024-04-17 832/week @ 2024-04-24 547/week @ 2024-05-01 649/week @ 2024-05-08 621/week @ 2024-05-15 516/week @ 2024-05-22 604/week @ 2024-05-29 661/week @ 2024-06-05 542/week @ 2024-06-12 558/week @ 2024-06-19 686/week @ 2024-06-26

2,614 每月下载量
用于 25 个Crates(17个直接)

MIT/Apache

740KB
15K SLoC

包含 (ELF exe/lib, 3KB) 资源/add.cubin

Rust CUDA 项目

一个生态系统的库和工具,用于在 Rust 中编写和执行极快速度的 GPU 代码

指南 | 入门 | 特性

⚠️ 项目仍处于早期开发阶段,请预期存在错误、安全问题和无法正常工作的情况 ⚠️

目标

Rust CUDA 项目旨在将 Rust 打造为使用 CUDA 工具包进行极快 GPU 计算的一级语言。它提供将 Rust 编译成极快 PTX 代码的工具,以及用于与其一起使用现有 CUDA 库的库。

背景

历史上,通用高性能 GPU 计算一直使用 CUDA 工具包来完成。CUDA 工具包主要提供了一种方法,可以与 CPU 代码结合使用 Fortran/C/C++ 代码进行 GPU 计算。它还提供了许多库、工具、论坛和文档,以补充单源 CPU/GPU 代码。

CUDA 是专属于 NVIDIA 的工具包。许多工具已被提出用于跨平台 GPU 计算,如 OpenCL、Vulkan 计算和 HIP。然而,CUDA 仍然是最广泛使用的此类任务的工具包。这就是为什么让 Rust 成为与 CUDA 工具包一起使用的可行选项至关重要。

然而,使用 Rust 进行 CUDA 历史上一直是一条崎岖的道路。直到现在,唯一可行的选择是使用 LLVM PTX 后端,但是,LLVM PTX 后端并不总是有效,并且会为许多常见的 Rust 操作生成无效的 PTX。近年来,随着 rust-gpu(Rust -> SPIR-V)等项目的出现,已经反复证明需要一个专门针对 GPU 上 Rust 的解决方案。

我们希望随着这个项目的推进,能够推动Rust GPU计算行业的发展,让Rust成为此类任务的首选语言。Rust提供了众多优势,如每个内核的__restrict__性能优化,出色的模块/包系统,通过unsafe限定CPU/GPU代码的不安全区域,高级封装低级CUDA库等。

结构

Rust CUDA项目的范围非常广泛,涵盖了整个CUDA生态系统,包含使用Rust使其可用的库和工具。因此,项目包含了许多针对CUDA生态系统各个方面的包。

当前库列表如下

  • rustc_codegen_nvvm,这是一个针对NVVM IR(LLVM IR的子集)的rustc后端,用于libnvvm库。
    • 生成高度优化的PTX代码,可以由CUDA驱动API加载并在GPU上执行。
    • 短期内它将仅支持CUDA,但未来可能用于目标AMDGPU。
  • cuda_std,用于GPU端函数和实用工具,如线程索引查询、内存分配、warp内联函数等。
    • 不是低级库,提供许多实用函数,使编写更清洁、更可靠的GPU内核更容易。
    • rustc_codegen_nvvm紧密相连,通过它内部暴露GPU特性。
  • cust,用于CPU端CUDA特性,如启动GPU内核、GPU内存分配、设备查询等。
    • 高级封装,具有RAII和Rust Results等特性,使管理GPU接口更容易、更简洁。
    • 高级封装CUDA驱动API,C++中更常见的CUDA运行时API的低级版本。
    • 比C++运行时API提供了更细粒度的控制,如内核并发和模块加载。
  • gpu_rand,用于GPU友好的随机数生成,目前仅实现了来自rand_xoshiro的xoroshiro RNGs。
  • optix,用于CPU端硬件光线追踪和去噪,使用CUDA OptiX库。

还包括许多“胶水”包,用于封装某些较小的CUDA库的高级封装。

其他与在GPU上使用Rust相关的项目

  • 2016年:glassful,Rust的子集,编译成GLSL。
  • 2017年:inspirv-rust,实验性的Rust MIR -> SPIR-V编译器。
  • 2018年:nvptx,使用rustc的nvptx目标(使用LLVM PTX后端)将Rust编译成PTX的编译器。
  • 2020年:accel,依赖与nvptx相同机制的更高级的库。
  • 2020年:rlsl,实验性的Rust -> SPIR-V编译器(rust-gpu的前身)。
  • 2020年:rust-gpu,Rustc代码生成后端,将Rust编译成SPIR-V,用于着色器,与我们的项目具有类似机制。

许可证

根据您的选择,许可协议为以下之一

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交以包含在作品中的任何贡献,均应双重许可,如上所述,不得附加任何其他条款或条件。

依赖项

~6MB
~151K SLoC