1 ポイント 投稿者 GN⁺ 2024-05-18 | 1件のコメント | WhatsAppで共有
  • 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-cgen-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件のコメント

 
GN⁺ 2024-05-18
Hacker Newsの意見

Hacker Newsコメントまとめ要約

  • PythonとPyPyの性能比較

    • PythonとPyPyで同じコードを実行したところ、PyPyの方がはるかに高速。
    • Apple M3 MaxとNVIDIA RTX 4090でのベンチマーク結果を共有。
    • Intel i7-1270Pでの性能は非常に遅い。
    • Mac以外の他プラットフォームでもテストが必要。
  • 肯定的なフィードバック

    • プロジェクトが初期段階であることを考えると、成果は称賛に値する。
    • Futharkと比べて、さまざまなターゲットをサポートしていない点は惜しい。
    • 性能問題は解決可能に見える。
  • 批判的な意見

    • 初期バージョンにもかかわらず、多くの批判を受けている。
    • ホームページは直感的で理解しやすい。
    • 並列アルゴリズムに対する期待と現実の差に言及。
  • 並列プログラミングへの期待

    • 並列プログラミングの未来への期待を表明。
    • RustとShadertoyで並列プログラミングを試した経験を共有。
    • GPUを活用する汎用並列言語への期待感。
  • 性能比較

    • C++で書いた単純なループがBendと似た性能を示す。
    • 最適化されたC++コードははるかに高速。
  • プロジェクトの発展への期待

    • 自動並列化の難しさを乗り越えた点を称賛。
    • 今後の発展に期待。
  • 懐疑的な見方

    • Bendの限定的なDSL的特性を指摘。
    • 性能が良くない点を強調。
    • 実際の高性能並列計算では配列が重要であると指摘。
    • Bendの有用性には懐疑的。
  • 前向きな見通し

    • BendがGPU活用を最大化できる可能性に言及。
    • LLMs以外でもGPUを活用できるさまざまな可能性に期待。
  • Bendの言語的特性

    • Bendのシンプルな使い方と性能向上を称賛。
    • 24ビット整数しかサポートしない点は惜しい。
    • より高ビット幅の整数サポートが必要だと指摘。