用 Facet 给 WebGPU 数据布局上单元测试
来源:mattkeeter.com — 77 分 · by luu
📋 概述
在写 GPU compute shader 时,经常需要在主机和着色器之间共享一小段配置数据。作者给出了一个来自 fidget-wgpu 的示例:WGSL 里定义 mat3x3f、vec2u、f32 组成的 Config,Rust 侧用 zerocopy 派生并标 repr(C),靠 as_bytes() 直接写进 WebGPU buffer,看起来很方便,但 Rust 与 WebGPU 的内存布局规则常有微妙差异,这个例子其实是错的。更要命的是他在写字节码虚拟机,失败模式常常是 GPU 线程永久自旋、只能重启电脑。在又一次重启后,他决定系统性地解决:不引入 wgsl_to_wgpu、wgsl_bindgen、encase 等外部依赖,而是用已经在依赖树里的 naga 解析 WGSL 结构布局,然后写单元测试来比对两侧布局。
🔑 核心要点
- 问题场景是主机与着色器之间共享配置数据的内存布局。
- Rust 的 repr(C) 与 WebGPU 的布局规则常有微妙差异,示例代码其实是错的。
- 作者在写字节码虚拟机,失败模式是GPU 线程永久自旋、只能重启电脑。
- 他选择不用现成工具,而是用已在依赖树里的 naga 解析 WGSL 结构布局。
- 解法是把布局比对写成单元测试,不给常规构建增加开销。
💡 金句
更不幸的是,我在写的字节码虚拟机跑在 compute shader 里,它们的失败模式往往是:恭喜,你的 GPU 现在有永久自旋的线程,只能靠重启电脑来杀掉。
👍 0
👎 0
← 返回 Hacker News 首页