PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Mit Virtuellen Maschinen
PD Stefan Bosse
Universität Bremen - FB Mathematik und Informatik
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Wie können Algorithmen und Programmen parallelisiert werden?
Wann ist Kontrollpfadparallelität sinnvoll?
Was unterscheidet Datenpfad- von Kontrollpfadparallelität?
Unterschied zwischen Koroutinen, Threads, und Prozessen
Asynchrone vs. Synchrone Verarbeitung
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Schleifen stellen eine reine Sequenz von elementaren Prozessen dar (parametrisierbare Replikate): I=i1→i2→ ...
Das Abrollen von Schleifen ist eine der gängigsten Parallelisierungsmethoden bei der Schleifen durch Replikation der Schleifeninstruktionen (Schleifenkörper) in eine sequenzielle und parallelisierbare Anweisungssequenz
Dabei wird der Schleifenkörper B(I,p) in Abhängigkeit von der Iterationsvariable p parametrisiert
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
for i = i1 to i2 do for j = j1 to j2 do .. IB(i,j,x(i,j),x(i+1,j),..,); endend──────────────────────────IB(i1,j1,x(i1,j1),x(i1+1,j1),..) ||IB(i1+1,j1,x(i1+1,j1),x(i1+2,j1),..) ||IB(i1+n,ij+m,x(i1+n,ij+m),x(i1+n+1,j1+m),..) ||..
Schleifenparallelität und mögliche Parallelisierung (von Datenabhängigkeit verschiedener Instanzen Bi begrenzt)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Zu beachten sind Datenabhängigkeiten zwischen einzelnen Anweisungsiterationen und Kosten durch die Abrollung (Overhead)
Beispiel: Abrollbar aber nicht parallelisierbar durch Datenabhängikeit ISb(ISb-1(ISb-2(..)) !
X := 1;for i = a to b do IS: X := X*i;end
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
In der Bildverarbeitung werden Vektoroperationen (und Matrixoperationen) sehr häufig verwendet. Dabei werden häufig die gleichen Operationen auf alle Pixel eines Bildes (Feldelemente) angewendet → Datenpfadparallelität.
Anstelle der iterativen Berechnung mittels Schleifen definiert man deklarativ die Berechnung eines Pixels (Punktoperator) oder eines Bereiches des Bildes (Lokaloperator):
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
img' = F(img):: = { f(x)|x ∈ img }──────────────────────────procedure F (img: vector of type):begin return f(img)end
Deklarative Beschreibung von Vektoroperationen
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Algorithmus: Transformation von Farb- in Grauwertbilder [2]
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Häufige Listenoperationen (und auch bei Arrays) sind:
Mapping kann vollständig parallel ausgeführt werden (Unabhängigkeit der Teiloperationen)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
{1,2,3,4,5,6,8,9,..}:map(f):reduce(g) │ │ │ │ │ │ │ │ ┌─▶{*,*,*,*,*,*,*,*,..} │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ f f f f f f f f │ g└┬┘ └┬┘ └┬┘ └┬┘g | | | | | | | | │ │ │ │ │ {*,*,*,*,*,*,*,*,..}* g└─┬─┘ g└─┬─┘ │ │ g└───┬───┘ │
Parallele Anwendung der Elementfunktionen f und g → funktionale Datenpfadparallelität
Real wird die Datenpfadparallelität durch partitionierte Kontrollpfadparallelität abgebildet!
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
JavaScript (und andere funktionalen Programmiersprachen) arbeiten intensiv mit Listen und Arrays
Listen und Arrays lassen sich mittels eines Abbildungsoperators und einer Elementfunktion (Punktoperator) transformieren (map-and-reduce)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
local img = T{21,2,6,28,2,3,4,6,9,100,20};function gray2color (img) return {r=img,g=img,b=img }endlocal img2 = img:map(gray2color);local meanlevel = img2:map(function (p) return (p.r+p.g+p.b)/3end):reduce(function (accu,level) return accu+levelend)
Bildtransformation mit map&reduce Operation
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Lokale Operatoren (Zelluläre Automaten!) sind rechenintensiver als Punktoperatoren. Um ein neues Pixel zu berechnen wird der alte Wert des Pixels sowie die alten räumlich benachbarten Werte der Pixel innerhalb einer definierten maximalen Entfernung verwendet.
Für eine 3x3-Nachbarschaftsberechnung werden zum Beispiel Neun Datenwerte für jedes Pixel benötigt.
Für die Berechnung lokaler Operatoren wird eine bestimmte Anzahl von parallelen Datenaustauschvorgängen benötigt → Kommunikation.
Wenn jedes Pixel auf einem anderen Prozessor gespeichert wird ist Kommunikation teuer!
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Komplexitätsreduktion durch Separation der Operatoren: (1) Alle Zeilenoperationen werden parallel ausgeführt (2) Alle Spaltenoperationen werden parallel ausgeführt
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Algorithmus: Parallele Nachbarschaftsberechnung
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Nebenläufigkeits- und Datenabhängigkeitsanalyse
Ziele: Reduktion von Zeitschritten, Minimierung der Latenz, Parallelisierung
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
x=0 ──────────────▶ MinBl 1.1 ┌───▶ MajBl 1: y=0 ──────────────▶ MinBl 1.2 │ P(1.1)||P(1.2) if x < y then t=x ───────────▶ MinBl 2.1 ┌───▶ MajBl 2: x=y ───────────▶ MinBl 2.2 │ P(2.1);P(2.2)||P(2.3) y=t ───────────▶ MinBl 2.3 │ end
Basisblöcke und parallele Prozesskomposition
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Determinismus macht paralleles Auswerten der Argumente und Parallelisierung bei Rekursion möglich
Parameter von Funktionen sind datenunabhängig → Parallele Evaluierung der Funktionsargumente bei der Funktionsapplikation
Funktionsaufrufe sind gänzlich oder partiell datenunabhängig → Parallelisierung der Funktionsaufrufe (Endrekursion, Kopfrekursion bringt kein Vorteil)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Isolierte Programmprozesse ohne direkte Synchronisation und Datenaustausch zwischen den VMs
Synchronsiation nur über
Jeder Prozess führt eine VM aus ohne (zunächst) direkte Kopplung und Kommunikation mit anderen Prozessen
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Es werden parallele Prozesse auf Threads abgebildet die bestenfalls 1:1 auf den CPUs / Cores ausgeführt werden, ansonsten durch einen Scheduler im Zeitmultiplexverfahren ausgeführt werden → Kontrollpfadparallelität
Prozesse können synchronisiert auf geteilte Objekte (konkurrierend) zugreifen:
Prozessblockierung blockiert den gesamten Thread (somit auch alle Fibers)
Jeder parallele Prozess in einem Thread läuft in eigener VM Instanz
Daten können nicht zwischen VMs ausgetauscht werden (Automatsisches Speichermanagement und GC) → nur Austausch über Serialisierung und Kopie von Daten oder geteilte Byte Datenspeicher (Shared Buffer)!
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Es werden konkurrierende (aber nicht notwendig nebenläufige) Prozesse (Koroutinen) auf Fibers abgebildet die grundsätzlich in Lua nur sequenziell durch einen Scheduler im Zeitmultiplexverfahren ausgeführt werden.
Diese Prozesse können synchronisiert auf geteilte Objekte (nicht nebeläufig) zugreifen:
Prozessblockierung blockiert nur eine Koroutine
Alle quasi-parallelen Prozesse mit Fibers laufen in einer VM Instanz und teilen sich den VM Datenkontext sowie besitzen den gleichen Programmkontext (direkte Teilung von Variablen und Funktionen)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Threadmodell und Kommunikation der Prozesse mit geteilten Objekten
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Asynchrone IO wird sowohl in nodejs(JavaScript) als auch in Lua (lvm) mittels der libuv Bibliothek implementiert
Fibers (Koroutinen) werden in Lua direkt durch die Lua VM verarbeitet
Threads werden über die libuv einzelnen VM Instanzen zugeordnet
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
docs.libuv.org/en/v1.x/design.html
Asynchrone IO mit der libuv Architektur
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Parallelisierung durch multiple VM Instanzen mit Inter-VM Kommunikation
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Neben der Parallelisierung der reinen Datenverarbeitung (Berechnung) kann auch eine Partitionierung von Ein- und Ausgabe bzw. der Ereignisverarbeitung erfolgen
Bekanntes Beispiel: Geräteinterrupts mit einfachen Foreground-Background System mit zwei Prozessen:
Ein- und Ausgabeoperationen eines Programms können synchron (blockierend) oder asynchron (im Hintergrund verarbeitet und nicht blockierend) ausgeführt werden.
Alle Programme/Prozesse können blockieren, aber nur wenige Programmierumgebungen erlauben ein Scheduling (Multiprozessverarbeitung)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
x = IO1(arg1,arg2,..);y = IO2(arg1,arg2,..);z = f(x,y);
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
IO1(arg1,arg2,..,function (res) x=res; end); IO2(arg1,arg2,..,function (res) y=res; end);z = f(x,y); -- Problem?
//P(IO1);//P(IO2);P
(P(IO1)∣∣P(IO2));P
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Ereignisbasierte Verarbeitung von asynchronen Operationen in lvm: Ein Lua Thread verbunden über die Eventloop mit N IO Threads
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Asynchrone Ereignisverarbeitung mit preemptiven (unterbechenden) Verhalten benötigt explizite Synchronisation (Locks...) zur Atomarisierung von kritischen Bereichen
Asynchrone Ereignisverarbeitung spaltet den Kontroll- und Datenfluss auf und benötigt Daten- und Ergebnissynchronisation über Prädikatfunktionen oder explizite Synchronisation:
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
local x,y,z;function P(f,x,y,z) if x~=nil and y~=nil then return f(x,y) else return z endendIO1(arg1,arg2,..,function (res) x=res; z=P(f,x,y,z) end); IO2(arg1,arg2,..,function (res) y=res; z=P(f,x,y,z) end);
Verwendung einer Prädikatfunktion P zur Auflösung von Abhängigkeiten und Asynchronität / Unbekannter Ausführungsreihenfolge
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Neben der Prädikatfunktion kann Deasynchronisierung verwendet werden um den Programmfluss zu sequenzialisieren und zu synchronisieren
Dazu wird eine zusätzliche Synchronisation eingeführt die die auszuführende asynchrone Funktion blockiert
Der Kontrollfluss spaltet sich dabei auf (der Hauptfluss wird verlassen)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
function fooAsync (callback) .. callback(result) ..end-- Nur in Koroutine ausführbar!function fooSync () local result fooAsync(function (_result) result=_result coroutine.resume() end) coroutine.yield() return resultend
Deasync Wrapper für asynchrone Funktionen
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
function fooAsync(data) { ... compute A1 ...}...compute M1 ...setInterval(fooAsync,1000)...compute M2...
Beispiel einer asynchronen Ausführung einer Berechnung durch einen Timer. Solange in M1/M2 berechnet wird findet keine Ausführung von fooAsync statt (wird verzögert)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Promises wurden in EcmaScript ES2015 eingeführt um die Verschachtelung von callbacks zu linearisieren ("Callback Hölle")
Ein Promise ist eine Funktion die die Ausführung einer Sequenz von Operationen sequenzialisiert (sequenzielle Blockierung) → Ansatz von Scheduling
Aber: Ein Promise blockiert nicht den Hauptfluss!
Mit await kann auf eine explizit gekennzeichnte async Funktion aber auf deren Terminierung eines Promise gewartet werden
developer.mozilla.org
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
var myPromise = new Promise(function (resolve, reject) { setTimeout(function () { if (Math.random()<0.5) resolve('granted'); else reject('denied'); }, 300);});myPromise .then(handleResolvedA, handleRejectedA) .then(handleResolvedB, handleRejectedB) .then(handleResolvedC, handleRejectedC);
Aber: Asynchrone Funktionen und await Blockierungen dürfen hier nicht geschachtelt werden (anders als in Lua mit yield/resume!!)
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
var waiters=[];function yield() { var getResolver = function (resolve) { waiters.push({resolve:resolve,event:'yield'}); } return new Promise(getResolver);}async function coro() { for(;;) { ..; await yield(); .. }}function schedule() { var next = waiters.shift(); if (next) { next.resolve(); }}coro() .. schedule() ..
Koroutinen mit Kontrollflussverzweigung in JavaScript
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
PD Stefan Bosse - VPP - Modul F: Parallelisierung von Algorithmen und Programmen
Funktionale Ausdrücke und Vektoroperationen bieten Möglichkeiten der Parallelisierung auf Datenpfadebene
Sequenzielle Schleifen und Rekursion bieten Möglichkeiten der Parallelisierung auf Kontrollpfadebene
Basisblockparititionierung erlaubt Parallelisierung auf Daten- und Kontrollpfadebene
Asynchrone (quasi nebenläufige) Ausführung von Funktionen bietet Parallelisierung auf Kontrollpfadebene