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 (entspricht parallel for).
  • reduce — parallele Faltung, z.B. reduce (+) 0 xs fü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.