
2026/02/18 5:35
バーラCUDA ― AMD GPU 向けに設計されたオープンソースの CUDA コンパイラー
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
(以下は原文を日本語に翻訳したものです)
BarraCUDA – AMD GPU 用の LLVM‑free CUDA コンパイラ
BarraCUDA は、約15,000行の C で書かれたオープンソースの C99 ベースの CUDA コンパイラです。AMD RDNA 3(GFX1100)GPU を対象とし、LLVM やその他外部ビルドツールに依存せずに ELF .hsaco バイナリを生成します – ただ単に
make で構築できます。
アーキテクチャ
パイプラインは完全に文書化されています:
preprocessor → lexer → recursive‑descent parser → semantic analysis → SSA BIR → mem2reg promotion → instruction selection → register allocation → binary encoding → ELF emission。ホットパスには再帰や動的メモリが含まれず、コンパイラはデバッグ用に AST (
--ast) または IR (--ir) をダンプできます。また、完全な C 前処理器、エラー回復、ソース位置追跡、および構造体の値渡し処理も実装されています。
サポートされる CUDA 機能
- グローバル/デバイス/ホスト修飾子;スレッド/ブロック組み込み
- 完全な C 制御フロー(if/else、ループ、switch/case、goto)と短絡論理
- 基本的なテンプレート、演算子オーバーロード、複数の戻りパス、
/continuebreak
メモリ(LDS 配分)、__shared__
、アトミック、ワープ内蔵関数(__syncthreads()
バリアント)、ベクトル型(float2–4, int2–4)、half 精度、__shfl_sync
、協調グループ__launch_bounds__
メモリ、アトミック操作、および上記のキーポイントに列挙されているその他の CUDA プリミティブ__shared__
現在の制限事項
符号なし型(bare unsigned types)、複合代入(
+=, -= など)、const 修飾子、__constant__ メモリ、2‑D シェアードメモリ配列、整数リテラル接尾辞、__device__ 関数内のパラメータ再代入、テクスチャ/サーフェイス、動的並列処理、多重翻訳単位、およびホストコード生成はまだサポートされていません。
テストスイート
テストハーネスには 14 ファイルが含まれ、35 を超えるカーネル(約1,700 BIR 命令、約27 KB マシンコード)があります。アトミック操作、ワープ演算、バリア、テンプレート、協調グループ、および複雑な「キッチンシンク」AI 生成カーネルを実行します。
ロードマップ
- 近期:パーサーの強化とギャップ埋め。
- 中期:命令スケジューリング、レジスタ割り当て、定数フォールディング、ループ不変動作移動、占有率チューニング。
- 長期:新しいアーキテクチャのサポート(Tenstorrent RISC‑V AI アクセラレーター、Intel Arc Xe、RISC‑V Vector)。
エンコーディングに関する注意点
- AMDGPU 命令プレフィックスは直感的でない:SOP1 (
)、SOPC (0xBE800000
)。0xBF000000 - VOP3 命令は VDST ビットを使用して宛先選択を行う。
- Null SADDR 値は
とエンコードされる。0xffffffff - RDNA 3 カーネルはデフォルトで Wave32(Wave64 ではない)を使用。
ライセンスとコミュニティ
BarraCUDA は Apache 2.0 の下でリリースされています。問題や議論は GitHub またはメール(zanehambly@gmail.com)で報告できます。この軽量で LLVM‑free なツールチェーンは、AMD GPU および新興アクセラレーターエコシステム向けに開発する学術機関や小規模チームに魅力的かもしれません。
本文
BarraCUDA
AMD GPU を対象にしたオープンソースの CUDA コンパイラで、今後さらに多くのアーキテクチャを追加予定です。C99 で 15,000 行程度のコードから構成され、LLVM に依存していません。
.cu ファイルを直接 GFX11 機械語へコンパイルし、AMD GPU が実行可能な ELF .hsaco バイナリを出力します。
これは NVIDIA のウォールガーデンを眺め、「そんなに難しいものなの?」と考えた結果です。答えは「実際にはかなり難しい」ですが、私はそれでも挑戦しました。
※ 現在の Tenstorrent 実装を試したい場合は、そのブランチをクローンしてください。
何ができるか
CUDA C ソースコード(
nvcc に渡す .cu ファイルと同じ)を AMD RDNA 3 (gfx1100) 用のバイナリにコンパイルします。LLVM は使わず、HIP 翻訳層も不要です。字句解析器、構文解析器(再帰下降)、IR、そして 1,700 行程度の手書き命令選択ロジックだけで実現しています。
┌───────────────────────────────────────┐ │ BarraCUDA Pipeline │ ├───────────────────────────────────────┤ │ Source (.cu) │ │ ↓ │ │ Preprocessor → #include, #define, … │ │ ↓ │ │ Lexer → Tokens │ │ ↓ │ │ Parser (Recursive Descent) → AST │ │ ↓ │ │ Semantic Analysis → Type checking, … │ │ ↓ │ │ BIR (BarraCUDA IR) → SSA form, … │ │ ↓ │ │ mem2reg → Promotes allocas to SSA regs│ │ ↓ │ │ Instruction Selection → AMDGPU ops │ │ ↓ │ │ Register Allocation → VGPR/SGPR │ │ ↓ │ │ Binary Encoding → GFX11 instruction │ │ ↓ │ │ ELF Emission → .hsaco │ │ ↓ │ │ Your kernel runs on your silicon │ └───────────────────────────────────────┘
すべてのエンコーディングは
llvm-objdump で検証され、デコード失敗はありません。LLVM を使ってコンパイルしたわけではありませんが、チェック用に使用しました。
ビルド方法
# C99 コードです。gcc でビルドできます。 make
CMake や autoconf は不要です。ビルド手順は 47 ステップではなく、簡潔です。もし失敗したら、GCC が壊れている可能性があります。
必要条件
- C99 コンパイラ(gcc, clang 等)
- (任意)挑戦心
LLVM は 不要 です。BarraCUDA は独自に命令をエンコードします。
使用方法
# AMD GPU バイナリへコンパイル ./barracuda --amdgpu-bin kernel.cu -o kernel.hsaco # IR をダンプ(デバッグや好奇心のため) ./barracuda --ir kernel.cu # ただ AST を解析して表示 ./barracuda --ast kernel.cu # セマンティック分析を実行 ./barracuda --sema kernel.cu
対応機能
以下の CUDA 機能が GFX11 マシンコードとして正しく動作します。
| コア言語 | CUDA 機能 |
|---|---|
, , 修飾子 | メモリ(LDS) |
ビルトイン: , 等 | → |
| 構造体、列挙型、typedef、名前空間 | 原子的操作 (, など) |
| ポインタ、配列、ポインタ算術 | ワープ内命令 ( 等) |
| 制御フロー: if/else, for, while, do-while, switch/case, goto/label | ワーヴ投票 ( 等) |
Short-circuit / ` | |
| 三項演算子 | 半精度: , 変換 |
| テンプレート(基本的なインスタンス化) | の解析、VGPR 上限 |
| 複数の戻り経路, continue, break | コーポレーティブグループ () |
| 演算子オーバーロード |
コンパイラ機能
- 完全な C 前処理器:
,#include
, 関数型マクロ, 条件付きディレクティブ,#define/#undef
,#pragma#error - エラー回復(複数エラーを報告しても停止しない)
- IR ダンプ時のソース位置追跡
- 構造体の値渡し
例
__global__ void vector_add(float *c, float *a, float *b, int n) { int idx = threadIdx.x + blockIdx.x * blockDim.x; if (idx < n) c[idx] = a[idx] + b[idx]; }
$ ./barracuda --amdgpu-bin vector_add.cu -o vector_add.hsaco wrote vector_add.hsaco (528 bytes code, 1 kernels)
LLVM は不要です。
アーキテクチャ
| ファイル | 行数 | 内容 |
|---|---|---|
| 747 | CUDA C ソースの字句解析 |
| 1 370 | 前処理(マクロ, インクルード, 条件付き) |
| 1 500 | 再帰下降パーサ → AST |
| 1 725 | 型チェック, スコープ解決, オーバーロード解析 |
| 3 032 | SSA IR と AST→BIR ライティング |
| 965 | スタックアロケを SSA レジスタへ昇格 |
| 579 | ソース位置付きの美しい IR プリント |
| 1 788 | 命令選択:BIR → AMDGPU マシンオペ |
| 1 735 | レジスタ割り当て + GFX11 バイナリエンコード + ELF 出力 |
| 317 | CLI ドライバ |
| 合計 | 15 117 |
データ構造はすべて固定サイズ配列で、ホットパスでは malloc を使わず、再帰もなく、ループはすべて境界付きです。
現状対応できない項目
- 単独の
(unsigned
またはunsigned int
を使用)int - 代入演算子 (
,+=
,-=
など)>>=
修飾子const
メモリ__constant__- 2D シェアードメモリ配列 (
) – 1D にフラット化__shared__ float a[16][16] - 整数リテラルサフィックス (
,0xFFu
)1ULL
関数内でのパラメータ再代入(ローカル変数を使用)__device__- テクスチャとサーフェス
- 動的並列性(デバイス側カーネル起動)
- 複数トランスレーションユニット
- ホストコード生成(デバイスコードのみコンパイル)
これらはアーキテクチャ上の障害ではなく、まだ実装に手が回っていないだけです。
テストスイート
14 ファイル、35+ カーネル、約1,700 BIR 命令、約27 000 バイトのマシンコード:
– GPU 計算の「Hello World」vector_add.cu
– アトミック, ワープオペ, バリア, goto, switch, short-circuitcuda_features.cu
– ベクトル, シェアードメモリ, 演算子オーバーロードtest_tier12.cu
– AI 生成 CUDA(テイル SGEMM, 減算, ヒストグラム等)notgpt.cu
– N-body, ネスト制御フロー, ビット操作, 構造体値渡しstress.cu
– NVIDIA サンプルから改変したパターンcanonical.cu
– 故意の構文エラーで回復機能を確認test_errors.cu
–test_launch_bounds.cu
と VGPR 上限__launch_bounds__
– コーポレーティブグループ低減test_coop_groups.cu
また、前処理テスト, テンプレートテスト, unsigned 整数テストも含む。
ロードマップ
短期(ハーデニング)
既知のギャップ(代入演算子, 単独 unsigned, 整数リテラルサフィックス,
const, パラメータ再代入)を修正。実際の .cu ファイルをそのままコンパイルできるようにすることが目標です。
中期(最適化)
- 命令スケジューリング(メモリ遅延隠蔽)
- より良いレジスタ割り当て(現在は線形スキャン、グラフカラーを検討)
- 定数フォールディングとデッドコード除去
- ループ不変コード移動
- レジスタ圧力に基づく占有率調整
長期(多アーキテクチャ対応)
IR (BIR) はターゲット非依存です。新しいターゲットを追加するには、
isel と emit のペアを書くだけで済みます。
候補:
- Tenstorrent – RISC‑V AI アクセラレータ(タイルベース、SIMT ではない)
- Intel Arc – Xe アーキテクチャ
- RISC‑V ベクトル拡張 – CUDA をソフトコアで動かす
GFX11 エンコーディングノート(勇敢な方へ)
独自 AMDGPU バックエンドを書こうとしているなら、以下の点が午後を台無しにします:
- SOP1 プレフィックスは
(ドキュメントとは異なる)0xBE800000 - SOPC プレフィックスは
0xBF000000 - VOP3 VDST はビット
に位置し、[7:0]
ではない[15:8] - Null SADDR:グローバルメモリ用は
、スクラッチは0x7C0xFC - RDNA 3 のデフォルトは Wave32(Wave64 ではない)
- ISA マニュアルは 500 ページに及び、二度矛盾
amdgpu_emit.c はそのページを読み解く証です。
お問い合わせ
バグが見つかったら? AMDGPU 命令エンコーディングについて議論したい? GPU 計算で共感し合いたいなら:
zanehambly@gmail.com
議論したいことがあれば issue を立ててください。無理にではありません。私はあなたの母親ではありません。
ニュージーランド在住です。ここはすでに明日で、GPU は他所と同じくらい混乱しています。
ライセンス
Apache 2.0 – 何でも好きに使ってください。このコンパイラが本番環境で使用されたらぜひ教えてください(主に「面白いものを作った」という LinkedIn の更新のため)。