Futhark ist eine rein funktionale, datenparallele Array-Programmiersprache, die an der Universität Kopenhagen (UCPH) im Projekt HIPERFIT entwickelt wurde. Sie gehört zur ML-Familie und übersetzt hochsprachliche Array-Programme in effizienten parallelen Code für GPUs (OpenCL, CUDA) und CPUs.
Erste Schritte
Ein Futhark-Programm (Endung .fut) besteht aus let-Bindungen und einer main-Funktion:
let double (x: i32) : i32 = x * 2
let main (xs: []i32) : []i32 = map double xs
Typische Typen sind i32, i64, f32, f64, bool sowie Arrays mit [] (z.B. []i32) und Tupel.
Die wichtigsten Kommandos
futhark repl // interaktive REPL zum Ausprobieren
futhark c program.fut // sequenzieller C-Code (CPU, zum Testen)
futhark opencl program.fut // GPU-Code ueber OpenCL
futhark cuda program.fut // GPU-Code ueber CUDA
futhark py program.fut // Python-Erweiterungsmodul
futhark bench program.fut // Benchmark gegen C-Referenz
futhark test program.fut // Tests ausfuehren
futhark dev // Entwickler-/Debug-Backend
Die kompilierten Backends erzeugen lauffähige Programme, die aus anderen Sprachen (C, Python, Rust) eingebunden werden können.
Datenparallele Kernoperationen (SOACs)
map— elementweise Abbildung (entsprichtparallel for).reduce— parallele Faltung, z.B.reduce (+) 0 xsfür die Summe.scan— parallele Präfixsumme.map2,zip,filter,partition— weitere Array-Operationen.- Verschachtelte Parallelität wird automatisch flach transformiert (Flattening) und auf die GPU-Einheiten verteilt.
Dank der reinen Funktionalität (keine Seiteneffekte) kann der Compiler Speicherzugriffe frei umordnen und dadurch hohe Auslastung der GPU-Kerne erreichen. Die Sprache ist Open Source (ISC-Lizenz) und unter futhark-lang.org dokumentiert.
Verwandte Grundlagen
Futhark ergänzt die Familie der Array-Sprachen: APL-Befehle, Q-Befehle, BQN-Befehle, Ivy-Befehle. Von der ML-Tradition her ist OCaml-Befehle verwandt, für GPU-nahe Arbeit auch WebGPU-Befehle.