5月11日、NVIDIA Labsが「The cuda-oxide Book」と題したドキュメントを公開した。Rustで記述したコードを直接CUDAカーネルにコンパイルできる実験的コンパイラ「cuda-oxide」について詳しく紹介されている。
なぜ今、RustでGPU開発なのか
GPUプログラミングは長らくC++やCUDAの専門知識を要する分野だった。一方で、Rustはその安全性とパフォーマンスでシステムプログラミング界を席巻し、WebAssemblyやブロックチェーン、さらにはLinux カーネル開発にまで進出している。
しかし、これまでRustでGPUを活用するにはcandle-transformers(Hugging FaceのRust ML フレームワーク)、wgpu(WebGPU Rustライブラリ)、RustaCUDAといったライブラリを使うか、C++とのFFI(Foreign Function Interface)に頼るしかなかった。
cuda-oxideは、この状況を根本から変える可能性を秘めている。NVIDIA公式が開発したRust-to-CUDAコンパイラとして、従来必要だったC++やDSL(ドメイン固有言語)を排除し、標準的なRustコードを直接PTX(Parallel Thread Execution)コードにコンパイルできるのだ。
技術的ブレイクスルー:ピュアRustでのGPUカーネル
最も革新的な点は、cuda-oxideが単なる言語バインディングではなく、Rustcのカスタムコードジェンバックエンドとして実装されていることだ。これにより、RustのGPUプログラミングが完全に「ピュアRust」で実現される。
実際のコード例を見てみよう:
use cuda_device::{cuda_module, kernel, thread, DisjointSlice};
use cuda_core::{CudaContext, DeviceBuffer, LaunchConfig};
#[cuda_module]
mod kernels {
use super::*;
#[kernel]
fn vecadd(a: &[f32], b: &[f32], mut c: DisjointSlice<f32>) {
let idx = thread::index_1d();
let i = idx.get();
if let Some(c_elem) = c.get_mut(idx) {
*c_elem = a[i] + b[i];
}
}
}
fn main() {
let ctx = CudaContext::new(0).unwrap();
let stream = ctx.default_stream();
let module = kernels::load(&ctx).unwrap();
let a = DeviceBuffer::from_host(&stream, &[1.0f32; 1024]).unwrap();
let b = DeviceBuffer::from_host(&stream, &[2.0f32; 1024]).unwrap();
let mut c = DeviceBuffer::<f32>::zeroed(&stream, 1024).unwrap();
module
.vecadd(&stream, LaunchConfig::for_num_elems(1024), &a, &b, &mut c)
.unwrap();
let result = c.to_host_vec(&stream).unwrap();
assert_eq!(result[0], 3.0);
}
このベクトル加算カーネルはcargo oxide run vecaddで実行できる。#[cuda_module]属性により、生成されたデバイス向けアーティファクトがホストバイナリに埋め込まれ、型安全な起動メソッドが自動生成される仕組みだ。
3つの技術的特徴
cuda-oxideの特徴は以下の通りだ:
🦀 GPU上でのRust: Rustの型システムとOwnershipモデルでGPUカーネルを記述できる。メモリ安全性をGPUプログラミングにもたらす試みだ。
💎 SIMTコンパイラ: DSLではなく、ピュアRustをPTX(Parallel Thread Execution)にコンパイルするカスタムrustcバックエンドとして実装されている。
⚡ 非同期実行: GPU作業を遅延評価されるDeviceOperationグラフとして構成し、ストリームプール全体でのスケジューリングや.awaitでの結果待機が可能だ。これはRust の async/await エコシステムとの親和性を示している。
現状と今後の展望
現在のv0.1.0はアルファ版であり、バグや不完全な機能、API変更が予想される。NVIDIA Labsはユーザーからのフィードバックを積極的に募集している状況だ。この動きは、OpenAIやMicrosoftなどが機械学習インフラでRustを採用し始めている潮流とも合致している。
プロジェクトのGitHubリポジトリでは、より詳細な実装状況や今後のロードマップが確認できる。また、CUDA Toolkitとの互換性や、Rust Embedded Working Groupのような既存のRustエコシステムとの連携も注目される。RustとCUDAの両方のエコシステムにとって、大きな転換点となる可能性を秘めたプロジェクトと言えるだろう。
詳細はThe cuda-oxide Bookを参照していただきたい。