CUDA Rust 将 GPU 内核开发拆成两种不同契约
NVIDIA 发布的 CUDA Rust 同时覆盖 SIMT 编程与基于 Tile 的稳定版 Rust 编程。关键变化并不是把 CUDA 语法换成 Rust,而是把内存安全、启动配置和硬件控制分别放进两种不同的抽象中。
THE BRIEF
博客要点
据 NVIDIA Technical Blog,cuda-oxide 通过 Rust MIR、Pliron 与 LLVM 将指定 Rust 内核编译为 PTX;cutile-rs 则捕获 Rust 内核结构,并通过 CUDA Tile IR 在首次使用时 JIT 编译。文中的向量加法示例均处理 1,024 个 f32 元素,并在文章所列环境中输出正确结果。cuda-oxide 需要 Linux、计算能力 8.0 或更高的 GPU、CUDA 12.x 或更高版本、clang/libclang 以及固定版本的 nightly Rust。cutile-rs 需要 Linux、计算能力 8.0 或更高的 GPU、CUDA 13.3 和 stable Rust 1.89 或更高版本。NVIDIA 将两者都描述为早期项目,并称 cutile-rs 已发布到 crates.io、被 HuggingFace Grout 与 mistral.rs 使用,而 cuda-oxide 仍处于 early alpha。
来源公告日期 ·
真正的工程选择不是 Rust 对 C++,而是开发者可以在哪一层表达并行性。cuda-oxide 延续 SIMT:程序员直接思考线程索引、线程块和访问地址。cutile-rs 则以张量 Tile 为基本单位,源码描述一个 Tile 上的计算,再由编译器决定如何映射到真实线程。前者暴露更多调度与局部性控制,后者隐藏更多硬件细节,但要求算法适合其抽象。
cuda-oxide 的安全性集中在类型和启动边界。DisjointSlice 将一个输出缓冲区拆成线程可独占访问的片段,避免把同一个可变借用交给多个线程。launch contract 记录维度与线程块假设,prepare 阶段再检查启动参数和设备限制。这能减少主机侧错误,但不会自动证明索引逻辑、同步、数值稳定性或所有设备操作正确。
cutile-rs 把所有权放在张量分区处。对可变输出进行 partition 后,每个逻辑 Tile 获得独占子张量;分区同时决定网格规模并提供 Tile 宽度特化。这样形状、所有权和启动几何不会分别维护。代价是控制权减少:开发者不能像低层 SIMT 那样自由安排每个线程,也不能同等程度地手工管理共享内存。规则的张量算子适合这种约束,非规则算法可能因此受限。
两条路径的编译边界也不同。cuda-oxide 依赖自定义 rustc 后端、LLVM 相关环境和固定 nightly,因此构建复现需要锁定 Rust、后端、CUDA 以及目标架构。cutile-rs 使用 stable Rust 且不要求自备 LLVM,但首次调用会发生 JIT 编译。对于频繁重启、动态 Tile 尺寸较多或会产生大量特化版本的推理服务,冷启动、缓存命中和编译并发必须单独测量。
安全抽象不等于性能保证。向量加法主要受内存流量与启动开销影响,只能证明工具链能运行,不能代表复杂 AI 内核的竞争力。Tile 可能为规则形状选择较好的线程映射,却不给不规则布局足够的逃生口;SIMT 能支持归约、流水线和共享内存优化,但也让开发者承担分支发散、bank conflict、寄存器压力和同步错误等风险。应按工作负载选择前端,而不是按语言偏好选择。
文章提到 Rust、CUDA C++ 和 CUDA Python 之间的互操作计划,应理解为方向而非已经验证的生产承诺。真实推理系统通常混用多种内核语言,未来互操作若要可靠,必须明确 ABI、缓冲区所有权、stream 语义、错误传播、调试和工具支持。在这些接口成熟前,Rust 内核应隔离在明确的缓冲区与 stream 契约后面,避免实验性前端渗透到整个服务架构。
可复现实验应同时比较正确性、启动行为和稳定运行性能。固定 GPU、驱动、CUDA、编译器版本、数据布局、数据类型和 stream 策略;把首次后端构建或 JIT 编译与热态执行分开计时。覆盖规则的逐元素算子、归约、不规则索引和一个真实推理子内核,并记录内核时间、端到端延迟、同步成本、内存吞吐、占用率、寄存器与共享内存使用。报告多次运行的分布和失败配置,最终回答 Tile 抽象在哪些场景值得付出,以及哪些场景必须保留 SIMT 控制。
实践清单
- 固定 GPU 型号、驱动、CUDA、Rust 工具链、仓库提交版本和编译特性。
- 测试非整除 Tile 尺寸、空输入、大张量、别名尝试和数值误差边界。
- 分别记录首次 JIT 或后端构建时间、热态内核时间和完整请求延迟。
- 确保比较使用相同布局、数据类型、stream、同步点以及数据传输策略。
- 覆盖逐元素算子、归约、不规则访存和一个代表性推理内核。
- 用分析器采集内核耗时、内存流量、占用率、寄存器、共享内存和启动次数。
- 主动改变契约、形状和启动配置,检查编译期诊断与运行时错误。
- 通过窄接口封装实验性内核,以便替换为 C++、Python 或其他 Rust 实现。
参考来源
- NVIDIA Technical Blog ↗2026-09-08
Token4AI 独立技术分析。文中厂商能力与本站模型可用性分别核验;实际接入范围与价格请以控制台为准。