Se han publicado los primeros lanzamientos del proyecto Bend, que desarrolla un lenguaje de programación de alto nivel para cálculos paralelos, posicionado como una alternativa a lenguajes de bajo nivel como CUDA y Metal, con una sintaxis expresiva y características que mejoran la comodidad de desarrollo, propias de lenguajes como Python y Haskell. El código del proyecto está escrito en Rust y se distribuye bajo la licencia Apache 2.0.
Entre las características del lenguaje Bend se destacan la rápida distribución de objetos, la capacidad de utilizar funciones de orden superior, cierres, continuaciones, recursión ilimitada, coincidencia de patrones, coincidencias recursivas (fold) y ciclos (bend), así como tipos enteros, de cadenas y de listas. Se soportan dos variantes de sintaxis: al estilo de Python y al estilo de Haskell. En los programas no se requiere especificar anotaciones de paralelización, creación explícita de hilos o manejo de bloqueos. La paralelización se realiza automáticamente, por ejemplo, al calcular la expresión «((1 + 2) + (3 + 4))», las operaciones «1 + 2» y «3 + 4» se ejecutarán en paralelo.
Los programas escritos en el lenguaje Bend pueden ejecutarse en hardware que proporciona paralelismo masivo, como en GPU, demostrando un aumento prácticamente lineal en el rendimiento dependiendo del número de núcleos de cálculo. El código en lenguaje Bend se compila en una representación intermedia de bajo nivel HVM2 (Higher-order Virtual Machine 2), que luego se compila en representación C y CUDA. Actualmente, el proyecto solo soporta la ejecución en GPUs NVIDIA.
En cuanto al rendimiento, una aplicación de prueba con la implementación de ordenación bitonal, al ejecutarse en un solo hilo en la CPU Apple M3 Max, se completó en 12.15 segundos, utilizando 16 hilos en 0.96 segundos, y al emplear la GPU NVIDIA RTX 4090 con 16k hilos, se completó en 0.21 segundos.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)) …
Fuente: opennet.ru
