Проект Bend развивает язык для параллельных вычислений с привлечением GPU

Опубликованы первые выпуски проекта Bend, развивающего высокоуровневый язык программирования для параллельных вычислений, который позиционируется как альтернатива низкоуровневыми языкам, таким как CUDA и Metal, обладающая выразительным синтаксисом и возможностями для повышения удобства разработки, свойственными таким языкам, как Python и Haskell. Код проекта написан на языке Rust и распространяется под лицензией Apache 2.0.

Из возможностей языка Bend отмечается быстрое ведение объектов, возможность использования функций высшего порядка, замыканий, продолжений, неограниченной рекурсии, сопоставления с образцом, рекурсивных сопоставлений (fold) и циклов (bend), целочисленных, строковых и списочных типов. Поддерживается два варианта синтаксиса — в стиле Python и
Haskell. В программах не требуется указание управляющих распаралелливанием аннотаций, явного создания потоков и выставления блокировок. Распараллеливание производится автоматически, например, при вычислении выражения «((1 + 2) + (3 + 4))», операции «1 + 2» и «3 + 4» будут выполнены одновременно на разных вычислительных ядрах.

Программы на языке Bend могут выполняться на оборудовании, обеспечивающем массовый пареллелизм, например, на GPU, демонстрируя практически линейный рост производительности в зависимости от числа вычислительных ядер. Код на языке Bend компилируется в низкоуровневое промежуточное представление HVM2 (Higher-order Virtual Machine 2), которое затем компилируется в представление на C и CUDA. В настоящее время проектом поддерживается только выполнение на GPU NVIDIA.

Что касается производительности, то тестовое приложение с реализацией битонной сортировки, при выполнении в одном потоке CPU Apple M3 Max было выполнено за 12.15 сек., при задействовании 16 потоков — за 0.96 сек., а при привлечении GPU NVIDIA RTX 4090 с 16k потоками — за 0.21 сек.


   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))
   ...

Источник: http://www.opennet.ru/opennews/art.shtml?num=61224