1个不稳定版本

0.1.1 2021年12月5日

#738编程语言

MIT/Apache

20KB
374

Rust CUDA项目

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

指南 | 入门 | 特性

⚠️ 项目仍在早期开发阶段,请预期可能出现错误、安全问题以及不正常的功能 ⚠️

目标

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

背景

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

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

然而,Rust与CUDA之间的关系在历史上一直非常复杂。直到现在,唯一的可行选项是使用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 结果等高级特性的高级包装器,使管理 GPU 接口更容易、更干净。
    • 是 CUDA 驱动 API 的高级包装器,是 C++ 中更常用的 CUDA 运行时 API 的低级版本。
    • 比 C++ 运行时 API 提供更细粒度的控制,例如内核并发和模块加载。
  • gpu_rand 用于 GPU 友好的随机数生成,目前仅实现了来自 rand_xoshiro 的 xoroshiro RNG。
  • optix 用于 CPU 端的硬件光线追踪和去噪,使用 CUDA OptiX 库。

此外,还包含许多“粘合”crate,用于为某些较小的 CUDA 库提供高级包装器。

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

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

许可证

根据您的意愿,许可协议可以是以下之一:

任您选择。

贡献

除非您明确声明,否则任何有意提交以包含在作品中的贡献(根据 Apache-2.0 许可证定义),都应按上述方式双重许可,没有任何附加条款或条件。

没有运行时依赖