
2026/05/12 0:55
CUDA Oxide:Nvidia が公式にリリースした、Rust から CUDA コードへ変換するためのコンパイラ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
本テキストは、DSL や外部のバインドを必要とせず、安全で慣習的な GPU カーネル開発を可能にする実験的な Rust 向け CUDA コンパイラである cuda-oxide を紹介しています。現在ベータ(アルファ)段階のバージョン 0.1.0 であり、カーネルの定義やデバイスバッファの管理といったコア機能を提供していますが、初期リリースに典型的な不具合や API の不安定性を含みます。
このツールは、カスタムの
rustc コードジェネレーションバックエンドを使用して、Rust の高度な機能(traits、generics、メモリ所有権など)を活用し、純粋な Rust を PTX に直接変換します。これにより、開発者は RUST の一般的なパターンを用いてカーネルを定義し、データを管理することができます。コンテンツは async ランタイム、カスタムのランチャコード、Rust の所有権/traits など複雑な概念の知識を前提としているものの、主な価値は Rust エコシステム内での GPU 計算への参入障壁を下げることにあります。
主要な使用例では、
cuda_device と cuda_core クレイトを使用して、カーネル(例:DisjointSlice<f32> と LaunchConfig::for_num_elems(1024) を用いた vecadd カーネル)を定義し、デバイスバッファ(DeviceBuffer、CudaContext)を管理します。クイックスタート例では、cargo oxide run vecadd でコードをビルドおよび実行する方法が示されています。#[cuda_module] 属性は、生成されたデバイスアーティファクトをホストバイナリに埋め込み、カーネルごとに型付きロード関数を生成します。一方、load_kernel_module や cuda_launch! などの低レベル API は、特定のサイドカーアティファクトをロードする際や、カスタムのランチャコードを使用する場合にも利用可能です。現在進行形のプロジェクトとして、作成者はコミュニティのフィードバックを積極的に求めており、API の改善と将来のロードマップの形成に取り組んでいます。利点には、Rust の型システムを用いて GPU カーネルを書き込めること、カスタムコードジェネレーションバックエンドを通じて純粋な Rust を PTX にコンパイルできること、そしてレイジーな DeviceOperation グラフによるワークの構成が含まれます。本文
cuda-oxide は、安全で慣用的な Rust で (SIMT) GPU カーネルを記述可能にする実験的な Rust から CUDA へのコンパイラーです。標準的な Rust コードをそのまま PTX にコンパイルし、DSL や異言語とのバインディングは不要です。
※ この書籍では、所有権、型トレイト、ジェネリクスなどを含んだ Rust プログラミング言語についての既知性を前提としています。また、後続の非同期 GPU 処理に関する章では、
async/.await や Tokio などといったランタイムの基本的な知識も想定しています。復習が必要であれば、「The Rust Programming Language」(https://doc.rust-lang.org/)、「Rust by Example」(https://rustbyexample.com/)、または「the Async Book」(https://rust-lang.github.io/async-book/) をご参照ください。
プロジェクトのステータス
v0.1.0 リリースは早期段階のアルファ版であり、バグ、機能不足、API の破壊的変更が含まれる可能性がございます。私たちはさらなる改良に向けて取り組んでおり、皆様にご使用いただき、ご体験に基づいたフィードバックを賜り、本プロジェクトの方向性を共に形作っていただけることを心より願っております。
🚀 クイックスタート
予備要件をインストール後、
cargo oxide run vecadd でビルドおよび実行します。
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); }
※
#[cuda_module] アトリビュートは、生成されたデバイス用アーティファクトをホスト_BINARY に埋め込み、型安全な kernels::load 関数とともに、各カーネルに 1 つずつ起動メソッドを生成します。特定のサイドカー用アーティファクトをロードしたり、カスタム起動コードを構築したりする必要がある場合、より低階層の load_kernel_module および cuda_launch! API も引き続き使用可能です。
なぜ cuda-oxide のか?
🦀 GPU 上での Rust
Rust の型システムと所有権モデルを活用し、GPU カーネルを記述します。安全性は重要な目標ですが、GPU には細かな注意点もございますので、安全性モデル についてご参照ください。
💎 SIMT コンパイラー
これは DSL ではなく、純粋な Rust を PTX にコンパイルするカスタム rustc コード生成バックエンドです。
⚡ 非同期実行
GPU 処理を遅延された
DeviceOperation グラフとして組み合わせ、ストリームプール間でのスケジューリングを行います。.await を使用して結果を受け取ります。