Die ersten Ausgaben des Projekts Bend wurden veröffentlicht, das eine hochgradige Programmiersprache für parallele Berechnungen entwickelt. Diese wird als Alternative zu niedriggradigen Sprachen wie CUDA und Metal positioniert und bietet einen ausdrucksvollen Syntax sowie Funktionen, die die Entwicklung erleichtern, ähnlich wie bei Sprachen wie Python und Haskell. Der Code des Projekts ist in Rust geschrieben und wird unter der Apache 2.0 Lizenz verbreitet.
Zu den Funktionen der Sprache Bend gehören die schnelle Verteilung von Objekten, die Verwendung von höherwertigen Funktionen, Closures, Continuations, unbegrenzte Rekursion, Musterabgleich, rekursive Musterabgleichsfunktionen (fold) und Schleifen (bend), sowie die Unterstützung von Ganzzahlen, Zeichenfolgen und Listentypen. Es gibt zwei Syntaxvarianten – im Python-Stil und im Haskell-Stil. In Programmen ist es nicht erforderlich, Annotations für die Parallelisierung anzugeben, explizit Threads zu erstellen oder Sperren zu setzen. Die Parallelisierung erfolgt automatisch, zum Beispiel bei der Berechnung des Ausdrucks „((1 + 2) + (3 + 4))“, wo die Operationen „1 + 2“ und „3 + 4“ parallel ausgeführt werden.
Programme in der Sprache Bend können auf Hardware ausgeführt werden, die massiven Parallelismus ermöglicht, wie beispielsweise GPUs, und zeigen nahezu lineares Wachstum der Leistung in Abhängigkeit von der Anzahl der Rechenkerne. Der Code in der Sprache Bend wird in eine niedrigstufige Intermediärdarstellung HVM2 (Higher-order Virtual Machine 2) kompiliert, die dann in die Darstellung auf C und CUDA übersetzt wird. Derzeit unterstützt das Projekt nur die Ausführung auf NVIDIA-GPUs.
Was die Leistung betrifft, so wurde eine Testanwendung mit einer Implementierung der Bitonsortierung auf einer einzigen CPU-Instanz des Apple M3 Max in 12,15 Sekunden ausgeführt. Mit 16 Threads benötigte die Ausführung nur 0,96 Sekunden, während der Einsatz der NVIDIA RTX 4090 mit 16.000 Threads die Ausführung auf 0,21 Sekunden reduzierte. 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)) …
Quelle: opennet.ru
