Sono stati pubblicati i primi rilasci del progetto Bend, che sviluppa un linguaggio di programmazione di alto livello per il calcolo parallelo, posizionato come alternativa ai linguaggi di basso livello come CUDA e Metal, con una sintassi espressiva e funzionalità per migliorare la comodità di sviluppo, tipiche di linguaggi come Python e Haskell. Il codice del progetto è scritto in Rust e distribuito con licenza Apache 2.0.
Tra le funzionalità del linguaggio Bend si segnalano la rapida distribuzione degli oggetti, la possibilità di utilizzare funzioni di ordine superiore, chiusure, continuazioni, ricorsione illimitata, abbinamento dei modelli, abbinamenti ricorsivi (fold) e cicli (bend), oltre a tipi interi, stringhe e liste. Sono supportate due varianti di sintassi: in stile Python e in stile Haskell. Nei programmi non è necessario specificare annotazioni di parallelizzazione, creazione esplicita di thread o gestione dei blocchi. La parallelizzazione avviene automaticamente, ad esempio, nel calcolo dell'espressione «((1 + 2) + (3 + 4))», le operazioni «1 + 2» e «3 + 4» verranno eseguite in parallelo.
I programmi scritti in Bend possono essere eseguiti su hardware che offre parallelismo massiccio, ad esempio su GPU, mostrando un incremento praticamente lineare delle prestazioni in base al numero di unità di calcolo. Il codice in Bend viene compilato in una rappresentazione intermedia a basso livello HVM2 (Higher-order Virtual Machine 2), che viene poi compilata nella rappresentazione in C e CUDA. Attualmente, il progetto supporta solo l'esecuzione su GPU NVIDIA.
Per quanto riguarda le prestazioni, un'applicazione di test con implementazione di ordinamento bitonale, eseguita su un singolo thread della CPU Apple M3 Max, è stata completata in 12,15 secondi, utilizzando 16 thread è stata completata in 0,96 secondi, mentre con la GPU NVIDIA RTX 4090 con 16k thread è stata completata in 0,21 secondi. 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)) …
Fonte: opennet.ru
