Computerprozessoren werden heutzutage nicht mehr mit jeder neue Generation
schneller und schneller. Stattdessen konzentrieren sich die Chiphersteller
darauf mehr Prozessorkerne in unsere Rechner einzubauen. Für die
Softwareentwicklung bedeutet dies dass Software nicht mehr automatisch mit
jeder Prozessorgeneration schneller läuft sondern dass die Entwickler
dafür etwas tun müssen.
Ein Zauberwort heißt daher parallele Programmierung. Damit ist gemeint
dass verschiedene Teile eines Programms gleichzeitg ablaufen können, somit
mehrere Prozessorkerne auslasten und im Endeffekt schneller an‘s Ziel
kommen. Die automatische Parallelisierung von Software ist allerdings
immer noch ein Traum; stattdessen muss Parallelität von Hand in die Software
eingebaut werden. Funktionale Programmierung eignet sich hervorragend zur
parallelen Programmierung, insbesondere weil funktionale Programme
diszipliniert und sparsam mit Seiteneffekten umgehen und damit ein großes
Hindernis für Parallelität von Grund auf vermeiden.
Dieser Artikel demonstriert, wie man in der funktionalen Sprache
Haskell sehr einfach und elegant parallele Programme
schreiben kann. Dazu stelle ich eine Haskell-Bibliothek vor, die Parallelität
ermöglicht ohne dabei auf ein deterministisches Programmverhalten zu verzichten.
Das bedeutet dass ein mit der Bibliothek entwickeltes paralleles Programm
garantiert dasselbe Ergebnis liefert, egal ob es auf einem, zwei oder 32
Prozessorkernen läuft (sofern das Programm keine anderen, nicht-deterministischen
Teile enthält).
In anderen Sprachen ist im Gegensatz dazu Parallelität häufig nicht-deterministisch.
Damit werden Programme deutlicher schwerer zu debuggen,
da sie beispielsweise auf einem Kern wunderbar funktionieren, auf zwei Kernen aber
das falsche Ergenbis berechnen und es auf vier Kernen hin und wieder
zu einem Deadlock kommt.
Als kleine Vorausblick hier der Speedup in Relation zur Anzahl der Kerne,
den wir mit Parallelität in Haskell
durch eine sehr einfache Modifikation eines ursprünglich sequentiellen Programms
erzielen können:
</img>
Zum Verständnis des Artikels sind Grundkenntnisse in Haskell sowie Bekanntschaft
mit der do-Notation hilfreich.
Weiterlesen...