Bend - GPUで動作する高級言語(HVM2を使用)
(github.com/HigherOrderCO)- Bendは大規模並列処理をサポートする高水準プログラミング言語
- CUDAやMetalのような低水準の代替手段とは異なり、BendはPythonやHaskellのような表現力の高い言語の感触と機能を提供する
- 高速なオブジェクト割り当て、完全なクロージャ対応を備えた高階関数、制限のない再帰、さらには継続まで含まれる
- しかしGPUのような大規模並列ハードウェア上で実行され、コア数に応じてほぼ線形の速度向上を示す
- 明示的な並列アノテーションは一切不要: スレッド生成、ロック、ミューテックス、アトミック演算は必要ない
- BendはHVM2ランタイムによって駆動される
クイックデモ
Bendを使う
現時点ではWindowsでは動作せず、代替としてWSL2を使用する必要がある。
- まず、Rust nightlyをインストールする必要がある。
- 次に、HVM2とBendをインストールする必要がある:
cargo +nightly install hvm cargo +nightly install bend-lang - 最後にBendファイルを作成し、次のコマンドのいずれかで実行できる:
bend run # Rustインタープリタを使用(逐次) bend run-c # Cインタープリタを使用(並列) bend run-cu # CUDAインタープリタを使用(大規模並列) - また、最大性能のために
gen-cとgen-cuを使ってBendをスタンドアロンのC/CUDAファイルにコンパイルすることもできる。ただし、コード生成はまだ初期段階にあり、GCCやGHCのような最先端コンパイラほど成熟していない。
Bendでの並列プログラミング
- Bendで並列プログラムを書くには… 何もしなくてよい。ただし、本質的に逐次的ではないように書く必要がある。
- 例えば、次の式は並列実行できない:
(((1 + 2) + 3) + 4)+4は+3に依存し、+3は(1+2)に依存するためである。 - しかし、次の式は並列実行できる:
((1 + 2) + (3 + 4))(1+2)と(3+4)が独立しているためである。Bendの基本原則に従い、並列に実行可能なものはすべて並列に実行される。
サンプルコード
-
より完全な例として、次のコードを考えてみよう:
# ソートネットワーク = ツリー回転 def sort(d, s, tree): switch d: case 0: return tree case _: (x, y) = tree lft = sort(d-1, 0, x) rgt = sort(d-1, 1, y) return rots(d, s, lft, rgt) # サブツリー回転 def rots(d, s, tree): switch d: case 0: return tree case _: (x, y) = tree return down(d, s, warp(d-1, s, x, y)) -
このファイルは、不変ツリー回転を使ったビトニックソーターを実装している。これはGPUで高速に動作しそうにないアルゴリズムである。しかし、分割統治アプローチを使うため、本質的に並列的である。Bendはこれをマルチスレッドで実行する。いくつかのベンチマーク:
- CPU、Apple M3 Max、1スレッド: 12.15秒
- CPU、Apple M3 Max、16スレッド: 0.96秒
- GPU、NVIDIA RTX 4090、16kスレッド: 0.21秒
- 57倍の高速化を何もせずに達成している。スレッド生成、ロック、ミューテックスの明示的な管理はない。単にBendにRTX上でプログラムを実行するよう依頼しただけである。
多様な並列システムをサポート
-
Bendはテンソルや行列のような特定のパラダイムに限定されない。シェーダからErlangのようなアクターモデルまで、あらゆる並列システムをBendでエミュレートできる。
-
例えば、リアルタイムで画像をレンダリングするには、各フレームに不変ツリーを割り当てることができる:
# シェーダを受け取り、矩形画像を返す def render(depth, shader): bend d = 0, i = 0: when d < depth: color = (fork(d+1, i*2+0), fork(d+1, i*2+1)) else: width = depth / 2 color = shader(i % width, i / width) return color # 位置を受け取り、色を返す # このデモでは単にビジーループを回す def demo_shader(x, y): bend i = 0: when i < 5000: color = fork(i + 1) else: color = 0x000001 return color # demo_shaderを使って256x256画像をレンダリング def main: return render(16, demo_shader) -
実際に動作する。複雑なアルゴリズムもBendではうまく並列化される。長距離通信はグローバルベータ簡約(相互作用計算に基づく)によって行われ、HVM2のアトミックリンカーによって正確かつ効率的に同期される。
追加資料
- すぐに始めるには、BendのGUIDE.mdを確認すること。
- 機能一覧を見るには、FEATURES.mdを確認すること。
- Bendの技術を理解するには、HVM2の論文を確認すること。
- BendはHigherOrderCO.comで開発されている - Discordに参加すること。
GN⁺の意見
- 並列プログラミングの単純化: Bendは並列プログラミングを非常に単純化しており、初級ソフトウェアエンジニアでも容易に扱える。これは並列プログラミングの参入障壁を大きく下げる。
- 多様なハードウェア対応: BendはCPUだけでなくGPUでも効率的に実行できるため、さまざまなハードウェア環境で活用可能である。
- 表現力の高い言語: PythonとHaskellの長所を組み合わせ、表現力の高いコードを書ける。これはコードの可読性と保守性を高める。
- 初期段階のコード生成: 現在のBendのコード生成は初期段階にあり、成熟したコンパイラと比べると性能が劣る可能性がある。これは今後の改善が必要である。
- 多様な並列システム対応: Bendは特定のパラダイムに限定されず、多様な並列システムをサポートするため、柔軟なプログラミングが可能である。これにより、さまざまな応用分野でBendを活用できる。
1件のコメント
Hacker Newsの意見
Hacker Newsコメントまとめ要約
PythonとPyPyの性能比較
肯定的なフィードバック
批判的な意見
並列プログラミングへの期待
性能比較
プロジェクトの発展への期待
懐疑的な見方
前向きな見通し
Bendの言語的特性