約 10 年にわたる絶え間ない努力とコンピューター サイエンスの中核に関する徹底した研究を経て、人々はついに夢を実現しました。それは、GPU 上で高級言語を実行するというものです。
先週末、Bend と呼ばれるプログラミング言語がオープンソース コミュニティで白熱した議論を巻き起こし、GitHub のスターの数が 8,500 を超えました。
GitHub: https://github.com/HigherOrderCO/Bend
超並列高水準プログラミング言語としてはまだ研究段階ですが、提案されたアイデアはすでに人々を魅了しています。とても...驚きを感じます。 Bend を使用すると、10 年の経験を持つ C/CUDA の専門家でなくても、まるで Python のような感覚でマルチコア CPU/GPU 用の並列コードを作成できます。
はい、Bend は Python 構文を使用します。
Bend は、Python や Haskell などの表現力豊かな言語をサポートするプログラミング パラダイムであり、CUDA や Metal などの低レベルの言語とは異なります。 Bend は、高速なオブジェクト割り当て、高階関数の完全なクロージャ サポート、無制限の再帰、コア数に基づくほぼ線形の高速化を特徴としています。 Bend は超並列ハードウェア上で実行され、HVM2 ベースのランタイム サポートを提供します。
プロジェクトの主な貢献者である Victor Taelin はブラジル出身で、X プラットフォーム上の Bend の主な機能と開発アイデアを共有しました。
まず第一に、Bend は最新の機械学習アルゴリズムには適していません。これらのアルゴリズムは高度に正則化されており (行列乗算)、事前に割り当てられたメモリがあり、通常は優れた CUDA カーネルがすでに記述されているためです。
「実際のアプリケーション」には通常、専用の GPU コアを作成する予算がないため、Bend の大きな利点は実用的なアプリケーションにあります。質問ですが、誰が CUDA で Web サイトを作成しましたか?たとえ誰かがそれを実行したとしても、次の理由から実行不可能です。
1. 実際のアプリケーションはさまざまなライブラリから関数をインポートする必要があり、それらの関数用の CUDA カーネルを作成する方法がありません。動的関数とクロージャがある
3. 実際のアプリケーションは、大量のメモリを動的かつ予測不可能に割り当てます。
Bend はいくつかの新しい試みを完了しており、場合によっては非常に高速になる可能性がありますが、現時点では大規模な言語モデルを記述することは間違いなく不可能です。
著者は、JSON の割り当てと操作を伴うバイトニック ソートに同じアルゴリズム ツリーを使用して、古い方法と新しい方法を比較しました。 Node.js は 3.5 秒 (Apple M3 Max)、Bend は 0.5 秒 (NVIDIA RTX 4090) です。
はい、現在、Bend が単一コアで Node.js に勝つには GPU 全体が必要です。しかし一方で、大企業 (Google) が 16 年間にわたって最適化を続けてきた JIT コンパイラーと比べると、これはまだ初期段階の新しいアプローチです。将来には多くの可能性があります。
使い方
まず、Rustをインストールします。 C ランタイムを使用する場合は、C コンパイラ (GCC や Clang など) をインストールします。CUDA ランタイムを使用する場合は、CUDA ツールキット (CUDA および nvcc) バージョン 12.x をインストールします。現在、Bend は Nvidia GPU のみをサポートしています。
次に、HVM2 と Bend をインストールします:
cargo +nightly install hvmcargo +nightly install bend-lang
bend run<file.bend> # uses the Rust interpreter (sequential)bend run-c<file.bend> # uses the C interpreter (parallel)bend run-cu <file.bend> # uses the CUDA interpreter (massively parallel)
Bend での並列プログラミング
Bend で並列実行できるプログラムの例を次に示します。たとえば、式
(((1 + 2) + 3) + 4)
((1 + 2) + (3 + 4))
より完全なコード例を見てみましょう:
# Sorting Network = just rotate trees!def sort (d, s, tree):switch d:case 0:return treecase _:(x,y) = treelft = sort (d-1, 0, x)rgt = sort (d-1, 1, y)return rots (d, s, lft, rgt)# Rotates sub-trees (Blue/Green Box)def rots (d, s, tree):switch d:case 0:return treecase _:(x,y) = treereturn down (d, s, warp (d-1, s, x, y))(...)
该文件实现了具有不可变树旋转的双调排序器。它不是很多人期望的在 GPU 上快速运行的算法。然而,由于它使用本质上并行的分治方法,因此 Bend 会以多线程方式运行它。一些速度基准:
不执行任何操作即可实现 57 倍的加速。没有线程产生,没有锁、互斥锁的显式管理。我们只是要求 Bend 在 RTX 上运行我们的程序,就这么简单。
Bend 不限于特定范例,例如张量或矩阵。任何的并发系统,从着色器到类 Erlang 的 actor 模型都可以在 Bend 上进行模拟。例如,要实时渲染图像,我们可以简单地在每个帧上分配一个不可变的树:
# given a shader, returns a square imagedef 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 / 2color = shader (i % width, i /width)return color# given a position, returns a color# for this demo, it just busy loopsdef demo_shader (x, y):bend i = 0:when i < 5000:color = fork (i + 1)else:color = 0x000001return color# renders a 256x256 image using demo_shaderdef main:return render (16, demo_shader)
它确实会起作用,即使涉及的算法在 Bend 上也能很好地并行。长距离通信通过全局 beta 缩减(根据交互演算)执行,并通过 HVM2 的原子链接器正确有效地同步。
最后,作者表示 Bend 现在仅仅是第一个版本,还没有在合适的编译器上投入太多精力。大家可以预期未来每个版本的原始性能都会大幅提高。而现在,我们已经可以使用解释器,从 Python 高级语言的角度一睹大规模并行编程的样子了。
以上が最初の GPU 高水準言語、大規模並列処理は Python を書くのに似ており、8500 個の星を獲得しましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。