
2026/06/17 5:17
秀 HN: cuTile Rust:Rust による安全でデータ競合のない GPU カーネル
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
サマリー:
cuTile Rust は、所有性則をローンチ境界まで拡張したメモリセーフでデータ競合の発生しないシステムを提供し、高性能 GPU プログラミングを革新します。このアプローチにより、開発者は現代の NVIDIA GPU(compute capability sm_80 以上)において速度や安全性を損なうことなく、イディオマティックな Rust コードを書けるようになります。CUDA Tile IR とジャスト・イン・タイム(JIT)コンパイルを活用することで、システムは NVIDIA B200 のようなハードウェア向けのタイルベースのカーネルを最適化し、要素ごとの操作においてピークメモリ帯域幅の約 91% を達成し、稠密な GEMM ベンチマーク(f16)では 2.07 PFlop/s に到達します。同期ローンをチャージする実行モデル、非同期パイプライン、CUDA グラフのリプレイなど多様な実行モデルをサポートしており、Grout Qwen3 のような堅牢な推論エンジンの構築に適しています。実用的なアプリケーションにおいては、RTX 5090 で Qwen3-4B を使用して 171 tokens/s、B200 で 82 tokens/s のパフォーマンスを達成します。Rust 1.89+、CUDA 13.3(FP4 パッキングを含む完全機能サポートのため)、Linux など特定の環境が必要とされますが、プロジェクトは明確な設定手法、包括的な Nix flake セットアップ、オープンソースの Apache 2.0 ライセンスによってアクセシビリティを保証しています。究極的には、cuTile Rust は安全で高レベルなコードが低レベルのパフォーマンスに匹敵することを証明し、厳格な安全性保証(持続的ベンチマークングと標準テストスイート「cargo test」による検証)を維持しながら効率的な GPU アプリケーションの構築を可能にするチームへの恩恵をもたらします。
本文
cuTile Rust (cutile-rs)
cuTile Rust は、idiomatic な Rust でメモリ安全かつデータレースフリーな GPU カーネルを記述するためのタイルベースシステムです。主要な特徴は以下の通りです:
- 所有権の拡大: 所有権の規律を GPU ランチ境界まで拡張しています。
- 変更可能なテンソル (
): 実行前に非重なり部分へ分割されます。mutable tensor - 不変のテンソル (
): 共有されます。immutable tensor
- 変更可能なテンソル (
- 動的所有権: 生成されたランチャーは、GPU 上の計算が進行中においても所有権を保ち続けます。
- サポート機能:
- 同期型の実行
- 非同時パイプライン
- CUDA グラフの再生
#[cutile::module] マクロは、各核に対してホストバイナリに Rust の AST を埋め込み、必要な際に CUDA Tile IR へ JIT コンパイルし、GPU cubin に変換します。より低レベルな制御が必要な場合は、ローカルなオプトアウト機能を利用可能です。
プロジェクトの状態
この研究プロジェクトは、Rust エコシステムにおける GPU プログラミングの実証としてリリースされています。ソフトウェアはまだ初期開発段階のため:
- バグや機能不全
- API の変更
が予想されます。しかし、ご関心をお持ちいただき、フィードバックを提供して方向性を形作っていただけますと幸いです。
貢献に興味がある場合は「CONTRIBUTING.md」 をご覧ください。
クイックスタート
以下のコードは、Rust アレファレンス風な GPU 計算を行う最小限の例です。
use cutile::prelude::*; #[cutile::module] mod kernel { use cutile::core::*; #[cutile::entry()] fn add<const B: i32>( z: &mut Tensor<f32, { [B] }>, x: &Tensor<f32, { [-1] }>, y: &Tensor<f32, { [-1] }>, ) { let tx = load_tile_like(x, z); let ty = load_tile_like(y, z); z.store(tx + ty); } } fn main() -> Result<(), Error> { let x = api::ones::<f32>(&[1024]); let y = api::ones::<f32>(&[1024]); let z = api::zeros::<f32>(&[1024]).partition([128]); // カーネル実行、JIT コンパイル、同期を一度に行う let (_z, _x, _y) = kernel::add(z, x, y).sync()?; Ok(()) }
実行的な解説:
マクロ:#[cutile::module]
関数を GPU カーネルに変換し、ホスト側のランチャーを生成します。add- 遅延評価: ホストコードではテンソル操作を構築し、変更可能な出力を 128 要素のチャンク に分割してから、
メソッドで実行・コンパイルを行います。.sync() - アクセスメッセージ: カーネルシグネチャはデバイスコードへ持ち込まれます(
は排他的に変更可能、z
とx
は共有読み取り)。ボディ内では出力と一致する入力タイルを読み込み、加算し、結果をストアします。y - ランチンググリッド:
は分割サイズから推論されます(1024 ÷ 128 = 8 タイル)。(8, 1, 1)
同様の例は
で実行可能です。さらに多くの例は GitHub リポジトリの cargo run -p cutile-examples --example saxpy
examples フォルダにあります。
パフォーマンス評価と論文
cuTile Rust に関する論文「Fearless Concurrency on the GPU」は以下のリンクから入手可能です: https://arxiv.org/abs/2606.15991
NVIDIA B200 でのベンチマーク結果:
- 要素単位の操作: 7 TB/s(ピークメモリ帯域の 91%)
- GEMM: 2 PFlop/s(dense f16 ピークの 92%)
- cuBLAS と同等の競合性能を達成しています。
- 安全性オーバーヘッドについては、可視化されない実行時間オーバーヘッドを持つにもかかわらず、安全な Rust persistent GEMM が M=N=K=8192 で 2.07 PFlop/s を達成しています。
Hugging Face「Grout」による推論エンジンの評価: Hugging Face と共同開発した cuTile Rust 基盤の Qwen3 推論エンジン「Grout」の評価結果です。
- Qwen3-4B (RTX 5090): 171 tokens/s (
decode)batch-1 - Qwen3-32B (B200): 82 tokens/s (
decode)batch-1
HBM roofline 解析においてメモリ束縛推論タスクで state-of-the-art 級の性能を示しています。
再現性アバター: 測定結果の完全な再現には以下のリポジトリを使用可能です: https://github.com/example/cutile-rs-reproducibility
- 論文向け測定: cuTile Rust 0.2.0 に対して実行済み
- Grout バージョン: https://github.com/huggingface/grout
引用方法
cuTile Rust を研究で利用する際は、以下の BibTeX エントリを引用してください。
@misc{elibol2026fearlessconcurrencygpu, title = {Fearless Concurrency on the GPU}, author = {Elibol, Melih and Roesch, Jared and Gelado, Isaac and Buehler, Eric and Garland, Michael}, year = {2026}, eprint = {2606.15991}, archivePrefix = {arXiv}, primaryClass = {cs.PL}, url = {https://arxiv.org/abs/2606.15991} }
関連プロジェクトと参考文献
- Grout: Hugging Face の Rust Qwen3 推論エンジン(cuTile Rust を採用し、生産環境向けの参照事例)。
- cuTile Python: CUDA Tile による Python カーネルプログラミング。
- TileGym: CUDA Tile カーネル例とチューニングパターン。
- cuda-oxide: NVlabs の実験的 Rust-to-CUDA コンパイラ(SIMT スタイルの GPU カーネル記述が可能)。
- CUDA Tile IR 文書: 公式リファレンス
- CUDA ドキュメント: Toolkit ドキュメント
- Rust NVPTX バックエンド: rustc の NVIDIA GPU 向け PTX 生成サポート。
概要: cuTile Rust は CUDA Tile IR を下流化し、テンソルパーティションとテンソルコア志向の操作を API 中心にしたタイルベースカーネルを対象としています。
セットアップ
要件
- GPU: NVIDIA GPU (最低構成:sm_80)
- sm_100+: CUDA 13.1+ でサポート
- sm_8x: CUDA 13.2 で追加対応
- sm_90: CUDA 13.3 で追加対応(CUDA 13.3 ユーザーは sm_80+ をカバー)
- 推奨: CUDA 13.3 (sm_80+ サポート、FP4 パッキング、ブロックスケール MMA など新機能のため)
- 言語: Rust 1.89+
- OS: Linux (Ubuntu 24.04 で検証済み)
インストール手順
1. Rust のインストール
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh rustup default stable
2. CUDA のインストール
公式サイトから CUDA 13.3 を OS に合わせてインストールしてください。 https://developer.nvidia.com/cuda-downloads
3. 環境設定 (~/.cargo/config.toml
)
~/.cargo/config.tomlCUDA_TOOLKIT_PATH 変数を CUDA インストールディレクトリに設定します。
[env] # 例:/usr/local/cuda-13 にインストールした場合 CUDA_TOOLKIT_PATH = { value = "/usr/local/cuda-13", relative = false }
4. インストールの確認
ハローワールド例を実行し、以下の出力が表示されるか確認してください。
cargo run -p cutile-examples --example hello_world # 期待する出力: # Hello, I am tile <0, 0, 0> in a kernel with <1, 1, 1> tiles.
Nix を介したセットアップ(オプション)
開発環境の簡略化として Nix flake を提供しています。
設定:
~/.config/nix/nix.conf に以下の行を追加。
experimental-features = nix-command flakes
コマンド実行:
# 特定の例を直接実行 nix develop -c cargo run -p cutile-examples --example saxpy # インタラクティブシェルを開く(すべての依存関係を自動解決) nix develop # cutile-rs dev shell # ✓ CUDA /nix/store/...-cuda-toolkit-13.3 # ✓ Rust 1.90.0-nightly
Flake は自動的に NixOS および非 NixOS システム両方でホスト NVIDIA ドライバーを検出します。
テストとベンチマーク
各コンポーネントのテストコマンドは以下の通りです:
- cuTile IR:
cargo test --package cutile-ir - cuTile Rust コンパイラ:
cargo test --package cutile-compiler - cuTile Rust ライブラリ:
cargo test --package cutile - 個別の例:
cargo run -p cutile-examples --example async_gemm - ベンチマーク:
cargo bench
一括実行スクリプト:
./scripts/run_all.sh # ログを残したい場合: ./scripts/run_all.sh 2>&1 | tee test_run.log
ワークスペースの構成
ワークスペースは以下のモジュールで構成されています。
- cutile: ユーザー向けパッケージ(タイルカーネル記述・実行)
(マクロ定義)├── cutile-macro
(コンパイラ)├── cutile-compiler
(非同期実行サポート)├── cuda-async
(CUDA コア機能)└── cuda-core
- cutile-kernels: 再利用可能な cuTile Rust カーネル
└── cutile
- cutile-macro: cuTile Rust プロシージャーマクロ
└── cutile-compiler
- cutile-compiler: カーネルを実行可能バイナリへコンパイルするモジュール
(Pure Rust Tile IR ビルダー)├── cutile-ir├── cuda-async└── cuda-core
- cutile-ir: 純粋な Rust で書かれた Tile IR ビルダーとバイトコードライタ。
- cuda-async: おもに Rust アシンク経由の非同期 CUDA 実行管理。
└── cuda-core
- cuda-core: idiomatic な安全な CUDA API 定義。
(NVIDIA CUDA バインディング)└── cuda-bindings
ライセンス
- cuTile Rust (主要パッケージ): Apache License, Version 2.0 (https://www.apache.org/licenses/LICENSE-2.0)
- 例外:
パッケージのみ、NVIDIA ソフトウェアライセンス (cuda-bindings
) を使用しています。LICENSE-NVIDIA
- 例外: