CUDAでGPUプログラミングをしていると、「NVIDIAのGPUでしか動かない」という制約に一度はぶつかるのではないでしょうか。とくにAMDのRadeonシリーズは価格面でかなり魅力的なのに、CUDAコードがそのまま動かないのは本当にもったいないと感じていました。
そんな中、Hacker Newsで話題になっていたのがBarraCUDAというオープンソースプロジェクトです。CUDAのソースコード(.cuファイル)をAMD GPU向けにコンパイルしてくれるツールで、しかもLLVMに依存しない独自実装というのが驚きでした。
BarraCUDAの仕組みと特徴
BarraCUDAは約15,000行のC99コードで書かれたコンパイラです。NVIDIAのnvccに渡すのと同じ.cuファイルを受け取り、AMD RDNA 3(GFX11)アーキテクチャ向けのマシンコードに変換してくれます。
一般的にCUDAコードをAMD GPUで動かそうとすると、HIPという変換レイヤーを使うのがこれまでの常識でした。しかしBarraCUDAのアプローチはまったく異なります。独自のレキサー、パーサー、中間表現(BIR)、そして手書きの命令選択パスを持ち、ゼロからコンパイルパイプラインを構築しているんですよね。
コンパイルの流れを簡単にまとめると、こんな感じです。
- プリプロセッサでマクロや条件付きコンパイルを処理
- 再帰下降パーサーでAST(抽象構文木)を生成
- 型チェックやスコープ解決を含む意味解析を実行
- BIR(BarraCUDA IR)というSSA形式の中間表現に変換
- mem2regパスでアロケーションをSSAレジスタに昇格
- AMD GPUの命令セットへ変換し、レジスタ割り当てを実行
- GFX11命令エンコーディングを経てELF形式の.hsacoバイナリを出力
すべてのエンコーディングはllvm-objdumpで検証済みで、デコード失敗がゼロとのこと。LLVMを使ってビルドしたわけではなく、あくまで検証に使ったという点が面白いところです。
ビルドと使い方がシンプルすぎる
BarraCUDAのビルド方法は拍子抜けするほど簡単でした。C99コンパイラ(gccやclang)があればmake一発で完了します。CMakeもautoconfも必要ありません。
使い方もシンプルで、./barracuda --amdgpu-bin kernel.cu -o kernel.hsacoのようにコマンドを実行するだけ。生成された.hsacoファイルはAMD GPUがそのまま実行できるバイナリになっています。
なぜBarraCUDAが注目されるのか
これまでCUDAのエコシステムは事実上NVIDIAの独占状態でした。AIや機械学習のライブラリの多くはCUDA前提で書かれており、それがNVIDIA GPUの支配的なシェアを支える一因になっていました。
BarraCUDAのようなプロジェクトが成熟すれば、GPU市場の競争環境に変化が生まれる可能性があります。とくに以下のような場面で影響が大きいのではないでしょうか。
- 研究機関や個人開発者が予算の都合でAMD GPUを使いたいが、CUDAコードが動かないために断念していたケース
- AMDのInstinctシリーズがデータセンターで採用されるにつれ、CUDA互換性の需要が高まっているクラウド環境
- LLVMに依存しない軽量な実装は、教育目的やカスタマイズの面で大きな価値がありそうなオープンソースコミュニティ
現時点での制限
ただし、現時点ではいくつかの制限があることも把握しておく必要があります。対応アーキテクチャはRDNA 3(GFX11)のみで、それ以前のAMD GPUでは動きません。また、CUDAの全機能をカバーしているわけではなく、複雑なテンプレートや一部のランタイムAPIには未対応の部分があるようです。
それでも、15,000行のC99コードでここまで実現しているのは率直にすごいと感じました。コンパイラ開発に興味がある方にとっても、コードベースが小さく読みやすい点は学習素材として魅力的かもしれません。
関連する動き
GPU市場でのオープン化の動きはBarraCUDAだけではありません。AMDのROCmスタックやIntelのoneAPIなど、NVIDIA以外の選択肢は徐々に増えてきています。GPU上のAsync/Awaitの記事でも触れたように、GPUプログラミングの手法自体も急速に進化しています。
さらに、Docker Model Runnerの記事で紹介したように、ローカルでのAI実行環境の需要は急増しており、コスト効率の良いGPU選択肢が増えることは業界全体にとってプラスに働くはずです。
まとめ
BarraCUDAは「CUDAコードをAMD GPUでそのまま動かす」という、シンプルだけど大きな課題に真正面から取り組んでいるプロジェクトです。LLVM非依存のゼロからの実装という点でも技術的に興味深く、今後の発展が楽しみですね。
プロジェクトはGitHubで公開されているので、GPU市場の多様化に興味がある方はチェックしてみてはいかがでしょうか。
参考リンク: