#cuda #gpu #后端 #代码生成 #目标 #rustc #libnvvm

nightly rustc_codegen_nvvm

为Rustc提供的代码生成后端,目标为libnvvm CUDA库

7个版本

0.3.0 2022年2月7日
0.2.3 2022年1月2日
0.2.2 2021年12月5日
0.1.1 2021年11月26日

#539 in 编程语言

Download history 24/week @ 2024-03-11 21/week @ 2024-03-18 25/week @ 2024-03-25 31/week @ 2024-04-01 22/week @ 2024-04-08 24/week @ 2024-04-15 50/week @ 2024-04-22 16/week @ 2024-04-29 12/week @ 2024-05-06 25/week @ 2024-05-13 22/week @ 2024-05-20 24/week @ 2024-05-27 13/week @ 2024-06-03 15/week @ 2024-06-10 10/week @ 2024-06-17 16/week @ 2024-06-24

每月 56 次下载
用于 3 个crate(通过 cuda_builder

MIT/Apache

625KB
15K SLoC

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

Rust CUDA项目

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

指南 | 入门 | 特性

⚠️ 项目仍处于早期开发阶段,请期待可能出现错误、安全问题和无法正常工作的问题 ⚠️

目标

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

背景

历史上,通用高性能GPU计算一直使用CUDA工具包完成。CUDA工具包主要提供了一种方式,可以在单个源代码中使用Fortran/C/C++代码与CPU代码协同进行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__、出色的模块/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的高级封装,是C++中更常见的CUDA运行时API的更低级版本。
    • 比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–18MB
~262K SLoC