Hacker News 中文摘要

RSS订阅

Rust 应用于所有 GPU -- Rust on Every GPU

文章摘要

Rust语言现已支持在所有主流GPU平台上运行,包括CUDA、SPIR-V、Metal、DirectX 12、WebGPU以及CPU回退方案。通过单一Rust代码库,开发者无需使用特定GPU语言如WGSL、GLSL等,即可实现跨平台计算逻辑。该项目已在GitHub上开源,展示了Rust在GPU编程中的通用性和便捷性。

文章总结

标题:Rust 在所有 GPU 上运行

主要内容:

作者展示了一个使用单一 Rust 代码库在各大 GPU 平台上运行的演示项目。该代码库支持以下平台:

  • CUDA:用于 NVIDIA GPU
  • SPIR-V:用于支持 Vulkan 的 GPU(如 AMD、Intel、NVIDIA 和 Android 设备)
  • Metal:用于苹果设备
  • DirectX 12:用于 Windows
  • WebGPU:用于浏览器
  • CPU:作为非 GPU 系统的备用方案

所有平台的计算逻辑均使用标准的 Rust 编写,无需使用着色器或内核语言。代码已开源在 GitHub 上。

背景:

传统上,GPU 编程使用专门的着色器语言(如 WGSL、GLSL、MSL、HLSL 等),这些语言与主机应用程序的语言和工具链分离,增加了复杂性。Rust 社区则尝试通过将标准 Rust 代码直接编译到 GPU 目标来简化这一过程。主要项目包括:

  1. Rust GPU:将 Rust 代码编译为 SPIR-V,适用于 Vulkan 和其他现代 GPU API。
  2. Rust CUDA:将 Rust 代码编译为 NVVM IR,支持在 NVIDIA GPU 上通过 CUDA 运行。
  3. Naga:由 wgpu 团队开发的 GPU 语言翻译层,支持 WGSL、SPIR-V、GLSL、MSL 和 HLSL 之间的转换。

这些项目最初由不同团队独立开发,作者作为 Rust GPU 和 Rust CUDA 的维护者,致力于将它们整合在一起。此次演示首次实现了所有主要 GPU 后端从单一 Rust 代码库运行,标志着 Rust 跨平台 GPU 计算的可行性。

工作原理:

演示项目实现了一个简单的双调排序算法,计算逻辑在所有目标平台上共享,CPU 和 GPU 运行相同的代码。项目通过 Rust 的特性标志和编译目标选择不同的后端和驱动 API。例如:

  • cargo build --features wgpu 使用 wgpu,选择系统默认的驱动 API。
  • cargo build --features cuda 启用 NVIDIA 的 CUDA 后端。

内核在构建时编译为适当的设备格式,并嵌入到二进制文件中。虽然演示项目不支持运行时加载,但底层工具和生态系统支持多内核和多入口点。

技术细节:

项目充分利用了 Rust 的特性,如 no_std 支持、条件编译、新类型、枚举、泛型等,确保代码在 GPU 上高效运行。例如:

  • no_std 支持:GPU 代码使用 #![no_std],因为标准库在 GPU 上不可用。
  • 条件编译:通过 #[cfg] 实现平台特定的代码路径。
  • 新类型:使用新类型(如 ThreadId)在编译时防止逻辑错误。
  • 枚举:用枚举替代魔数,确保类型安全。

未来展望:

尽管 Rust 在 GPU 编程上取得了重要进展,但开发者体验仍有改进空间。例如,编译器后端尚未集成到 rustc 中,调试编译过程也较为复杂。未来目标是进一步优化性能,统一 API,并更好地集成到 Rust 生态系统中。

参与方式:

欢迎加入 Rust GPU 和 Rust CUDA 社区,共同推动 Rust 在 GPU 编程领域的发展。更多信息可访问 Rust GPU GitHub 仓库Rust CUDA GitHub 仓库

评论总结

评论内容总结:

  1. 支持现有代码的无修改运行

    • 观点:现有的 no_stdno alloc 代码可以直接在 GPU 上运行,这为许多创新想法提供了可能性。
    • 引用:
      • "Existing no_std + no alloc crates written for other purposes can generally run on the GPU without modification."
      • "Wow. That at first glance seems to unlock ALOT of interesting ideas."
  2. 对抽象层的质疑

    • 观点:虽然技术令人印象深刻,但抽象层可能掩盖 GPU 的低级细节,导致性能损失和错误,尤其是在不同硬件平台上。
    • 引用:
      • "I generally distrust any abstractions over the GPU api, as the entire point is to leverage the low level details of the gpu."
      • "Treating those details as a nuisance leads to bugs and performance loss, because each target is meaningfully different."
  3. 条件编译的支持

    • 观点:条件编译的引入有助于应对平台差异,但理想的解决方案应由硬件厂商提供统一的系统。
    • 引用:
      • "Its good that this approach at least allows conditional compilation, that helps for sure."
      • "To overcome this, a similar system should be brought forward by the vendors."
  4. 多后端编译的可能性

    • 观点:目标是通过多后端编译实现通用代码的跨平台运行,尽管当前演示未展示此功能。
    • 引用:
      • "Though this demo doesn't do so, multiple backends could be compiled into a single binary and platform-specific code paths could then be selected at runtime."
      • "That’s kind of the goal, I’d assume: writing generic code and having it run on anything."
  5. 其他语言的类似功能

    • 观点:Zig 等语言也支持编译到 SPIR-V,但具体实现和效果尚不明确。
    • 引用:
      • "Zig can also compile to SPIR-V. Not sure about the others."
      • "And I haven't tried the SPIR-V compilation yet, just came across it yesterday."

总结:评论者对现有代码的无修改运行表示赞赏,但对抽象层的潜在问题持保留态度。条件编译和多后端编译被认为是应对平台差异的有效手段,而其他语言的类似功能也值得关注。