Nach fast 10 Jahren unermüdlicher Bemühungen und eingehender Forschung im Kern der Informatik haben die Menschen endlich einen Traum verwirklicht: die Ausführung von Hochsprachen auf GPUs.
Am vergangenen Wochenende löste eine Programmiersprache namens Bend heftige Diskussionen in der Open-Source-Community aus und die Anzahl der Sterne auf GitHub hat 8.500 überschritten.
GitHub: https://github.com/HigherOrderCO/Bend
Als massiv parallele Programmiersprache auf hoher Ebene befindet sie sich noch im Forschungsstadium, aber die vorgeschlagenen Ideen haben bereits Menschen hervorgebracht fühle mich sehr ... überrascht. Mit Bend können Sie parallelen Code für Multi-Core-CPUs/GPUs schreiben, ohne ein C/CUDA-Experte mit 10 Jahren Erfahrung sein zu müssen, es fühlt sich einfach wie Python an!
Ja, Bend verwendet Python-Syntax.
Bend ist ein Programmierparadigma, das ausdrucksstarke Sprachen wie Python und Haskell unterstützt. Es unterscheidet sich von Low-Level-Alternativen wie CUDA und Metal. Bend bietet eine schnelle Objektzuweisung, vollständige Schließungsunterstützung für Funktionen höherer Ordnung, unbegrenzte Rekursion und eine nahezu lineare Beschleunigung basierend auf der Kernanzahl. Bend läuft auf massiv paralleler Hardware und bietet HVM2-basierte Laufzeitunterstützung.
Der Hauptmitwirkende des Projekts, Victor Taelin, kommt aus Brasilien. Er teilte die wichtigsten Funktionen und Entwicklungsideen von Bend auf der X-Plattform.
Erstens ist Bend nicht für moderne Algorithmen für maschinelles Lernen geeignet, da diese Algorithmen stark reguliert sind (Matrixmultiplikation) und über vorab zugewiesenen Speicher verfügen und in der Regel bereits gute CUDA-Kernel geschrieben sind.
Der große Vorteil von Bend liegt in praktischen Anwendungen, da „echte Anwendungen“ normalerweise nicht über das Budget verfügen, um dedizierte GPU-Kerne herzustellen. Frage: Wer hat die Website in CUDA erstellt? Und selbst wenn es jemand tun würde, wäre es unmöglich, weil:
1 Eine echte Anwendung müsste Funktionen aus vielen verschiedenen Bibliotheken importieren und es gibt keine Möglichkeit, CUDA-Kernel für sie zu schreiben;
2 haben dynamische Funktionen und Abschlüsse;
3 Echte Anwendungen weisen dynamisch und unvorhersehbar große Mengen an Speicher zu.
Bend hat einige neue Versuche abgeschlossen und kann in einigen Fällen recht schnell sein, aber es ist jetzt definitiv nicht möglich, große Sprachmodelle zu schreiben.
Der Autor verglich die alte Methode mit der neuen Methode und verwendete denselben Algorithmusbaum für die bitonische Sortierung, einschließlich JSON-Zuweisung und -Operationen. Node.js beträgt 3,5 Sekunden (Apple M3 Max) und Bend beträgt 0,5 Sekunden (NVIDIA RTX 4090).
Ja, derzeit benötigt Bend eine ganze GPU, um Node.js auf einem einzelnen Kern zu schlagen. Andererseits ist dies jedoch noch ein neuer Ansatz im Entstehen begriffen im Vergleich zu einem JIT-Compiler, den ein großes Unternehmen (Google) seit 16 Jahren optimiert. Es gibt viele Möglichkeiten für die Zukunft.
Auf GitHub stellt der Autor kurz den Nutzungsprozess von Bend vor.
Installieren Sie zunächst Rust. Wenn Sie die C-Laufzeit verwenden möchten, installieren Sie einen C-Compiler (z. B. GCC oder Clang). Wenn Sie die CUDA-Laufzeit verwenden möchten, installieren Sie das CUDA-Toolkit (CUDA und nvcc) Version 12.x. Bend unterstützt derzeit nur Nvidia-GPUs.
Dann installieren Sie HVM2 und Bend:
cargo +nightly install hvmcargo +nightly install bend-lang
Schreiben Sie abschließend einige Bend-Dateien und führen Sie es mit einem der folgenden Befehle aus:
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)
Sie können auch Gen-C und Gen verwenden -cu Kompilieren Sie Bend für die beste Leistung in eigenständige C/CUDA-Dateien. Aber gen-c und gen-cu stecken noch in den Kinderschuhen und sind weitaus weniger ausgereift als SOTA-Compiler wie GCC und GHC.
Parallele Programmierung in Bend
Hier finden Sie Beispiele für Programme, die in Bend parallel ausgeführt werden können. Beispielsweise kann der Ausdruck:
(((1 + 2) + 3) + 4)
nicht parallel ausgeführt werden, da + 4 von + 3 abhängt, was wiederum von (1+2) abhängt. Und der Ausdruck:
((1 + 2) + (3 + 4))
kann parallel ausgeführt werden, da (1+2) und (3+4) unabhängig sind. Die Voraussetzung dafür, dass Bend parallel ausgeführt werden kann, ist die Einhaltung der Parallellogik.
Sehen wir uns ein vollständigeres Codebeispiel an:
# 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 高级语言的角度一睹大规模并行编程的样子了。
Das obige ist der detaillierte Inhalt vonDie erste GPU-Hochsprache, massive Parallelität ist wie das Schreiben von Python, hat 8500 Sterne erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!