NVIDIA/cuda-tile

CUDA Tile IR is an MLIR-based intermediate representation and compiler infrastructure for CUDA kernel optimization, focusing on tile-based computation patterns and optimizations targeting NVIDIA tensor core units.

NVIDIA / cuda‑tile – CUDA Tile IR

何がそれか

  • MLIR/LLVM の上に構築されたオープンソースのコンパイラインフラで、新しい CUDA Tile dialect を導入しています。
  • このダイアレクトは、NVIDIA GPU(特にTensor-Coreユニット)に効率的にマッピングされる タイルベースの計算パターン を表現します。
  • 次のものを同梱しています:
    • MLIRダイアレクト(タイル化されたテンソル、ポインタなどに対する操作と型)
    • IRをプログラム的に構築・変換するためのPythonバインディング
    • バイナリ bytecode 形式と、MLIRテキスト、bytecode、最終的なGPUバイナリ(cubin)間の変換ツール
    • コンプライアンステストスイート。

なぜ重要なのか

  • タイリングは高性能カーネル(行列乗算、畳み込みなど)のコア最適化です。CUDA Tileは一級の抽象化を提供することで、開発者が高レベルでカーネルを記述しつつ、手動最適化されたCUDAのパフォーマンスに到達できるようにします。
  • CUDA Toolkit 13.1 リリースと統合されているため、生成されたコードは通常のCUDAドライバAPIで実行できます。

主要コンポーネント

コンポーネント 目的
CUDA Tile Dialect GPUメモリ階層とTensor-Core使用を考慮した tile<…> 型、load_ptr_tko、print_tko、reshape、broadcast などの操作を定義するMLIRダイアレクト。
Pythonバインディング C++を書かずに、スクリプトでTile IRを構築・検査・変換パスを実行できるようにします。
Bytecode コンパクトなバイナリ表現(.tilebc)で、CUDAドライバによるJITコンパイルまたは tileiras によるAOTコンパイル(cubinに)が可能です。
テストスイート LLVM‑litベースのテストで、ダイアレクトの意味とエンドツーエンドのコンパイルフローを検証します。

一般的なワークフロー

  1. 記述:CUDA Tileダイアレクトを使用してMLIRでカーネルを書く(READMEの例を参照)。
  2. 変換:cuda-tile-translate でbytecodeに変換する。
  3. コンパイル:bytecodeをcubinにコンパイルする(tileiras)または 実行時に直接bytecodeをロードする(ドライバがJITコンパイル)。
  4. 実行:CUDAドライバAPI(またはランタイムAPI)経由でホストプログラムからカーネルを起動する。

ビルドとインストール

  • CMake ≥ 3.20、C++17コンパイラ、Python ≥ 3.6、および互換性のあるLLVM/MLIRチェックアウトが必要(正確なコミットは cmake/IncludeLLVM.cmake にピン止めされています)。
  • LLVMを提供する3つの方法:
    1. CMakeが自動的に正しいLLVMソースをダウンロード(遅いが最も簡単)。
    2. CMakeにローカルのLLVMソースツリーを指定。
    3. 事前にビルドされたLLVMインストールにリンク(Python APIが必要な場合、-DMLIR_ENABLE_BINDINGS_PYTHON=ON でビルド済みでなければならない)。
  • オプションフラグ:
    • -DCUDA_TILE_ENABLE_BINDINGS_PYTHON=ON – Python APIをビルド。
    • -DCUDA_TILE_ENABLE_TESTING=ON – litテストスイートをビルドおよび実行。
    • -DCUDA_TILE_ENABLE_CCACHE=ON – 再コンパイルを高速化。

例(READMEから)

# ライブラリとツールのビルド
cmake -G Ninja -S . -B build \
  -DCMAKE_BUILD_TYPE=Release \
  -DCUDA_TILE_ENABLE_BINDINGS_PYTHON=ON \
  -DCUDA_TILE_ENABLE_TESTING=ON
cmake --build build

# MLIRファイルをbytecodeに変換
cuda-tile-translate example.mlir \
  --bytecode-version=13.1 \
  --mlir-to-cudatilebc --no-implicit-module -o example.tilebc

# AOTでcubinにコンパイル(sm_100をGPUアーキテクチャに置き換える)
 tileiras --gpu-name sm_100 example.tilebc -o example.cubin

# cubinをロードするホストプログラムをコンパイルして実行
 g++ example_host.cpp -o example -I/usr/local/cuda/include \
   -L/usr/local/cuda/lib64 -lcuda
 ./example

このプログラムはデータ配列を出力し、Tile IRソースからGPU実行までの一連のエンドツーエンドパスを示しています。

使用例

  • ディープラーニング演算子用にカスタムカーネルを構築する研究者で、Tensor-Coreを活用する必要がある場合。
  • ティルドアルゴリズムの再利用可能な高レベル表現を必要としながら、低レベルCUDAを出力できるパフォーマンスエンジニア。
  • MLIRにGPU固有のパスを拡張するツール開発者;CUDA Tileは具体的なダイアレクトとテストハーネスを提供します。

バージョニングと互換性

  • オープンソース版はCUDA Toolkitバージョン(13.1.x)と一致しています。パッチ番号はオープンソースコード自体のリリースを追跡します。
  • 各リリースは特定のLLVMコミット範囲に紐づいています;ヘルパー スクリプト(scripts/get-cuda-tile-version-for-llvm-hash.sh)は、特定のLLVMリビジョンに適したCUDA Tileタグを選択するのを支援します。

貢献モデル

  • プロジェクトは Apache‑2.0 with LLVM exceptions ライセンスでオープンソースですが、READMEは外部の貢献は 現時点では受け付けていない と明記しています。バグやフィードバックについては、問題を報告することを推奨しています。

結論:CUDA Tileは、MLIRダイアレクトを介してタイル化されたGPUカーネルを記述・最適化できる本格的で生産環境向けのコンパイラスタックであり、変換、テスト、既存のCUDAワークフローへの統合のための完全なツールチェーンを備えています。

関連

  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト
  • プロジェクト