Mit Virtuellen Maschinen
PD Stefan Bosse
Universität Bremen - FB Mathematik und Informatik
PD Stefan Bosse - VPP - Parallele Programmierung ::
Grundlagen der parallelen Programmierung
Unterscheidung zwischen Parallelisierung im Daten- und Kontrollfluss von Programmen
Prozessmodelle und Prozesskonstruktoren
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Die Verarbeitungseinheiten sind Knoten eines gerichteten Graphens, die Kanten beschreiben den Datenfluss und bilden die Datenpfade. Die Verarbeitungseinheiten müssen aktiviert werden.
Der Kontrollfluss kann durch Zustandsübergangsdiagramme beschrieben werden.
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Programmanweisungen werden Zuständen S1,S2,.. zugeordnet.
Einfache Anweisungen (Berechnungen) werden jeweils einem Zustand, komplexe Anweisungen i.A. mehreren Unterzuständen zugeordnet.
Programm-, Kontroll-, und Datenflussgraphen
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
In vielen Programmen werden dieselben Operationen auf unterschiedliche Elemente einer Datenstruktur angewendet. Im einfachsten Fall sind dies die Elemente eines Feldes.
Wenn die angewendeten Operationen unabhängig voneinander sind, kann diese verfügbare Parallelität dadurch ausgenutzt werden, um die zu manipulierenden Elemente der Datenstruktur auf verschiedene Prozessoren zu verteilen, so dass jeder Prozessor die Operation auf den ihm zugeordneten Elementen ausführt.
Parallelität im Datenpfad → Feine Granularität
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Bei der Datenparallelität wird unterschieden zwischen:
Parallele Ausführung der gleichen Instruktion auf verschiedenen Daten (Vektorparallelität) → Vektoranweisung
Ausführung verschiedener Instruktionen die nur Daten verarbeiten (reine Datenanweisungen, keine Kontrollpfadverzweigungen)
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Zur Ausnutzung der Datenparallelität wurden sequenzielle Programmiersprachen zu datenparallelen Programmiersprachen erweitert. Diese verwenden wie sequenzielle Programmiersprachen einen Kontrollfluß, der aber auch datenparallele Operationen ausführen kann.
Häufig werden Vektoranweisungen deklarativ und nicht prozedural imperativ beschrieben.
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
a(1 : n) = b(0 : n − 1) + c(1 : n) ⇔for (i=1:n) a(i) = b(i-1) + c(i)end
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Datenabhängigkeiten können zwischen der linken und rechten Seite einer Datenzuweisung bestehen, so dass
Daher ist folgende Vektoranweisung nicht in die folgende Schleife sequenziell transformierbar:
a(1 : n) = a(0 : n − 1) + a(2 : n + 1) ≠for (i=1:n) a(i) = a(i-1) + a(i+1)end
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Datenparallelität benötigt i.A. keine weitere Synchronisation
Aber Datenabhängigkeiten können zu einer impliziten oder expliziten Synchronisation führen (z.B. mit Queues)
Durch die Verwendung von Queues (oder allg. Kommunikationskanälen) werden Datenabhängigkeiten über einen Blockierungsmechanismus (Verzögerung) aufgelöst. Es gibt Produzenten und Konsumenten. Der Konsument wird solange blockiert bis der Produzent (i.a. der vorherige Prozess) Daten liefert. Umgekehrt kann ein Produzent verzögert werden wenn ein Konsument noch nicht zur Aufnahme neuer Daten bereit ist.
P1→Q1→P2→Q2→P3…Q(t):t→{⊥d∈DQ
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
Parallelität im Kontrollpfad (Zustandsautomat) auf Instruktions- und Prozessebene → Grobe Granularität je nach Anzahl der Instruktionen pro Prozess (Task)
Gebundene Instruktionsblöcke sind Parallelprozesse (Par Prozesskonstruktor)
Bekannt als Multithreading als Programmier- und Ausführungsmodell (z.B. pthreads)
Instruktionsparallelität benötigt i.A. Synchronisation zwischen den einzelnen Prozessen
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallelisierungsklassen
PD Stefan Bosse - VPP - Parallele Programmierung :: Fluss und Pfadgraphen
Ein Datenpfad beschreibt die Verbindung von Komponenten zur Implementierung des Datenflusses → Strukturbeschreibung
Der Kontrollfluss beschreibt die zustandsbasierte Steuerung einer Berechnung
PD Stefan Bosse - VPP - Parallele Programmierung :: Daten- und Kontrollpfade
Jeder generische Mikroprozessor und i.A. jedes anwendungsspezifische Digitallogiksystem lässt sich in die zwei funktionale Bereiche aufteilen:
PD Stefan Bosse - VPP - Parallele Programmierung :: Daten- und Kontrollpfade
PD Stefan Bosse - VPP - Parallele Programmierung :: Daten- und Kontrollpfade
Der Programmfluss kann in Daten- und Kontrollfluss zerlegt werden, die jeweils im Daten- und Kontrollpfad eines Datenverarbeitungssystems verarbeitet werden.
PD Stefan Bosse - VPP - Parallele Programmierung :: Daten- und Kontrollpfade
Ein (prozedurales/imperatives) Programm besteht aus mindestens einem Daten- und Kontrollpfad (oder Fluss)
Ein Programm ist aus einer Vielzahl von Komponenten zusammengesetzt → Komposition
Komposition von Datenfluss und Datenpfad:
PD Stefan Bosse - VPP - Parallele Programmierung :: Daten- und Kontrollpfade
PD Stefan Bosse - VPP - Parallele Programmierung :: Funktionale Programmierung
Funktionale Programmierung beschreibt grundlegend den Datenpfad. Es gibt keinen Zustand und keinen expliziten Kontrollfluss.
PD Stefan Bosse - VPP - Parallele Programmierung :: Funktionale Komposition
Eine Berechnung setzt sich aus der verschachtelten und verketteten Applikation von Funktionen zusammen, die jeweils aus elementaren Ausdrücken E={ε1,ε2,..} bestehen → Funktionale Komposition F(X)=f1(f2(f3..(X)))
PD Stefan Bosse - VPP - Parallele Programmierung :: Funktionale Komposition
1,2.0,'c',"hello",x,y,z
x+y
(x+1)*(y-1)*z
x < 0
a and b or c
if x < 0 then x+1 else x-1
f(x,y,z)
PD Stefan Bosse - VPP - Parallele Programmierung :: Funktionale Komposition
Entspricht dem mathematischen Modell was auf Funktionen und Ausdrücken gründet mit den Methoden
Zeitliches Modell: unbestimmt (t ↦ 0), Auswertereihenfolge nicht festgelegt
PD Stefan Bosse - VPP - Parallele Programmierung :: Funktionale Komposition
Beispiel für Funktionsdefinition und Applikation
PD Stefan Bosse - VPP - Parallele Programmierung :: Funktionale Komposition von Systemen
Parallelisierung durch Modellierung unterschiedlich detaillierter Datenflussdiagramme, die untereinander einen hierarchischen Zusammenhang aufweisen.
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzielle Komposition
Eine imperative Berechnung setzt sich aus einer Sequenz I=(i1 , i2 , ..) von elementaren Anweisungen A={a1,a2,..} zusammen →
Sequenzielle Komposition i1 ; i2 ; ...
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzielle Komposition
x+1, a*(b-c)*3, x<(a+b), ...
x := a+b
if a < b then x := 0 endwhile x < 100 do x:=x+1 end
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzielle Komposition
Man fasst die Sequenz I als ein imperatives Programm X == Ausführungsvorschrift zusammen.
Die Ausführung des Programms (statisch) bezeichnet man als Prozess (dynamisch)
Ein Prozess befindet sich aktuell immer in einem Zustand σ einer endlichen Menge von Zuständen Σ={σ1 , σ2 , ..}.
Der gesamte Zustandsraum Σ des Prozesses setzt sich aus dem
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzielle Komposition
Der Fortschritt eines sequenziellen Programms bedeutet ein Änderung des Kontroll- und Datenzustandes → Zustandsübergänge
Die Zustandsübergänge können durch ein Zustandsübergangsdiagramm dargestellt werden.
PD Stefan Bosse - VPP - Parallele Programmierung :: Das Prozessmodell
Es werden zwei Prozesstypen unterschieden:
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
START
)RUN
)END
)AWAIT
)BLOCKED
)READY
)PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
PS={START,RUN,END}PS∗={AWAIT,BLOCKED,READY}ps(P)∈PS∪PS∗
Befindet sich der Prozess im Ausführungszustand RUN
(also ausführend), dann werden strikt sequenziell die Instruktionen des Programms I={i1,i2,..,in} ausgeführt.
Dabei ist jede Instruktion eine Anweisung aus der endlichen Anweisungsmenge A={a1,..} der Maschine (z.B. Bytecode Anweisung add(x,y)
).
Ein Wechsel des Ausführungszustandes führt nicht zu einer Änderung der Instruktionsreihenfolge.
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess: Zeitliches Modell
i1:t1↦i2:t2↦i3:t3↦..↦in:tn mitt1<t2<t3<..<tnT=∑iti−ti−1
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
Das Konzept der Prozessblockierung ist elementar für kommunizierende Prozesse
Kommunikation: Lesen und Schreiben von Daten, Ein- und Ausgabe, Netzwerknachrichten, usw.
Befindet sich ein Prozess im Ausführungszustand BLOCKED
wartet dieser auf ein Ereignis:
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
Das Ausführungsmodell von Lua unterstützt die Blockierung des Programmflusses
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
Tatsächlich gibt es in Lua auf programmatischer Ebene aber nur einen einzigen Kontrollfluss und Pfad (eine VM Instanz)!
┌─────────┐ ┌─────────┐
│ │ resume │ │
│ 1 │ ┌────▶│ 4 │
│ 2 │ │ │ 5 │
│ 3 yield ├───┐ │ ┌───┤ 6 yield │
│ 7 │ │ │ │ │ 9 │
│ 8 read ├─┐ │ │ │ │ │
│ │ │ │ │ │ │ │
└────┬────┘ │ │ │ │ └────┬────┘
│ ▼ ▼ │ ▼ │
┌────┴───────────┴──────────┴───────────┐│ LUA VM Instanz │└───────────────────────────────────────┘
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
co1 = coroutine.create(function () for i=1,10 do print("co1", i) coroutine.yield() end end)co2 = coroutine.create(function () for i=1,10 do print("co2", i) coroutine.yield() end end)coroutine.resume(co1)coroutine.resume(co2)...
PD Stefan Bosse - VPP - Parallele Programmierung :: Sequenzieller Prozess
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallele Prozesse
Ausgangspunkt sind sequenzielle Prozesse
Ein sequenzieller Prozess Ps besteht aus einer Sequenz von Anweisungen I=(i1 ; i2 ;..) (Berechnungen), die schrittweise und nacheinander ausgeführt werden: Ps=P(i1 ; i2 ; .. ; in) ⇒ p1 ↦ p2 ↦ .. ↦ pn
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallele Komposition
Datenverarbeitungssystem als paralleler Prozess kann aus einer Vielzahl nebenläufig ausgeführter Prozesse P={P1, P2, P3,...} bestehen
Parallele Komposition P=P1 ∥ P2 ∥ P3 ∥ ..
PD Stefan Bosse - VPP - Parallele Programmierung :: Paralleler Prozess
P=(P1∥P2∥..∥Pn)⇔PARi1i2..in
Lua
Par({ function (pid) .. end, function (pid) .. end,..},{ -- shared environment v = ε, ..})
PD Stefan Bosse - VPP - Parallele Programmierung :: Paralleler Prozess
P1∥P2∥..∥Pn⇒P1;P2;..;PnP1∥P2⇒P1;P2⇒P2;P1!
PD Stefan Bosse - VPP - Parallele Programmierung :: Paralleler Prozess: Zeitliches Modell
P=P1∥P2∥..∥PnP1=(i1,1:t1,1;i1,2,:t1,2;..)⋯Pn=(in,1:tn,1;in,2:tn,1;..), mitti,1<ti,2<..<ti,m∀Prozess mit m Instr. und t(P)=[t1,t2]=[t1,1,t1,q]∪[t2,1,t2,r]∪..∪[tn,1,tn,s]t1=min{t1,1,t2,1,..,tn,1}t2=max{t1,q,t2,r,..,tn,s} T=t2−t1
PD Stefan Bosse - VPP - Parallele Programmierung :: Prozessflussdiagramme
Beispiel eines Prozessflussdiagramms für vier Prozesse. P1 startet P3, und P2 spaltet P4 ab. (mit P_,i = Instruktion(P,i))
PD Stefan Bosse - VPP - Parallele Programmierung :: Paralleler Prozess
Ein neuer paralleler Prozess kann durch den entsprechenden Prozesskonstruktor erzeugt werden
Geschieht dies innerhalb eines Prozesses Pi so wird dessen Prozessausführung blockiert bis alle Teilprozesses des parallelen Prozessen terminiert sind!
PD Stefan Bosse - VPP - Parallele Programmierung :: Paralleler Prozess
P1;//P2;P3=P1;P3∥P2//P1;//P2;P3=P1∥P2∥P3
Lua
Fork({ function (pid) .. end, function (pid) .. end, .. },{ -- shared environment})
PD Stefan Bosse - VPP - Parallele Programmierung :: Parallele Prozesse in Lua
PD Stefan Bosse - VPP - Parallele Programmierung :: Zusammenfassung
Parallele Prozesse werden aus nebenläufig oder verwoben ausgeführten sequenziellen Prozessen gebildet
Prozesse besitzen drei wesentliche Ausführungszustände: Bereit, Rechnend, Terminiert
Prozessynchonisation kann durch Prozessflussgraphen (PFG) dargestellt werden
Ein nachfolgender Prozess (Knoten im PFG) wird erst gestartet wenn der vorherige terminiert
Prozessblockierung ist wesentliche Eigenschaft von synchronisierenden Prozessen