Les premières publications du projet Bend, qui développe un langage de programmation de haut niveau pour le calcul parallèle, se positionnent comme une alternative aux langages de bas niveau tels que CUDA et Metal, avec une syntaxe expressive et des fonctionnalités améliorant la commodité de développement, caractéristiques de langages comme Python et Haskell. Le code du projet est écrit en Rust et est distribué sous la licence Apache 2.0.
Parmi les fonctionnalités du langage Bend, on note la distribution rapide d'objets, la possibilité d'utiliser des fonctions d'ordre supérieur, des fermetures, des continuations, une récursion illimitée, des correspondances de motifs, des correspondances récursives (fold) et des boucles (bend), ainsi que des types entiers, de chaînes et de listes. Deux variantes de syntaxe sont supportées : dans le style Python et dans le style Haskell. Il n'est pas nécessaire de spécifier des annotations de parallélisme dans les programmes, de créer explicitement des threads ou de mettre en place des verrous. Le parallélisme est effectué automatiquement, par exemple, lors du calcul de l'expression «((1 + 2) + (3 + 4))», les opérations «1 + 2» et «3 + 4» seront effectuées en parallèle.
Les programmes écrits en Bend peuvent s'exécuter sur du matériel permettant un parallélisme massif, comme les GPU, montrant une augmentation de performance pratiquement linéaire en fonction du nombre de cœurs de calcul. Le code en Bend se compile en une représentation intermédiaire de bas niveau HVM2 (Higher-order Virtual Machine 2), qui est ensuite compilée en représentation sur C et CUDA. Actuellement, le projet ne prend en charge que l'exécution sur les GPU NVIDIA.
En ce qui concerne les performances, une application de test avec une implémentation de tri binaire a été exécutée en 12,15 secondes sur un seul thread du CPU Apple M3 Max, en 0,96 seconde en utilisant 16 threads, et en 0,21 seconde en utilisant le GPU NVIDIA RTX 4090 avec 16k threads.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)) …
Source : opennet.ru
