概要
BarraCUDAは AMD GPU向け のオープンソースCUDAコンパイラ。 LLVMやHIPに依存せず、.cuファイルから直接GFX11バイナリを生成。 約 15,000行のC99 で実装され、シンプルなビルド手順を実現。 主要なCUDA機能とC言語機能に対応し、今後さらに 他アーキテクチャも対応予定。 制限事項や今後のロードマップも明示されており、開発の透明性を確保。
BarraCUDAとは
- AMD GPU向け のオープンソースCUDAコンパイラ
- LLVM非依存、HIP変換レイヤーも不要
- .cuファイル を直接GFX11マシンコード(ELF .hsacoバイナリ)に変換
- 15,000行以上の C99 による実装
- 依存ライブラリなし、gcc等でmake一発ビルド可能
- 現状、 AMD RDNA 3(gfx1100) に対応
パイプライン概要
- プリプロセッサ :#includeや#define等の前処理
- 字句解析 :トークン分割
- 構文解析 :再帰下降パーサでAST生成
- 意味解析 :型チェック・スコープ解決
- BIR(独自IR) :SSA形式による中間表現
- mem2reg :allocaをSSAレジスタに昇格
- 命令選択 :BIR→AMDGPU命令
- レジスタ割り当て :VGPR/SGPR割り当て
- バイナリエンコード :GFX11命令語化
- ELF出力 :.hsaco生成
- カーネル実行 :GPU上で実行可能
特徴・強み
- LLVMやHIP不要、独自で命令エンコードを実装
- エラー回復機能 (複数エラーを一度に報告)
- 全データ構造は固定長配列、ヒープ割り当てなし
- 再帰なし・有界ループのみ、堅牢な実装
- IRやASTのダンプ機能 (デバッグ・解析用)
- 全エンコーディングをllvm-objdumpで検証済み
対応機能(CUDA/C言語)
- global, device, __host__関数修飾子
- threadIdx, blockIdx, blockDim, gridDim等の組込変数
- 構造体、enum、typedef、namespace
- ポインタ、配列、ポインタ演算
- C言語制御構文(if/else, for, while, do-while, switch/case, goto/label)
- 論理演算子(&&, ||)、三項演算子
- テンプレート(基本的なインスタンス化)
- CUDA共有メモリ(shared)、バリア(__syncthreads→s_barrier)
- アトミック演算(atomicAdd, atomicSub, atomicMin, 他)
- ワープ命令(__shfl_sync, __ballot_sync等)
- ベクタ型(float2, int3等)と.x/.y/.z/.wアクセス
- 半精度型(__half, __float2half等)
- __launch_bounds__対応(VGPR制限も反映)
- Cooperative Groups(cooperative_groups::this_thread_block()等)
- 演算子オーバーロード
- Cプリプロセッサ全対応(#include, #define, #ifdef, #pragma, #error, -I/-D等)
- ソース位置情報付きIRダンプ
使い方
- AMD GPUバイナリ生成 ./barracuda --amdgpu-bin kernel.cu -o kernel.hsaco
- IRダンプ ./barracuda --ir kernel.cu
- ASTダンプ ./barracuda --ast kernel.cu
- 意味解析のみ実行 ./barracuda --sema kernel.cu
ビルド方法
- gcc等のC99コンパイラ でmake実行のみ
- make失敗時はgcc側の問題
ソース構成(主なファイルと役割)
- lexer.c(字句解析、747行)
- preproc.c(プリプロセッサ、1,370行)
- parser.c(構文解析、1,500行)
- sema.c(意味解析、1,725行)
- bir.c + bir_lower.c(SSA IR、3,032行)
- bir_mem2reg.c(mem2reg、965行)
- amdgpu_isel.c(命令選択、1,788行)
- amdgpu_emit.c(レジスタ割当・バイナリエンコード・ELF、1,735行)
- main.c(CLIドライバ、317行)
未対応・制限事項
- unsigned単体指定(unsigned intで代用)
- 複合代入(+=, -=, >>=等、明示的に記述)
- const修飾子、__constant__メモリ
- 共有メモリの2次元配列宣言(1次元にフラット化推奨)
- 整数リテラルサフィックス(0xFFu, 1ULL等)
- __device__関数でのパラメータ再代入(ローカル変数で代用)
- テクスチャ・サーフェス、動的並列処理、複数翻訳単位
- ホストコード生成(デバイスコードのみ対応)
テストスイート
- 14ファイル、35+カーネル、約1,700 BIR命令、27KBマシンコード
- vector_add.cu(GPU計算のHello World)
- cuda_features.cu(アトミック、ワープ命令、バリア等)
- test_tier12.cu(ベクタ型、共有メモリ、演算子オーバーロード)
- notgpt.cu(AI生成CUDA、半精度、協調グループ等)
- stress.cu(N-body、ビット演算、構造体値渡し等)
- canonical.cu(NVIDIAサンプル準拠)
- test_errors.cu(エラー回復テスト)
- その他、launch_bounds・cooperative groups等のテスト
今後のロードマップ
- 短期 :未対応構文(複合代入、unsigned単体、const等)の対応
- 中期 :最適化(命令スケジューリング、レジスタ割当、定数畳み込み、ループ最適化等)
- 長期 :新アーキテクチャ対応(Tenstorrent、Intel Arc、RISC-V Vector Extension等)
GFX11エンコーディング注意点
- SOP1プリフィックスは0xBE800000
- SOPCプリフィックスは0xBF000000
- VOP3 VDSTは[7:0]ビット
- Null SADDRはグローバル0x7C、スクラッチ0xFC
- RDNA 3はWave32がデフォルト
- ISAマニュアルは500ページ、矛盾あり
- amdgpu_emit.c(1,735行)はこれらの検証の証
ライセンス・連絡先
- Apache 2.0ライセンス、商用利用含め自由
- バグ報告・議論歓迎(zanehambly@gmail.com、New Zealand在住)
- GitHub Issueも利用可能
- 実運用事例の報告も歓迎
BarraCUDAは、 NVIDIAの独自エコシステムに対する挑戦 として生まれた、 シンプルかつパワフルなAMD GPU向けCUDAコンパイラ。 今後の拡張や最適化にも積極的で、 GPUコンパイラに興味のある開発者に最適なプロジェクト。