0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Rust目前在GPU编程生态方面的现状和前景

jf_wN0SrCdH 来源:Rust语言中文社区 2023-11-21 10:13 次阅读

话说,程序员三大浪漫,操作系统、编译器和图形处理。Rust 语言已经攻陷了其中两大浪漫,操作系统和编译器,那么图形处理呢?Rust 语言还能“浪”起来吗?

这周在 Phoronix[1] 网站上得知用 Rust 重写的 NAK 编译器已经被 Merge 到了 Mesa 24.0 版本中,用于 Nouveau Gallium3D 驱动程序和 NVK Vulkan 驱动程序。这激起了我的好奇心。因为 GPU 编程是 Rust 语言进入图形处理的关键,所以我想彻底了解一下 Rust 目前在 GPU 编程生态方面的现状和前景。

这就是本文的出发点。

Mesa 相关背景介绍

Mesa (或称 Mesa3D) 是一个 OpenGL/Vulkan 的实现,以及为所有开源图形驱动提供各种图形库(GL)的入口点。

Mesa有两个作用:

对接各种 GPU 硬件,将应用层对 GL API 的调用转换到对硬件 GPU 的调用上;

各种 GL API 的纯软实现,当没有可用的硬件时,它可以提供纯软件的 GL API 的实现;

它可以用于 Linux/Windows/Mac 等系统平台。在 Windows 上运行时它提供 OpenGL API over DirectX 的转换。AMDIntel 都提供了对 Mesa 支持的驱动程序。

NVIDIA 有两种类型的显卡驱动:一个是开源的 Nouveau ,另一个是闭源的 NVIDIA 官方驱动。Mesa 使用了开源的 Nouveau 驱动。而 Gallium3D 是 Mesa 提出的用于简化 GPU 驱动开发的框架。

NVK,是由 Collabora 推出的一个新的 Mesa 开源驱动程序,为 NVIDIA 显卡实现 Vulkan 图形 API。该驱动程序是使用 NVIDIA 发布的官方头文件,以及开放的数据中心 GPU 和消费级 GPU(GTX/RTX)的 GPU 内核模块,从头开始编写的。它的目标是成为新的主流显卡驱动。

NVK 与其他的 Nouveau 驱动非常不同,因为它是从头开始编写的。

nouveau 是一个主要的 NVIDIA 显卡的开源驱动程序,已经年久失修了,试图在它的基础上构建是一个很多人都无法承担的任务。当然,它是由有很多才华的工程师开发的,但是缺乏公司的支持和贡献者的影响了它的发展。NVK 旨在克服这些问题,同时专注于对 Turing 系列及更高版本 GPU 的支持。

由于内核的开发方式,对于 Kepler、Maxwell 和 Pascal 等较旧的 GPU 的支持可能不会很容易地加入 NVK。它也许极大地依赖于新内核,从而只支持较新的 GPU。同时,nouveau 内核接口与 Vulkan 不兼容,阻碍了对较旧 GPU 的支持。

而用 Rust 实现的新的 NAK (Nvidia awesome kompile)编译器,是一个为 NVIDIA GPU 设计的后端编译器,专门为处理 GPU 任务优化。NAK 使用静态单赋值形式(SSA)和中间表示(NIR),这有助于优化代码并提高 GPU 的执行效率。

静态单赋值形式(SSA)是一种编译器中间表示,使每个变量只被赋值一次。这简化了许多编译器优化,因为变量的值在它们的生命周期内保持不变。在转换为 SSA 形式时,编译器会重写代码,使得每个变量的每个赋值操作都有一个唯一的变量名。使得数据流分析更加直接和高效,因为每个变量的定义和使用都是显而易见的。

顺便说一下,Rust 编译器(rustc)在编译过程的 MIR 和 LLVM IR 这两个阶段也使用了静态单赋值形式(SSA)。

NIR 是 Mesa 中提供的一种更加具体的中间语言,它是为了优化和简化驱动编译器的工作流程而设计的。NIR 设计上更接近硬件,旨在作为多个不同前端(如 GLSL、SPIR-V)和多个不同后端(如不同的 GPU 驱动)之间的桥梁。NIR 也支持 SSA 等各种优化技术。NIR 使 Mesa 能够更有效地处理来自不同源的图形和计算着色器代码,为最终在 GPU 上执行的代码生成和优化奠定基础。

借用网上的一张旧图来说明 Mesa 中的 IR 架构:

476cc6f6-880c-11ee-939d-92fbcf53809c.png

此次 Rust 实现的 NAK 编译后端大约研发了半年,长期计划是成为 NVK 的编译器。这并不意味着可以直接使用 Rust 来编写着色器程序,因为它只是一个编译后端。然而,这也算是朝 Rust 直接进行 GPU 编程更进了一步。

Rust 作为 GPU 着色器语言的前景

图形渲染机制简单来说是这样的:

图形库(比如 OpenGL)将渲染计算任务实时派发给 GPU,具体由一种用图形库提供的着色语言(GLSL或 WLSL等)或 SPIR-V(着色语言中间语言标准)编写的称为着色器(sharder)的小程序,在 GPU 上编译运行。从基本意义上来说,着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信。着色语言一般包含一些针对向量和矩阵操作的有用特性。

常见的着色语言有 :

DirectX 使用HLSL(High Level Shading Language)

Metal 使用MSL(Metal Shading Language)

OpenGL 使用GLSL(OpenGL Shading Language)

Vulkan 使用的着色器必须以 SPIR-V 这种二进制字节码的格式提供。

所以一般来说,在 Rust 生态中,需要使用 GPU 进行图形渲染则多半是需要直接使用 GLSL 这类着色语言。这就带来了极大的不便。幸好,Rust 生态有一些开源项目,正在致力于改变这一状况。

rust-gpu 项目

国外知名游戏工作室 EmbarkStudios 一直在维护一个 rust-gpu[2] 项目。它旨在为 Rust 编译器打造一个 spir-v 的编译后端。

SPIR-V 是一个为 Vulkan 和 OpenCL 设计的中间语言(IL)标准。它是一个低层次、与硬件无关的 IR,用于表达着色器和计算核心。SPIR-V 设计上更靠近硬件执行层次,它直接被 GPU 驱动所接受,并转换为特定硬件的机器代码。

正如前面 Mesa 的 IR 图所示,SPIR-V 通常作为着色器语言(如 GLSL)的编译输出,然后可以被转换为 NIR 进行进一步的优化和处理。这就意味着,如果 rust-gpu 成熟了,可以直接用 Rust 语言作为着色语言来编写着色器程序,这样就可以通过 SPIR-V 转换为 NIR ,进一步让 NAK 编译后端来处理了。

从这个角度来看,rust-gpu 这个项目对于 Rust GPU 图形编程渲染生态还是非常重要的。

wgpu

另外一个项目是 wgpu[3] ,它提供了一个安全、跨平台的图形和计算 API,基于 WebGPU 规范。WebGPU 是一种新的图形标准,旨在为现代图形硬件提供统一的低层次访问。它被设计为更安全、更高效,特别是在 Web 应用程序中。

wgpu 是基于 Rust 实现的,所以它利用 Rust 的安全特性来帮助避免常见的内存错误和并发问题,这在处理复杂的图形任务时尤其重要。wgpu 也充分利用了现代 GPU 的能力,提供高效的图形和计算性能。它支持最新的图形技术,如计算着色器和高效的资源管理。wgpu 提供了 Rust 风格的 API,相比于直接使用 Vulkan 或 Direct3D,它提供了更高级别的抽象,简化了图形编程的复杂性。

wgpu不仅可以在 Web 环境运行,还可以在 macOS / iOSAndroid、Window 和 Linux 等系统上原生运行。随着 WebGPU 标准的发展和成熟,wgpu 可能会成为 Web 和非 Web 应用程序中 GPU 编程的首选解决方案。wgpu 对于游戏开发、图形设计和可视化、科学计算和机器学习等领域非常适合。目前被用于 Firefox、Servo 和 Deno 中 WebGPU 整合的核心。

wgpu 实际上也提供了 C 语言绑定 (wgpu-native[4]),你可以写 C/C++ 或其他能与 C 互通的语言来使用它。

wgpu 还有另一个重要的优势,那就是可以利用各种强大的桌面端 GPU 调试工具。在开发大型 2D/3D 应用时,通过使用命令记录/回放、帧捕捉、Buffer 视图等功能,可以快速定位 GPU 层代码/数据的性能瓶颈和程序缺陷。相较于仅依靠浏览器提供的有限调试能力,这些工具能够事半功倍,帮助开发者更快地解决问题。

WebGPU 使用的着色语言是 WGSL,它的目标不是要与GLSL兼容,它是对现代着色器语言的重新设计。详情可以从WGSL 规范[5] 了解。wgpu 里使用的 WGSL 转译工具叫naga[6],性能相比于其他转译工具快十倍。如果你学过 Rust 语言,你会发现 WGSL 的语法和 Rust 语言十分相近。

当前 Rust UI 框架如何使用 GPU 渲染

当前 Rust 生态已经涌现出一些比较优秀的自带 GPU 渲染的 GUI 框架,比如 Makepad[7] 、slint[8]和 egui[9] ,甚至还有一些 Rust 实现的终端也利用 GPU 来加速渲染,比如 Wezterm[10] 和 rio[11]。

Makepad 实现了自己的着色 DSL 语言。因为 Makepad 想要实现的目标是让设计和代码分离,它专门设计了一套 Live System 来有效地对界面实时热更新而不需要重新编译 Rust 代码。着色语言 DSL 需要直接嵌入到这套 Live System 来使用。这套着色 DSL 语言底层绑定了多个 GPU 硬件平台的图形接口,并且对这些 GPU 硬件平台做了优先级支持。现在 Makepad 中 Tier 1 级别支持的是 Quest VR 头显,Tier 2级别支持的是 Qualcomm(骁龙,移动和 AI优势),Tier 3 支持的是 Intel 等。

Slint 通过 Rust 第三方库 femtovg(基于 grow 库,一个 GL 接口绑定库)来支持 GPU 渲染。为什么不考虑使用 wgpu 呢?原因之一是因为可能会失去在iOS/iPadOS/macOS上使用Safari运行演示的能力,因为它仅支持WebGL1;原因之二是因为 slint 在实现之初采用的渲染机制是通过一种遍历树来对 GL 命令进行遍历,类似于 Qt Quick 的机制。也许在未来会考虑迁移到 wgpu。

egui 目前通过 egui-wgpu 和 egui-grow 来支持 WebGPU 和 OpenGL 等多个后端,这方面还是比较成熟的。

Wezterm 和 rio 则是利用 WebGPU 来加速渲染的终端,使用了 wgpu。但是 Wezterm 也允许你通过 lua 脚本来配置使用 OpenGL 。

以上就是这些 Rust 生态中提供渲染机制的 UI 框架或终端使用 GPU 渲染的方式。基本上 wgpu 还是比较常用的。除非有自身的特殊需求,像 Makepad 那样,就需要自己实现着色语言了。当然,我们最希望的还是直接用 Rust 来编写着色语言,目前最接近这个目标的是使用 wgpu(WebGL)。

大模型与 Rust GPU 编程

除了图形处理之外,深度学习和大模型训练领域也是非常依赖于 GPU 的。如果 Rust 能够方便地支持 GPU 编程,那对于 Rust 在人工智能领域的应用也将打开一片天地。

目前深度学习使用 GPU 主要是用 CUDA(Compute Unified Device Architecture)来利用 NVIDIA GPU 进行高性能并行计算。因为深度学习依赖于大量的矩阵和向量运算,这些运算可以在 GPU 上高效地并行处理。在训练大型神经网络模型时,CUDA 可以显著加速计算过程。它通过优化数据传输和执行大量的并行数学运算来减少模型训练所需的时间。CUDA 被广泛支持于各种深度学习框架,如 TensorFlow、PyTorch 和 MXNet。这些框架利用 CUDA 加速后端来提高训练和推理的性能。

在机器学习中,传统着色器语言(如 GLSL 或 HLSL)通常不直接用于模型训练。这些语言主要设计用于图形渲染,而非通用计算。但是在计算机视觉方面可能会有一些应用。

Rust 语言生态中有一些 CUDA 绑定库,比如 Rust-CUDA[12] ,该库提供了rustc_codegen_nvvm 这样一个 rustc 后端,针对 NVVM IR(LLVM IR 的一个子集)进行编译。它生成可以由 CUDA 驱动 API 加载并在 GPU 上执行的高度优化的 PTX 代码。然而,该库已经停止维护超过一年了。

今年大模型 ChatGPT 火了之后,Rust 生态出现了一个完全用 Rust 实现的深度学习框架 burn[13],创建这个新框架的动机是为了构建一个适应各种用户的多功能框架,包括研究人员、机器学习工程师和低级软件工程师。

Burn 现在支持 wgpu 和 torch-gpu,来进行深度学习的 GPU 并行计算。利用 wgpu 计算着色器来高效处理不同类型的 GPU 的操作,而不像 CUDA 只适用于 Nvidia 的 GPU。但 Burn 并不完全依赖于 wgpu,依然计划在某个时候添加一个仅支持 CUDA 的后端,以在 Nvidia GPU上实现绝对的性能。当前 wgpu 的性能相比 CUDA 还是差一些。Wgpu 无法直接利用供应商特定的功能,如张量计算核心(Tensor Cores)。

另一个机器学习框架是由 Hugging Face 推出的 极简机器学习框架 candle[14] ,它是一个专注于性能(包括GPU支持)和易用性的 Rust 最小化机器学习框架。Candle 旨在支持无服务器推理(Serverless),这是一种在不需要管理任何基础设施的情况下运行机器学习(ML)模型的方式。

candle-core 中通过 cudarc[15] 第三方库来支持 CUDA ,该库是对 CUDA API 的安全 Rust 绑定,看起来是最近才发布的新库。candle 当前不支持 wgpu,但是看起来 wgpu 的支持正在讨论中,见 #344[16]。该 issue 中有人评论到:“通过对不同的 GPGPU 性能和使用 GLSL 的Vulkan 进行了一些初步测试,发现在相同的优化技巧下,Vulkan 的性能可以与 CUDA 相媲美,而使用 WGSL 的 WGPU 很早就达到了瓶颈。此外,WebGPU 也支持 GLSL,所以我们不仅可以有一个 WebGPU 后端,还可以有一个 Vulkan 后端”。

后记

通过以上对 Rust 生态中 GPU 编程的现状的探索,我认为 rust-gpu 中实现的 SPIR-V 编译后端对于 Rust 占据 GPU 编程生态位一席是非常重要的。另外一个安全且稳定维护的 CUDA Rust 库也是非常重要的。希望借助EmbarkStudios 和 HuggingFace 两家商业公司的力量,来打通 Rust 和 GPU 。

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4426

    浏览量

    126751
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48638
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6388
  • ChatGPT
    +关注

    关注

    27

    文章

    1413

    浏览量

    4801
  • 大模型
    +关注

    关注

    2

    文章

    1555

    浏览量

    1148

原文标题:Rust 与 GPU 编程的现状与前景探究

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Rust的多线程编程概念和使用方法

    Rust是一种强类型、高性能的系统编程语言,其官方文档中强调了Rust的标准库具有良好的并发编程支持。Thread是Rust中的一种并发
    的头像 发表于 09-20 11:15 512次阅读

    RISC-V服务器方面的应用与发展前景如何?刚毕业的学生才开始学来的及吗?

    RISC-V服务器方面的应用与发展前景十分广阔。作为一种开源、开放、简洁、灵活的指令集,RISC-V近年来芯片产业中发展迅速,并逐渐引领新一轮处理器芯片技术与产业的变革浪潮。
    发表于 04-28 08:49

    RISC-V服务器方面应用与发展前景

    RISC-V服务器方面的应用与发展前景十分广阔。作为一种开源、开放、简洁、灵活的指令集,RISC-V近年来芯片产业中发展迅速,并逐渐引领新一轮处理器芯片技术与产业的变革浪潮。
    发表于 04-28 09:04

    fpga医疗方面有什么应用前景

    最近在学fpga不知道以后能干什么,请教一下,医疗方面有什么应用前景,如果想在这方面入手的话需要哪方面的资料呢,谢谢
    发表于 07-11 08:41

    GPU

    GPU已经不再局限于3D图形处理了,GPU通用计算技术发展已经引起业界不少的关注,事实也证明浮点运算、并行计算等部分计算方面GPU可以
    发表于 01-16 08:59

    RFID技术及其温度传感器方面的应用有哪些

    摘要:基于历史发展现状简要介绍RFID技术概念、组成、主要特点及技术局限,同时通过总结搜索的国内外相关资料论述了RFID技术温度传感器方面的应用(包括学术研究和商业化)、目前的种类和
    发表于 08-25 07:28

    CLAA物联网生态圈和LoRa行业现状分析

      CLAA物联网生态圈  MSP多业务统一平台架构解析  LoRa行业现状
    发表于 12-28 06:17

    怎样去使用Rust进行嵌入式编程

    使用Rust进行嵌入式编程Use Rust for embedded development篇首语:Rust的高性能、可靠性和生产力使其适合于嵌入式系统。在过去的几年里,
    发表于 12-22 07:20

    RUST嵌入式开发中的应用是什么

    Rust是一种编程语言,它使用户能够构建可靠、高效的软件,尤其是用于嵌入式开发的软件。它的特点是:高性能:Rust具有惊人的速度和高内存利用率。可靠性:在编译过程中可以消除内存错误。生产效率:优秀
    发表于 12-24 08:34

    Rust代码中加载静态库时,出现错误 ` rust-lld: error: undefined symbol: malloc `怎么解决?

    “ [i]malloc ”、“ [i]exit ”。我验证了使用 ` [i]nm ` 命令。 问题是我打算使用 ffi rust 中使用这个静态库。当我尝试我的 Rust 代码
    发表于 06-09 08:44

    智慧停车的现状前景怎么样

    智慧停车的现状前景怎么样
    发表于 08-07 10:47 4210次阅读

    Rust GUI 库发展现状

    一下几点: Rust 生态中一系列可用的 GUI 框架; kas 框架的发展现状 各个 GUI 框架对于创建窗口、GPU 加速、复杂文本输入、i18n 等功能的支持
    的头像 发表于 12-21 15:00 2175次阅读

    新型 GPU 云桌面的准确定义

        本文来自“ 新型GPU云桌面发展白皮书(2023) ”,“ GPU原理及在云桌面中的应用 ”。给出了新型 GPU 云桌面的准确定义,深入分析了其相较传统云桌
    的头像 发表于 06-29 09:57 1826次阅读
    新型 <b class='flag-5'>GPU</b> 云桌<b class='flag-5'>面的</b>准确定义

    基于Rust开发的编程语言

    Move 是一门由 Rust 语言开发的一门面向资产的编程语言,最早由 Facebook (现 Meta )投入大量的人力物力开发,用于 Libra (现 Dime )项目,处理全球性大规模支付系统的编程语言。
    的头像 发表于 11-17 12:30 356次阅读

    从Rustup出发看Rust编译生态

    从Rustup出发看Rust编译生态 1. Rust和LLVM的关系是怎样的? 2. Rustup中targets是什么,为什么可以安装多个? 3. Rust在windows上为
    的头像 发表于 01-02 11:00 240次阅读