Futhark は、マルチパラダイム、高レベル、関数型、データ並列、配列プログラミング言語です。これは、もともとUCPH コンピュータサイエンス学科(DIKU)でHIPERFIT プロジェクトの一環として開発されたML言語の方言です。 [ 2 ]関数型スタイルで記述されたデータ並列プログラムを、特にグラフィックス処理ユニット(GPU) などの大規模並列ハードウェアで高性能に実行できるようにすることに重点を置いています。Futhark はNESLに強く影響を受けており、その実装ではフラット化変換の変種を使用していますが、より積極的なコンパイラ最適化を可能にするために並列性の表現方法に制約を課しています。特に、不規則なネストされたデータ並列性はサポートされていません。[ 3 ]これは、ISC ライセンスの下でリリースされたフリーでオープンソースのソフトウェアです。
Futhark はMLファミリーの言語で、 OCaml、Standard ML、Haskellから派生したインデントに依存しない構文を持っています。型システムは、一意性型やサイズ依存型など、さまざまな拡張機能を備えたHindley–Milner 型システムに基づいています。Futhark は、完全なアプリケーションを作成するための汎用プログラミング言語として意図されているのではなく、従来の言語で書かれたアプリケーションから呼び出される計算カーネル(必ずしもGPU カーネルと同じではない) の作成に重点を置いています。[ 4 ]
フサルクはルーン文字の最初の6文字にちなんで名付けられました。[ 5 ]: 2
以下のプログラムは、倍精度浮動小数点数を含む2つのベクトルの内積を計算します。
def dotprod xs ys = f64 . sum ( map2 ( * ) xs ys ))また、明示的な型注釈を用いて以下のように記述することもできます。
def dotprod [ n ] ( xs : [ n ] f64 ) ( ys : [ n ] f64 ) : f64 = f64 . sum ( map2 ( * ) xs ys ))これにより、サイズに依存する型が明確になります。この関数は同じサイズの2つの配列でのみ呼び出すことができ、これが静的に判断できないプログラムは型チェッカーによって拒否されます。
以下のプログラムは、上記のドット積の定義を用いて行列の乗算を実行します。
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これは、型によって関数が互換性のあるサイズの行列でのみ呼び出されるように強制される仕組みを示しています。また、これはネストされたデータ並列処理の一例でもあります。
DIKU
で開発