Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132930 views
License: OTHER
1
%!TEX root = Programmierparadigmen.tex
2
\chapter{Parallelität}
3
\index{Parallelität|(}
4
Systeme mit mehreren Prozessoren sind heutzutage weit verbreitet. Inzwischen
5
sind sowohl in Desktop-PCs als auch Laptops, Tablets und Smartphones
6
\enquote{Multicore-CPUs} verbaut. Daher sollten auch Programmierer in der Lage
7
sein, Programme für mehrere Kerne zu entwickeln.
8
9
Parallelverarbeitung kann auf mehreren Ebenen statt finden:
10
\begin{itemize}
11
\item \textbf{Bit-Ebene}: Werden auf 32-Bit Computern \texttt{long long}, also
12
64-Bit Zahlen, addiert, so werden parallel zwei 32-Bit Additionen durchgeführt und
13
das carry-flag benutzt.
14
\item \textbf{Anweisungs-Ebene}: Die Ausführung von Anweisungen in der CPU
15
besteht aus mehreren Phasen (Instruction Fetch, Decode, Execution, Write-Back).
16
Besteht zwischen aufeinanderfolgenden Anweisungen keine Abhängigkeit,
17
so kann der Instruction Fetch-Teil einer zweiten Anweisung parallel zum
18
Decode-Teil einer ersten Anweisung geschehen. Das nennt man Pipelining\xindex{Pipelining}.
19
Man spricht hier auch von \textit{Instruction Level Parallelism} (ILP)\xindex{ILP}
20
\item \textbf{Datenebene}: Es kommt immer wieder vor, dass man in Schleifen
21
eine Operation für jedes Objekt eines Contaitainers (z.~B. einer Liste)
22
durchführen muss. Zwischen den Anweisungen verschiedener Schleifendurchläufe
23
besteht dann eventuell keine Abhängigkeit. Dann können alle Schleifenaufrufe
24
parallel durchgeführt werden.
25
\item \textbf{Verarbeitungsebene}: Verschiedene Programme sind unabhängig
26
von einander.
27
\end{itemize}
28
29
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
30
Anwendungen, sodass es sich so anfühlt, als würden die Programme echt parallel
31
ausgeführt werden.
32
33
Weitere Informationen zu Pipelining gibt es in der Vorlesung \enquote{Rechnerorganisation}
34
bzw. \enquote{Digitaltechnik und Entwurfsverfahren} (zu der auch ein exzellentes Skript angeboten wird). Informationen über Schedulung werden in der Vorlesung \enquote{Betriebssysteme}
35
vermittelt.
36
37
\section{Architekturen}
38
Es gibt zwei Ansätze, wie man Parallelrechner entwickeln kann:
39
\begin{itemize}
40
\item \textbf{Gemeinsamer Speicher}: In diesem Fall kann jeder Prozessor
41
jede Speicherzelle ansprechen. Dies ist bei Multicore-CPUs der Fall.
42
\item \textbf{Verteilter Speicher}: Es ist auch möglich, dass jeder Prozessor
43
seinen eigenen Speicher hat, der nur ihm zugänglich ist. In diesem Fall
44
schicken die Prozessoren Nachrichten (engl. \textit{message passing}\xindex{message passing}). Diese Technik wird in Clustern eingesetzt.
45
\end{itemize}
46
47
Eine weitere Art, wie man Parallelverarbeitung klassifizieren kann, ist anhand
48
der verwendeten Architektur. Der der üblichen, sequentiellen Art der Programmierung,
49
bei der jeder Befehl nach einander ausgeführt wird, liegt die sog.
50
\textbf{Von-Neumann-Architektur}\xindex{Von-Neumann-Architektur} zugrunde.
51
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.
52
In diesem Modell geht man von einer beliebigen Anahl an Prozessoren aus, die
53
über lokalen Speicher verfügen und synchronen Zugriff auf einen gemeinsamen
54
Speicher haben.
55
56
Anhand der \textbf{Flynn'schen Klassifikation}\xindex{Flynn'sche Klassifikation}
57
können Rechnerarchitekturen in vier Kategorien unterteilt werden:
58
59
\begin{table}[h]\xindex{SISD}\xindex{MISD}\xindex{SIMI}\xindex{MIMD}
60
\centering
61
\begin{tabular}{l|ll}
62
~ & Single Instruction & Multiple Instruction \\ \hline
63
Single Data & SISD & MISD \\
64
Multiple Data & SIMD & MIMD \\
65
\end{tabular}
66
\end{table}
67
68
Dabei wird die Von-Neumann-Architektur als \textit{SISD-Architektur} und die
69
PRAM-Architektur als \textit{SIMD-Architektur} klassifiziert. Es ist so zu
70
verstehen, dass ein einzelner Befehl auf verschiedene Daten angewendet wird.
71
72
Bei heutigen Multicore-Rechnern liegt MIMD vor, da verschiedene Befehle in den
73
Programmspeichern möglich sind.
74
75
Ein Beispiel für die SIMD sind GPUs. Sie haben einen Befehl im Programmspeicher
76
der auf verschiedenen Daten (Pixel) angewendet wird.
77
78
MISD ist nicht so richtig sinnvoll.
79
80
\begin{definition}[Nick's Class]\index{NC|see{Nick's Class}}\xindex{Nick's Class}%
81
Nick's Class (in Zeichen: $\mathcal{NC}$) ist die Klasse aller Probleme,
82
die im PRAM-Modell in logarithmischer Laufzeit lösbar sind, wobei die
83
Anzahl der Prozessoren polynomiell in der Eingabegröße beschränkt ist.
84
\end{definition}
85
86
\begin{beispiel}[Nick's Class]%
87
Folgende Probleme sind in $\mathcal{NC}$:
88
\begin{bspenum}
89
\item Die Addition, Multiplikation und Division von Ganzzahlen,
90
\item Matrixmultiplikation, die Berechnung von Determinanten und Inversen,
91
\item ausschließlich Probleme aus $\mathcal{P}$, also: $\mathcal{NC} \subseteq \mathcal{P}$
92
\end{bspenum}
93
94
Es ist nicht klar, ob $\mathcal{P} \subseteq \mathcal{NC}$ gilt. Bisher
95
wurde also noch kein Problem $P \in \mathcal{P}$ gefunden mit $P \notin \mathcal{NC}$.
96
\end{beispiel}
97
98
\section{Prozesskommunikation}
99
Die Prozesskommunikation wird durch einige Probleme erschwert:
100
101
\begin{definition}[Wettlaufsituation]\xindex{Wettlaufsituation}\index{Race-Condition|see{Wettlaufsituation}}%
102
Ist das Ergebnis einer Operation vom zeitlichen Ablauf der Einzeloperationen
103
abhängig, so liegt eine Wettlaufsituation vor.
104
\end{definition}
105
106
\begin{beispiel}[Wettlaufsituation]
107
Angenommen, man hat ein Bankkonto mit einem Stand von $\num{2000}$ Euro.
108
Auf dieses Konto wird am Monatsende ein Gehalt von $\num{800}$ Euro eingezahlt
109
und die Miete von $\num{600}$ Euro abgehoben. Nun stelle man sich folgende
110
beiden Szenarien vor:
111
112
\begin{table}[h]
113
\centering
114
\begin{tabular}{c|l|l|l}
115
$t$ & Prozess 1: Lohn & Prozess 2: Miete & Kontostand \\ \hline
116
1 &Lade Kontostand & Lade Kontostand & 2000 \\
117
2 & Addiere Lohn & ~ & 2000 \\
118
3 & Speichere Kontostand & ~ & 2800 \\
119
4 & ~ & Subtrahiere Miete & 2800 \\
120
5 & ~ & Speichere Kontostand & 1400 \\
121
\end{tabular}
122
\end{table}
123
124
Dieses Problem existiert nicht nur bei echt parallelen Anwendungen, sondern
125
auch bei zeitlich verzahnten Anwendungen.
126
\end{beispiel}
127
128
\begin{definition}[Semaphore]\xindex{Semaphore}%
129
Eine Semaphore $S=(c, r, f, L)$ ist eine Datenstruktur, die aus einer Ganzzahl, den beiden
130
atomaren Operationen $r$ = \enquote{reservieren probieren} und $f$ = \enquote{freigeben}
131
sowie einer Liste $L$ besteht.
132
133
$r$ gibt entweder Wahr oder Falsch zurück um zu zeigen, ob das reservieren
134
erfolgreich war. Im Erfolgsfall wird $c$ um $1$ verringert. Es wird genau
135
dann Wahr zurück gegeben, wenn $c$ positiv ist. Wenn Wahr zurückgegeben wird,
136
dann wird das aufrufende Objekt der Liste hinzugefügt.
137
138
$f$ kann nur von Objekten aufgerufen werden, die in $L$ sind. Wird $f$ von
139
$o \in L$ aufgerufen, wird $o$ aus $L$ entfernt und $c$ um eins erhöht.
140
\end{definition}
141
142
Semaphoren können eingesetzt werden um Wettlaufsituationen zu verhindern.
143
144
\begin{definition}[Monitor]\xindex{Monitor}%
145
Ein Monitor $M = (m, c)$ ist ein Tupel, wobei $m$ ein Mutex und $c$ eine
146
Bedingung ist.
147
\end{definition}
148
149
Monitore können mit einer Semaphore, bei der $c=1$ ist, implementiert werden.
150
Monitore sorgen dafür, dass auf die Methoden der Objekte, die sie repräsentieren,
151
zu jedem Zeitpunkt nur ein mal ausgeführt werden können. Sie sorgen also für
152
\textit{gegenseitigen Ausschluss}.
153
154
\begin{beispiel}[Monitor]
155
Folgendes Beispiel von \url{https://en.wikipedia.org/w/index.php?title=Monitor_(synchronization)&oldid=596007585} verdeutlicht den Nutzen eines Monitors:
156
157
\begin{verbatim}
158
monitor class Account {
159
private int balance := 0
160
invariant balance >= 0
161
162
public method boolean withdraw(int amount)
163
precondition amount >= 0
164
{
165
if balance < amount:
166
return false
167
else:
168
balance := balance - amount
169
return true
170
}
171
172
public method deposit(int amount)
173
precondition amount >= 0
174
{
175
balance := balance + amount
176
}
177
}
178
\end{verbatim}
179
\end{beispiel}
180
181
\section{Parallelität in Java}
182
Java unterstützt mit der Klasse \texttt{Thread} und dem Interface \texttt{Runnable}
183
Parallelität.
184
185
Interessante Stichwörder sind noch:
186
\begin{itemize}
187
\item ThreadPool
188
\item Interface Executor
189
\item Interface Future<V>
190
\item Interface Callable<V>
191
\end{itemize}
192
193
\section{Message Passing Modell}
194
Das Message Passing Modell ist eine Art, wie man parallel laufende Programme
195
schreiben kann. Dabei tauschen die Prozesse Nachrichten aus um die Arbeit zu
196
verteilen.
197
198
Ein wichtiges Konzept ist hierbei der \textit{Kommunikator}\xindex{Kommunikator}.
199
Ein Kommunikator definiert eine Gruppe von Prozessen, die mit einander kommunizieren
200
können. In dieser Gruppe von Prozessen hat jeder Prozesse einen eindeutigen
201
\textit{Rang}\xindex{Rang}, den sie zur Kommunikation nutzen.
202
203
Die Grundlage der Kommunikation bilden \textit{send} und \textit{receive} Operationen.
204
Prozesse schicken Nachrichten an andere Prozesse, indem sie den eindeutigen Rang
205
und einen \textit{tag} angeben, der die Nachricht identifiziert.
206
207
Wenn ein Prozess mit einem einzigen weiteren Prozess kommuniziert, wird dies
208
\textit{Punkt-zu-Punkt-Kommunikation}\xindex{Punkt-zu-Punkt-Kommunikation} genannt.
209
210
Wenn ein Prozess allen anderen eine Nachricht schickt, nennt man das \textit{Broadcast}\xindex{Broadcast}.
211
212
\index{Parallelität|)}
213