3个版本 (重大更改)

0.3.0 2022年2月7日
0.2.0 2021年12月5日
0.1.0 2021年11月22日

编程语言 中排名 364

每月下载 50
2 个crate中(通过 image-transitions)使用

MIT/Apache

645KB
15K SLoC

Rust 12K SLoC // 0.1% comments C++ 3K SLoC // 0.1% comments LLVM 227 SLoC // 0.1% comments

Rust CUDA项目

一个生态系统,用于使用Rust编写和执行极快GPU代码

指南 | 入门 | 功能

⚠️ 项目仍处于早期开发阶段,请期待错误、安全问题以及不正常工作的功能 ⚠️

目标

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

背景

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

CUDA是仅适用于NVIDIA的工具包。已经提出了许多用于跨平台GPU计算的工具,如OpenCL、Vulkan Computing和HIP。然而,CUDA仍然是此类任务中使用最广泛的工具包。这就是为什么必须使Rust成为与CUDA工具包一起使用的可行选项的原因。

然而,CUDA与Rust的关系一直是历史上非常坎坷。到目前为止,唯一可行的选择是使用LLVM PTX后端,但是LLVM PTX后端并不总是有效,并且会为许多常见的Rust操作生成无效的PTX,并且在最近几年,随着像rust-gpu(Rust -> SPIR-V)这样的项目的出现,一次又一次地表明,对于GPU上的Rust需要专门的解决方案。

我们的希望是,通过这个项目,我们可以推动Rust GPU计算行业的发展,并使Rust成为此类任务的优秀语言。Rust提供了许多好处,如每个内核的 __restrict__ 性能优势、出色的模块/crate系统、使用 unsafe 划分CPU/GPU代码的不安全区域、高级包装到低级CUDA库等。

结构

Rust CUDA项目的范围非常广泛,它涵盖了CUDA生态系统的全部内容,包括用于使项目可通过Rust使用的库和工具。因此,该项目包含许多针对CUDA生态系统各个方面的crate。

当前库列表如下

  • 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的高级包装器,是更常见的CUDA运行时API(从C++中使用)的更低级版本。
    • 比C++运行时API提供了更多细粒度的控制,例如内核并发和模块加载。
  • gpu_rand用于GPU友好的随机数生成,目前仅实现了来自rand_xoshiro的xoroshiro RNGs。
  • optix用于CPU端硬件光线追踪和去噪,使用CUDA OptiX库。

此外,还有许多“胶水”crate,用于某些较小的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许可中定义的,您提交的任何有意提交以包含在工作中的贡献,都将按上述方式双重许可,没有任何额外的条款或条件。

依赖

~7–19MB
~278K SLoC