Parallele Funktionale Programmierung

Diese Seite fasst Information zum Erstellen und Ausführen paralleler funktionaler Programme zusammen. Dies betrifft insbesondere Übung 5 im Kurs Funktionale Programmierung, SS 09.

Erstellen paralleler Programme

Dieses Thema ist auf den Folien zu paralleler funktionaler Programmierung behandelt, die auf folgendem Tutorial beruhen: "A Tutorial on Parallel and Concurrent Programming in Haskell", by S.L. Peyton Jones, S. Singh. Konkret werden 3 Arten von Parallelität vorgestellt:

Die Beispielsprogramme in STM.hs der Vorlesung, decken semi-explizite Parallelität (siehe pfib) und explizite Parallelität mittels STM (siehe deposit,withdraw) ab. Die Übungen auf Blatt 5 behandeln ebenfalls diese beiden Konzepte.

Maschine

Als parallele Maschinen können die Maschinen im CIP Pool (2 cores) oder siena.tcs.ifi.lmu.de im TCS Netz (16 cores), genutzt werden. Als account auf siena steht afp_guest zur Verfügung. Das mittels cesar-cipher verschlüsselte P******t ist fiafshji kzshyntsfq uwtlwfrrnsl.

Setup

Für die Übungen auf Blatt 5 muss mindestens ghc-6.10 verwendet werden.

CIP Pool

Die Maschinen im CIP Pool sind dual-core Maschinen und daher für ein (minimales) paralleles Setup geeignet. Allerdings muss ghc-6.10 zur Compilierung verwendet werden, der in /home/h/hwloidl/gnu/bin installiert ist. D.h. entweder den Compiler immer mit dem vollen Namen aufrufen, oder den Pfad folgendermaßen erweitern:

 export PATH=/home/h/hwloidl/gnu/bin:$PATH

Um zu checken, dass man die korrekte Version benutzt, ghc --version aufrufen. Dies sollte folgendes liefern:

# ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.10.3

TCS Multi-core Rechner

Im TCS Netz ist eine 16-core Maschine verfügbar: siena. Allerdings muss ghc-6.10 zur Compilierung verwendet werden, der in /usr/local/bin installiert ist. D.h. entweder den Compiler immer mit dem vollen Namen aufrufen, oder den Pfad folgendermaßen erweitern:

 export PATH=/usr/local/bin:$PATH

Um zu checken, dass man die korrekte Version benutzt, ghc --version aufrufen. Dies sollte folgendes liefern:

# ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.10.1

Compilierung

Siehe die Sektion Using SMP Parallelism im GHC User's Guide.

Zur Compilierung eines Programms in STM.hs folgende Zeile verwenden:

# ghc --make -threaded STM.hs
Dazu muss Main.hs eine Funktion main enthalten, die dann mittels
./STM 5 39 11 +RTS -N4 -s 
ausgeführt wird. Die Argumente 5 39 11 müssen vom Haskell Programm verarbeitet werden. Die Laufzeitsystem-Option -N4 spezifiziert eine Ausführung auf 4 Prozessoren. Die Laufzeitsystem-Option -s druckt nach Beendigung des Programmes eine Statistik, insbesondere mit der Laufzeit, in folgendem Format:
  Task  0 (worker) :  ...
  ...
  INIT  time    0.00s  (  0.00s elapsed)
  MUT   time   14.59s  (  3.93s elapsed)
  GC    time    0.71s  (  0.76s elapsed)
  EXIT  time    0.00s  (  0.00s elapsed)
  Total time   15.30s  (  4.70s elapsed)  <---------------

  %GC time       4.6%  (16.2% elapsed)
  ...
Zum Vergleich der Laufzeiten der (parallelen) Versionen ist die Total time (elapsed), also die wall-clock time der Auführung, entscheidend. Diese sollte für parallele Programme deutlich geringer sein, als für die sequentielle Version. Für unser Beispiel ist die sequentielle Laufzeit:
 ./STM 5 39 11 +RTS -N1 -s
...
  Total time   16.06s  ( 16.10s elapsed)
d.h. wir haben einen speed-up von 16.10/4.70 = 3.43.
Hans-Wolfgang Loidl
Last modified: Tue Jun 16 13:55:10 2009 Stardate: [-28]1407.48