Futhark — это многопарадигмальный , высокоуровневый , функциональный язык программирования с параллельными данными и массивами . Это диалект языка ML , первоначально разработанный на факультете компьютерных наук UCPH (DIKU) в рамках проекта HIPERFIT. [2] Основное внимание уделяется обеспечению возможности выполнения параллельных программ, написанных в функциональном стиле, с высокой производительностью на аппаратном обеспечении с массовым параллелизмом , особенно на графических процессорах (GPU). Futhark сильно вдохновлен NESL , и его реализация использует вариант сглаживающего преобразования , но накладывает ограничения на то, как может быть выражен параллелизм, чтобы обеспечить более агрессивную оптимизацию компилятора. В частности, не поддерживается нерегулярный параллелизм вложенных данных. [3] Это бесплатное программное обеспечение с открытым исходным кодом, распространяемое по лицензии ISC .
Futhark — это язык семейства ML с нечувствительным к отступам синтаксисом, полученным из OCaml , Standard ML и Haskell . Система типов основана на системе типов Хиндли-Милнера с различными расширениями, такими как типы уникальности и типы, зависящие от размера . Futhark не задуман как язык программирования общего назначения для написания полноценных приложений, а вместо этого ориентирован на написание вычислительных ядер (не всегда таких же, как ядро графического процессора ), которые затем вызываются из приложений, написанных на обычных языках. [4]
Футарк назван в честь первых шести букв рунического алфавита . [5] : 2
Следующая программа вычисляет скалярное произведение двух векторов, содержащих числа двойной точности.
def dotprod xs ys = f64 . сумма ( map2 ( * ) xs ys ))
Его также можно эквивалентно записать с явными аннотациями типов следующим образом.
def dotprod [ n ] ( xs : [ n ] f64 ) ( ys : [ n ] f64 ) : f64 = f64 . сумма ( map2 ( * ) xs ys ))
Это делает типы, зависящие от размера, явными: эту функцию можно вызвать только с двумя массивами одинакового размера, и средство проверки типов отклонит любую программу, в которой это не может быть определено статически.
Следующая программа выполняет умножение матриц , используя приведенное выше определение скалярного произведения.
def matmul [ n ][ m ][ p ] ( A : [ n ][ m ] f64 ) ( B : [ m ][ p ] f64 ) : [ n ][ p ] f64 = карта ( \ A_row -> карта ( \ B_col -> dotprod A_row B_col ) ( транспонировать B )) A
Это показывает, как типы обеспечивают вызов функции только с матрицами совместимого размера. Кроме того, это пример вложенного параллелизма данных .
Разработано в DIKU