文章摘要
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 目标来简化这一过程。主要项目包括:
- Rust GPU:将 Rust 代码编译为 SPIR-V,适用于 Vulkan 和其他现代 GPU API。
- Rust CUDA:将 Rust 代码编译为 NVVM IR,支持在 NVIDIA GPU 上通过 CUDA 运行。
- 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 仓库。
评论总结
评论内容总结:
支持现有代码的无修改运行
- 观点:现有的
no_std和no 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."
- 观点:现有的
对抽象层的质疑
- 观点:虽然技术令人印象深刻,但抽象层可能掩盖 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."
条件编译的支持
- 观点:条件编译的引入有助于应对平台差异,但理想的解决方案应由硬件厂商提供统一的系统。
- 引用:
- "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."
多后端编译的可能性
- 观点:目标是通过多后端编译实现通用代码的跨平台运行,尽管当前演示未展示此功能。
- 引用:
- "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."
其他语言的类似功能
- 观点: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."
总结:评论者对现有代码的无修改运行表示赞赏,但对抽象层的潜在问题持保留态度。条件编译和多后端编译被认为是应对平台差异的有效手段,而其他语言的类似功能也值得关注。