概要
cuda-oxide は、Rustコードを直接CUDAのPTXにコンパイルする実験的なコンパイラ。 Rust の所有権やトレイト、ジェネリクスの知識が前提。 DSLやバインディング不要 で、純粋なRustでGPUカーネルを記述可能。 v0.1.0はアルファ版 であり、バグやAPI変更の可能性あり。 Rustの型安全性 とGPUプログラミングの統合が特徴。
cuda-oxide 概要
- cuda-oxide は、RustからCUDA用GPUカーネルを記述・コンパイルするための 実験的コンパイラ
- 標準的なRustコード を直接PTXに変換、 DSLや外部言語バインディング不要
- SIMT(Single Instruction, Multiple Threads) に最適化された設計
- Rustの型システム・所有権モデル をGPUカーネルにも適用
- 安全性 を重視しつつも、GPU特有の注意点あり(詳細はSafety Model参照)
前提知識
- Rustプログラミング言語 の理解(所有権、トレイト、ジェネリクス)
- 非同期プログラミング (async/.await、tokio等)の基礎知識
- 参考資料 :The Rust Programming Language、Rust by Example、Async Book
プロジェクトの現状
- v0.1.0リリース は初期アルファ版
- バグ、未実装機能、API変更の可能性
- ユーザーからのフィードバックを歓迎
クイックスタート
- 必要なクレートのインポート
- cuda_device::{cuda_module, kernel, thread, DisjointSlice}
- cuda_core::{CudaContext, DeviceBuffer, LaunchConfig}
- カーネル定義例 (vecaddカーネル)
- #[cuda_module]でモジュール宣言
- #[kernel]でカーネル関数定義
- thread::index_1d()でスレッドインデックス取得
- DisjointSliceで出力配列の安全な参照取得
- ホスト側の実行例
- CudaContextでデバイス初期化
- DeviceBufferでデータ転送
- kernels::loadでカーネルロード
- module.vecaddでカーネル実行
- 結果をto_host_vecで取得・検証
- ビルド&実行
- cargo oxide run vecaddでビルド・実行
- #[cuda_module]の役割
- デバイス用バイナリをホストバイナリに埋め込み
- kernels::load関数と各カーネルのlaunchメソッドを自動生成
- 低レベルAPI(load_kernel_moduleやcuda_launch!)も利用可能
cuda-oxideの特徴
- Rust on the GPU
- Rustの型安全性・所有権モデルによる 安全なGPUカーネル記述
- 安全性モデルの詳細はドキュメント参照
- A SIMT Compiler, Not a DSL
- DSLではなく、rustcのカスタムコード生成バックエンド で純粋なRustをPTXへ
- Async Execution
- GPUワークを 遅延DeviceOperationグラフ として構築
- ストリームプールでスケジューリング
- .awaitで非同期実行結果を待機
まとめ
- cuda-oxide は、Rustエコシステムにおける GPUプログラミングの新たな選択肢
- 純粋なRustコード で安全かつ効率的なGPUカーネル開発を実現
- 今後の発展とフィードバック に期待