Skip to content

Commit

Permalink
Abschnitt über Parallelität hinzugefügt
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinThoma committed Mar 5, 2014
1 parent 8b909ca commit a7fdba0
Show file tree
Hide file tree
Showing 5 changed files with 148 additions and 0 deletions.
1 change: 1 addition & 0 deletions documents/Programmierparadigmen/C.tex
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
%!TEX root = Programmierparadigmen.tex
\chapter{C}
\index{C|(}
C ist eine imperative Programmiersprache. Sie wurde in vielen Standards
Expand Down
1 change: 1 addition & 0 deletions documents/Programmierparadigmen/MPI.tex
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
%!TEX root = Programmierparadigmen.tex
\chapter{MPI}
\index{MPI|(}

Expand Down
143 changes: 143 additions & 0 deletions documents/Programmierparadigmen/Parallelitaet.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
%!TEX root = Programmierparadigmen.tex
\chapter{Parallelität}
\index{Parallelität|(}
Systeme mit mehreren Prozessoren sind heutzutage weit verbreitet. Inzwischen
sind sowohl in Desktop-PCs als auch Laptops, Tablets und Smartphones
\enquote{Multicore-CPUs} verbaut. Daher sollten auch Programmierer in der Lage
sein, Programme für mehrere Kerne zu entwickeln.

Parallelverarbeitung kann auf mehreren Ebenen statt finden:
\begin{itemize}
\item \textbf{Bit-Ebene}: Werden auf 32-Bit Computern \texttt{long long}, also
64-Bit Zahlen, addiert, so werden parallel zwei 32-Bit Additionen durchgeführt und
das carry-flag benutzt.
\item \textbf{Anweisungs-Ebene}: Die Ausführung von Anweisungen in der CPU
besteht aus mehreren Phasen (Instruction Fetch, Decode, Execution, Write-Back).
Besteht zwischen aufeinanderfolgenden Anweisungen keine Abhängigkeit,
so kann der Instruction Fetch-Teil einer zweiten Anweisung parallel zum
Decode-Teil einer ersten Anweisung geschehen. Das nennt man Pipelining\xindex{Pipelining}.
\item \textbf{Datenebene}: Es kommt immer wieder vor, dass man in Schleifen
eine Operation für jedes Objekt eines Contaitainers (z.~B. einer Liste)
durchführen muss. Zwischen den Anweisungen verschiedener Schleifendurchläufe
besteht dann eventuell keine Abhängigkeit. Dann können alle Schleifenaufrufe
parallel durchgeführt werden.
\item \textbf{Verarbeitungsebene}: Verschiedene Programme sind unabhängig
von einander.
\end{itemize}

Gerade bei dem letzten Punkt ist zu beachten, dass echt parallele Ausführung nicht mit \textit{verzahnter Ausführung}\xindex{verzahnt} zu verwechseln ist. Auch bei Systemen mit nur einer CPU und einem Kern kann man gleichzeitig den Browser nutzen und einen Film über eine Multimedia-Anwendung laufen lassen. Dabei wechselt der Scheduler sehr schnell zwischen den verschiedenen
Anwendungen, sodass es sich so anfühlt, als würden die Programme echt parallel
ausgeführt werden.

Weitere Informationen zu Pipelining gibt es in der Vorlesung \enquote{Rechnerorganisation}
bzw. \enquote{Digitaltechnik und Entwurfsverfahren} (zu der auch ein exzellentes Skript angeboten wird). Informationen über Schedulung werden in der Vorlesung \enquote{Betriebssysteme}
vermittelt.

\section{Architekturen}
Es gibt zwei Ansätze, wie man Parallelrechner entwickeln kann:
\begin{itemize}
\item \textbf{Gemeinsamer Speicher}: In diesem Fall kann jeder Prozessor
jede Speicherzelle ansprechen. Dies ist bei Multicore-CPUs der Fall.
\item \textbf{Verteilter Speicher}: Es ist auch möglich, dass jeder Prozessor
seinen eigenen Speicher hat, der nur ihm zugänglich ist. In diesem Fall
schicken die Prozessoren Nachrichten (engl. \textit{message passing}\xindex{message passing}). Diese Technik wird in Clustern eingesetzt.
\end{itemize}

Eine weitere Art, wie man Parallelverarbeitung klassifizieren kann, ist anhand
der verwendeten Architektur. Der der üblichen, sequentiellen Art der Programmierung,
bei der jeder Befehl nach einander ausgeführt wird, liegt die sog.
\textbf{Von-Neumann-Architektur}\xindex{Von-Neumann-Architektur} zugrunde.
Bei der Programmierung von parallel laufenden Anwendungen kann man das \textbf{PRAM-Modell}\xindex{PRAM-Modell} (kurz für \textit{Parallel Random Access Machine}) zugrunde legen.
In diesem Modell geht man von einer beliebigen Anahl an Prozessoren aus, die
über lokalen Speicher verfügen und synchronen Zugriff auf einen gemeinsamen
Speicher haben.

Anhand der \textbf{Flynn'schen Klassifikation}\xindex{Flynn'sche Klassifikation}
können Rechnerarchitekturen in vier Kategorien unterteilt werden:

\begin{table}[h]\xindex{SISD}\xindex{MISD}\xindex{SIMI}\xindex{MIMD}
\centering
\begin{tabular}{l|ll}
~ & Single Instruction & Multiple Instruction \\ \hline
Single Data & SISD & MISD \\
Multiple Data & SIMI & MIMD \\
\end{tabular}
\end{table}

Dabei wird die Von-Neumann-Architektur als \textit{SISD-Architektur} und die
PRAM-Architektur als \textit{SIMD-Architektur} klassifiziert. Es ist so zu
verstehen, dass ein einzelner Befehl auf verschiedene Daten angewendet wird.

Bei heutigen Multicore-Rechnern liegt MIMD vor.

MISD ist nicht so richtig sinnvoll.

\begin{definition}[Nick's Class]\index{NC|see{Nick's Class}}\xindex{Nick's Class}%
Nick's Class (in Zeichen: $\mathcal{NC}$) ist die Klasse aller Probleme,
die im PRAM-Modell in logarithmischer Laufzeit lösbar sind.
\end{definition}

\begin{beispiel}[Nick's Class]%
Folgende Probleme sind in $\mathcal{NC}$:
\begin{bspenum}
\item Die Addition, Multiplikation und Division von Ganzzahlen,
\item Matrixmultiplikation, die Berechnung von Determinanten und Inversen,
\item ausschließlich Probleme aus $\mathcal{P}$, also: $\mathcal{NC} \subseteq \mathcal{P}$
\end{bspenum}

Es ist nicht klar, ob $\mathcal{P} \subseteq \mathcal{NC}$ gilt. Bisher
wurde also noch kein Problem $P \in \mathcal{P}$ gefunden mit $P \notin \mathcal{NC}$.
\end{beispiel}

\section{Prozesskommunikation}
Die Prozesskommunikation wird durch einige Probleme erschwert:

\begin{definition}[Wettlaufsituation]\xindex{Wettlaufsituation}\index{Race-Condition|see{Wettlaufsituation}}%
Ist das Ergebnis einer Operation vom zeitlichen Ablauf der Einzeloperationen
abhängig, so liegt eine Wettlaufsituation vor.
\end{definition}

\begin{beispiel}[Wettlaufsituation]
Angenommen, man hat ein Bankkonto mit einem Stand von $\num{2000}$ Euro.
Auf dieses Konto wird am Monatsende ein Gehalt von $\num{800}$ Euro eingezahlt
und die Miete von $\num{600}$ Euro abgehoben. Nun stelle man sich folgende
beiden Szenarien vor:

\begin{table}[h]
\centering
\begin{tabular}{c|l|l|l}
$t$ & Prozess 1: Lohn & Prozess 2: Miete & Kontostand \\ \hline
1 &Lade Kontostand & Lade Kontostand & 2000 \\
2 & Addiere Lohn & ~ & 2000 \\
3 & Speichere Kontostand & ~ & 2800 \\
4 & ~ & Subtrahiere Miete & 2800 \\
5 & ~ & Speichere Kontostand & 1400 \\
\end{tabular}
\end{table}

Dieses Problem existiert nicht nur bei echt parallelen Anwendungen, sondern
auch bei zeitlich verzahnten Anwendungen.
\end{beispiel}

\begin{definition}[Semaphore]\xindex{Semaphore}%
Eine Semaphore $S=(c, r, f, L)$ ist eine Datenstruktur, die aus einer Ganzzahl, den beiden
atomaren Operationen $r$ = \enquote{reservieren probieren} und $f$ = \enquote{freigeben}
sowie einer Liste $L$ besteht.

$r$ gibt entweder Wahr oder Falsch zurück um zu zeigen, ob das reservieren
erfolgreich war. Im Erfolgsfall wird $c$ um $1$ verringert. Es wird genau
dann Wahr zurück gegeben, wenn $c$ positiv ist. Wenn Wahr zurückgegeben wird,
dann wird das aufrufende Objekt der Liste hinzugefügt.

$f$ kann nur von Objekten aufgerufen werden, die in $L$ sind. Wird $f$ von
$o \in L$ aufgerufen, wird $o$ aus $L$ entfernt und $c$ um eins erhöht.
\end{definition}

Semaphoren können eingesetzt werden um Wettlaufsituationen zu verhindern.

\begin{definition}[Monitor]\xindex{Monitor}%
Ein Monitor $M = (m, c)$ ist ein Tupel, wobei $m$ ein Mutex und $c$ eine
Bedingung ist.
\end{definition}

\index{Parallelität|)}
Binary file modified documents/Programmierparadigmen/Programmierparadigmen.pdf
Binary file not shown.
3 changes: 3 additions & 0 deletions documents/Programmierparadigmen/Programmierparadigmen.tex
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
\usemintedstyle{bw}
\usepackage{courier}
\usepackage{wasysym}
\usepackage[binary-units = true]{siunitx} % this package is for units!
\sisetup{locale=DE}
\usepackage{shortcuts}

\usepackage{fancyhdr}
Expand Down Expand Up @@ -96,6 +98,7 @@
\input{Logik}
\input{lambda}
\input{Typinferenz}
\input{Parallelitaet}
\input{Haskell}
\input{Prolog}
\input{Scala}
Expand Down

0 comments on commit a7fdba0

Please sign in to comment.