主要观点:构建了一个可在各主要 GPU 平台运行的共享 Rust 代码库的演示,展示了在 Rust 中实现跨平台 GPU 计算的可能性,虽仍有不足但为 GPU 编程带来新方向。
关键信息:
- 支持 CUDA(NVIDIA)、SPIR-V(AMD、Intel、NVIDIA、Android 设备)、Metal(Apple)、DirectX 12(Windows)、WebGPU(浏览器)、CPU 回退等多种 GPU 平台。
- 相同计算逻辑用常规 Rust 编写,无需 shader 或内核语言,代码在GitHub上。
- 背景中提到以往 GPU 编程多使用特定语言,如今 Rust 社区有不同项目尝试直接将标准 Rust 代码编译到 GPU 目标,作者致力于将这些项目整合。
- 演示实现了简单的 bitonic 排序,通过后端选择、内核编译等方式在不同平台运行,背后有诸多技术协同工作。
- 项目注重展示 Rust 在 GPU 编程中的优势,如
no_std
支持、条件编译、新类型、枚举、特质、内联、结构体组合、内存布局控制、模式匹配、泛型、派生宏、模块系统等。 - 存在一些粗糙之处,如编译器后端未集成、依赖 NVIDIA 工具链、调试困难、API 不一致等。
重要细节: - 后端选择通过 Rust 特性标志和编译目标组合实现,如
cargo build --features wgpu
选择wgpu
等。 - 内核编译时根据 Rust 特性、目标 OS 和驱动 API 编译为相应设备格式并嵌入二进制。
no_std
支持使 GPU 代码可在缺乏操作系统服务的环境中运行,现有no_std
crate 可直接在 GPU 上运行。- 条件编译利用 Rust 特性保持平台代码整洁,编译器能理解所有代码路径。
- 新类型用于在编译时防止逻辑错误,
#[repr(transparent)]
保证零运行时成本。 - 枚举用于替换魔法数字,提供类型安全配置,但在 CPU 和 GPU 间传递时需注意布局。
- 特质实现通用 GPU 算法,零成本抽象,代码可复用且维护性好。
#[inline]
确保抽象在编译时消失,适合 GPU 环境。- 结构体组合提供更清晰的编程方式,防止参数爆炸。
- 内存布局控制通过
#[repr(C)]
保证 GPU 数据传输的布局要求。 - 模式匹配提供明确的代码路径,有助于生成高效代码。
- 泛型可复用逻辑, trait 边界明确说明 GPU 所需操作,错误消息指向代码。
- 派生宏自动实现 trait,减少手动编写 boilerplate 代码。
- 工作空间和依赖用于组织大型 GPU 项目代码。
- 格式化、lint、文档生成等与常规 Rust 相同。
- 构建脚本通过
rustc_codegen_*
编译和嵌入 GPU 内核。 - 单元测试可在 CPU 上测试 GPU 内核代码,利用标准调试工具等提高开发效率。
- 存在编译器后端未集成、依赖 NVIDIA 工具链、调试困难、API 不一致等问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。