Parallele Programmierung: Theorie

Parallel zu Programmieren gibt uns Geschwindigkeitsvorteile. Um diese zu Messen nehmen wir Laufzeiten (dabei seien T_p die Laufzeit mit p Prozessoren und T_s die Laufzeit mit einem Prozessor(sequentielle Laufzeit)):

Speed-up

Der Speed-up bezeichnet den Faktor um den ein Programm schneller werden kann, wenn mehr Prozessoren hinzu gefügt werden.

S_p = {T_s / T_p}

Effizienz

Die Effizienz bezeichnet einen Wert, wie viel „Sinn“ jeder Prozessor hat, wenn ich ein Programm mit p Prozessoren ausführe. Die Effizienz ist der Scale-up um die Anzahl Prozessoren normiert:

E = {S_p / p}

Amdahls Gesetz

Amdahls Gesetz sagt aus, dass es in Programmen immer einen sequentiellen Anteil gibt (bspw. Initialisierung von Variablen, die auf allein Prozessoren oder Knoten ausgeführt werden muss, oder einmal im System und dann verteilt werden). Diesen Anteil kann man nicht parallelisieren, dh. die Laufzeit diesen Anteils bleibt gleich. Sei f der sequentielle Anteil eines Programms, und somit 1-f der parallele Anteil, mit:

f = {T_s / {T_s + T_p}}

Mit jedem hinzugefügten Prozessor wird somit nur der parallele Anteil des Programms schneller. Es ergibt sich für den Speed-up:

S_p = { 1 / { f+ { {1-f} / p }}}
\lim{p right infty} {S_p} = 1 / f
\lim{p right infty} {E_p} = 0

Dh. der Speed-Up ist begrenzt, die Effizienz ist, wenn immer mehr Prozessoren hinzugefügt werden gleich Null, weil der sequentielle Anteil immer gleich bleibt (dh. da nützen mehr Prozessoren nichts) und der parallele Anteil quasi in einer Zeit von Null geschafft wird.