#gpu #cuda #numbers #generator #ecosystem #executing #gpu-friendly

nightly gpu_rand

Rust CUDA 项目中的 GPU 友好型随机数生成器

4 个版本

0.1.3 2022年2月7日
0.1.2 2021年12月5日
0.1.1 2021年11月26日
0.1.0 2021年11月22日

#335 in 并发

MIT/Apache

175KB
3.5K SLoC

Rust CUDA 项目

一个用于编写和执行极快 GPU 代码的库和工具生态系统,完全使用 Rust

指南 | 入门 | 特性

⚠️ 项目仍处于早期开发阶段,请预期可能出现错误、安全问题和某些功能无法使用 ⚠️

目标

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

背景

历史上,通用高性能 GPU 计算通常使用 CUDA 工具包来完成。CUDA 工具包主要提供了一种方法,可以在单个源代码中与 CPU 代码一起使用 Fortran/C/C++ 代码进行 GPU 计算。它还提供了许多库、工具、论坛和文档,以补充单源 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__ 性能优势,出色的模块/包系统,使用 unsafe 标识 CPU/GPU 代码的不安全区域,以及高级包装器对低级 CUDA 库的访问等。

结构

Rust CUDA项目的范围非常广泛,涵盖了CUDA生态系统的全部,提供了使用Rust可用的库和工具。因此,该项目包含了许多针对CUDA生态系统各个角落的crate。

当前的库列表如下

  • rustc_codegen_nvvm 这是一个rustc后端,针对NVVM IR(LLVM IR的一个子集)的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库的高级包装器的“胶水”crate。

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

  • 2016年:[glassful](https://github.com/kmcallister/glassful) Rust的子集,编译为GLSL。
  • 2017年:[inspirv-rust](https://github.com/msiglreith/inspirv-rust) 实验性的Rust MIR -> SPIR-V编译器。
  • 2018年:[nvptx](https://github.com/japaric-archived/nvptx) 使用rustc的nvptx目标(使用LLVM PTX后端)的Rust到PTX编译器。
  • 2020年:[accel](https://github.com/termoshtt/accel) 高级库,依赖于与nvptx相同的机制。
  • 2020年:[rlsl](https://github.com/MaikKlein/rlsl) 实验性的Rust -> SPIR-V编译器(rust-gpu的前身)。
  • 2020年:[rust-gpu](https://github.com/EmbarkStudios/rust-gpu) Rustc代码生成后端,将Rust编译为SPIR-V,用于着色器,与我们的项目有类似的机制。

许可证

根据您的意愿,许可为以下之一

  • Apache License,版本2.0([LICENSE-APACHE](https://github.com/Rust-GPU/Rust-CUDA/blob/HEAD/crates/gpu_rand/../../LICENSE-APACHE) 或 [https://apache.ac.cn/licenses/LICENSE-2.0](https://apache.ac.cn/licenses/LICENSE-2.0))
  • MIT许可证([LICENSE-MIT](https://github.com/Rust-GPU/Rust-CUDA/blob/HEAD/crates/gpu_rand/../../LICENSE-MIT) 或 [http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT))

贡献

除非您明确声明,否则您提交的任何贡献,按照Apache-2.0许可证的定义,将根据上述条款双许可,不附加任何额外条款或条件。

依赖项

~5.5MB
~146K SLoC