Futhark是一個函數式數據並列陣列程式語言,最初於哥本哈根大學理學院電腦科學系英語UCPH Department of Computer Science(DIKU)作為HIPERFIT(財務資訊科技的函數式高效能計算)計劃的一部份而開發[2]。它聚焦於確使以函數式風格書寫的數據並列程式,可以高效能的執行於大規模並列硬件上,特別是在GPU上。Futhark強烈的受到NESL英語NESL啟發,但是為了確使更具進取性的編譯器最佳化,對如何表達並列施加了約束。特別是,不支援非正規的巢狀數據並列[3]

Futhark
編程範型陣列式, 函數式
語言家族ML
設計者Troels Henriksen, Cosmin Oancea, Martin Elsman
釋出時間2014年,​10年前​(2014
目前版本
  • 0.25.23(2024年10月15日;穩定版本)[1]
編輯維基數據連結
型態系統靜態, 強型別
作業系統跨平台
許可證ISC許可證
網站https://futhark-lang.org
啟發語言
APL, Haskell, NESL英語NESL, Standard ML

概述

編輯

Futhark是屬於ML家族的語言,它具有從OCamlStandard MLHaskell衍生的縮排不敏感的語法。型別系統基於了Hindley–Milner型別系統英語Hindley–Milner type system,還並具有各種擴充,比如唯一類型英語Uniqueness type大小依值型別。Futhark不意圖成為編寫完全應用的通用程式語言,轉而聚焦於書寫計算「內核」(不必定相同於GPU內核),它們由用常規語言書寫的應用程式來呼叫[4]

例子

編輯

點積

編輯

下列程式計算包含雙精度數值的兩個向量的點積

def dotprod xs ys = f64.sum (map2 (*) xs ys))

它還可以等價的書寫為具有顯式類型標註的形式:

def dotprod [n] (xs: [n]f64) (ys: [n]f64) : f64 = f64.sum (map2 (*) xs ys))

這製作出了大小依值型別,即這個函數只能以相同大小的兩個陣列來呼叫,型別檢查器會拒絕不能靜態的確定符合這個要求的任何程式。

矩陣乘法

編輯

下列程式使用上述點積定義進行矩陣乘法

def matmul [n][m][p] (A: [n][m]f64) (B: [m][p]f64) : [n][p]f64 =
  map (\A_row ->
         map (\B_col -> dotprod A_row B_col)
             (transpose B))
      A

注意它的類型強制這個函數只能以具有相容大小的矩陣來呼叫。進一步的說,這是巢狀數據並列的例子。

參照

編輯
  1. ^ Release 0.25.23. 2024年10月15日 [2024年10月21日]. 
  2. ^ 存档副本. [2022-05-12]. (原始內容存檔於2014-10-22). 
  3. ^ Henriksen, Troels; Serup, Niels G. W.; Elsman, Martin; Henglein, Fritz; Oancea, Cosmin. Futhark: Purely Functional GPU-Programming with Nested Parallelism and In-Place Array Updates (PDF). Proceedings of the 38th ACM SIGPLAN Conference on Programming Language Design and Implementation. PLDI 2017. ACM. 2017 [2021-02-28]. (原始內容 (PDF)存檔於2020-09-20). 
  4. ^ Parallel Programming in Futhark — Interoperability. [2023-10-01]. (原始內容存檔於2023-03-30).