📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / documents / Programmierparadigmen / Parallelitaet.tex
132928 viewsLicense: OTHER
%!TEX root = Programmierparadigmen.tex1\chapter{Parallelität}2\index{Parallelität|(}3Systeme mit mehreren Prozessoren sind heutzutage weit verbreitet. Inzwischen4sind sowohl in Desktop-PCs als auch Laptops, Tablets und Smartphones5\enquote{Multicore-CPUs} verbaut. Daher sollten auch Programmierer in der Lage6sein, Programme für mehrere Kerne zu entwickeln.78Parallelverarbeitung kann auf mehreren Ebenen statt finden:9\begin{itemize}10\item \textbf{Bit-Ebene}: Werden auf 32-Bit Computern \texttt{long long}, also1164-Bit Zahlen, addiert, so werden parallel zwei 32-Bit Additionen durchgeführt und12das carry-flag benutzt.13\item \textbf{Anweisungs-Ebene}: Die Ausführung von Anweisungen in der CPU14besteht aus mehreren Phasen (Instruction Fetch, Decode, Execution, Write-Back).15Besteht zwischen aufeinanderfolgenden Anweisungen keine Abhängigkeit,16so kann der Instruction Fetch-Teil einer zweiten Anweisung parallel zum17Decode-Teil einer ersten Anweisung geschehen. Das nennt man Pipelining\xindex{Pipelining}.18Man spricht hier auch von \textit{Instruction Level Parallelism} (ILP)\xindex{ILP}19\item \textbf{Datenebene}: Es kommt immer wieder vor, dass man in Schleifen20eine Operation für jedes Objekt eines Contaitainers (z.~B. einer Liste)21durchführen muss. Zwischen den Anweisungen verschiedener Schleifendurchläufe22besteht dann eventuell keine Abhängigkeit. Dann können alle Schleifenaufrufe23parallel durchgeführt werden.24\item \textbf{Verarbeitungsebene}: Verschiedene Programme sind unabhängig25von einander.26\end{itemize}2728Gerade 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 verschiedenen29Anwendungen, sodass es sich so anfühlt, als würden die Programme echt parallel30ausgeführt werden.3132Weitere Informationen zu Pipelining gibt es in der Vorlesung \enquote{Rechnerorganisation}33bzw. \enquote{Digitaltechnik und Entwurfsverfahren} (zu der auch ein exzellentes Skript angeboten wird). Informationen über Schedulung werden in der Vorlesung \enquote{Betriebssysteme}34vermittelt.3536\section{Architekturen}37Es gibt zwei Ansätze, wie man Parallelrechner entwickeln kann:38\begin{itemize}39\item \textbf{Gemeinsamer Speicher}: In diesem Fall kann jeder Prozessor40jede Speicherzelle ansprechen. Dies ist bei Multicore-CPUs der Fall.41\item \textbf{Verteilter Speicher}: Es ist auch möglich, dass jeder Prozessor42seinen eigenen Speicher hat, der nur ihm zugänglich ist. In diesem Fall43schicken die Prozessoren Nachrichten (engl. \textit{message passing}\xindex{message passing}). Diese Technik wird in Clustern eingesetzt.44\end{itemize}4546Eine weitere Art, wie man Parallelverarbeitung klassifizieren kann, ist anhand47der verwendeten Architektur. Der der üblichen, sequentiellen Art der Programmierung,48bei der jeder Befehl nach einander ausgeführt wird, liegt die sog.49\textbf{Von-Neumann-Architektur}\xindex{Von-Neumann-Architektur} zugrunde.50Bei 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.51In diesem Modell geht man von einer beliebigen Anahl an Prozessoren aus, die52über lokalen Speicher verfügen und synchronen Zugriff auf einen gemeinsamen53Speicher haben.5455Anhand der \textbf{Flynn'schen Klassifikation}\xindex{Flynn'sche Klassifikation}56können Rechnerarchitekturen in vier Kategorien unterteilt werden:5758\begin{table}[h]\xindex{SISD}\xindex{MISD}\xindex{SIMI}\xindex{MIMD}59\centering60\begin{tabular}{l|ll}61~ & Single Instruction & Multiple Instruction \\ \hline62Single Data & SISD & MISD \\63Multiple Data & SIMD & MIMD \\64\end{tabular}65\end{table}6667Dabei wird die Von-Neumann-Architektur als \textit{SISD-Architektur} und die68PRAM-Architektur als \textit{SIMD-Architektur} klassifiziert. Es ist so zu69verstehen, dass ein einzelner Befehl auf verschiedene Daten angewendet wird.7071Bei heutigen Multicore-Rechnern liegt MIMD vor, da verschiedene Befehle in den72Programmspeichern möglich sind.7374Ein Beispiel für die SIMD sind GPUs. Sie haben einen Befehl im Programmspeicher75der auf verschiedenen Daten (Pixel) angewendet wird.7677MISD ist nicht so richtig sinnvoll.7879\begin{definition}[Nick's Class]\index{NC|see{Nick's Class}}\xindex{Nick's Class}%80Nick's Class (in Zeichen: $\mathcal{NC}$) ist die Klasse aller Probleme,81die im PRAM-Modell in logarithmischer Laufzeit lösbar sind, wobei die82Anzahl der Prozessoren polynomiell in der Eingabegröße beschränkt ist.83\end{definition}8485\begin{beispiel}[Nick's Class]%86Folgende Probleme sind in $\mathcal{NC}$:87\begin{bspenum}88\item Die Addition, Multiplikation und Division von Ganzzahlen,89\item Matrixmultiplikation, die Berechnung von Determinanten und Inversen,90\item ausschließlich Probleme aus $\mathcal{P}$, also: $\mathcal{NC} \subseteq \mathcal{P}$91\end{bspenum}9293Es ist nicht klar, ob $\mathcal{P} \subseteq \mathcal{NC}$ gilt. Bisher94wurde also noch kein Problem $P \in \mathcal{P}$ gefunden mit $P \notin \mathcal{NC}$.95\end{beispiel}9697\section{Prozesskommunikation}98Die Prozesskommunikation wird durch einige Probleme erschwert:99100\begin{definition}[Wettlaufsituation]\xindex{Wettlaufsituation}\index{Race-Condition|see{Wettlaufsituation}}%101Ist das Ergebnis einer Operation vom zeitlichen Ablauf der Einzeloperationen102abhängig, so liegt eine Wettlaufsituation vor.103\end{definition}104105\begin{beispiel}[Wettlaufsituation]106Angenommen, man hat ein Bankkonto mit einem Stand von $\num{2000}$ Euro.107Auf dieses Konto wird am Monatsende ein Gehalt von $\num{800}$ Euro eingezahlt108und die Miete von $\num{600}$ Euro abgehoben. Nun stelle man sich folgende109beiden Szenarien vor:110111\begin{table}[h]112\centering113\begin{tabular}{c|l|l|l}114$t$ & Prozess 1: Lohn & Prozess 2: Miete & Kontostand \\ \hline1151 &Lade Kontostand & Lade Kontostand & 2000 \\1162 & Addiere Lohn & ~ & 2000 \\1173 & Speichere Kontostand & ~ & 2800 \\1184 & ~ & Subtrahiere Miete & 2800 \\1195 & ~ & Speichere Kontostand & 1400 \\120\end{tabular}121\end{table}122123Dieses Problem existiert nicht nur bei echt parallelen Anwendungen, sondern124auch bei zeitlich verzahnten Anwendungen.125\end{beispiel}126127\begin{definition}[Semaphore]\xindex{Semaphore}%128Eine Semaphore $S=(c, r, f, L)$ ist eine Datenstruktur, die aus einer Ganzzahl, den beiden129atomaren Operationen $r$ = \enquote{reservieren probieren} und $f$ = \enquote{freigeben}130sowie einer Liste $L$ besteht.131132$r$ gibt entweder Wahr oder Falsch zurück um zu zeigen, ob das reservieren133erfolgreich war. Im Erfolgsfall wird $c$ um $1$ verringert. Es wird genau134dann Wahr zurück gegeben, wenn $c$ positiv ist. Wenn Wahr zurückgegeben wird,135dann wird das aufrufende Objekt der Liste hinzugefügt.136137$f$ kann nur von Objekten aufgerufen werden, die in $L$ sind. Wird $f$ von138$o \in L$ aufgerufen, wird $o$ aus $L$ entfernt und $c$ um eins erhöht.139\end{definition}140141Semaphoren können eingesetzt werden um Wettlaufsituationen zu verhindern.142143\begin{definition}[Monitor]\xindex{Monitor}%144Ein Monitor $M = (m, c)$ ist ein Tupel, wobei $m$ ein Mutex und $c$ eine145Bedingung ist.146\end{definition}147148Monitore können mit einer Semaphore, bei der $c=1$ ist, implementiert werden.149Monitore sorgen dafür, dass auf die Methoden der Objekte, die sie repräsentieren,150zu jedem Zeitpunkt nur ein mal ausgeführt werden können. Sie sorgen also für151\textit{gegenseitigen Ausschluss}.152153\begin{beispiel}[Monitor]154Folgendes Beispiel von \url{https://en.wikipedia.org/w/index.php?title=Monitor_(synchronization)&oldid=596007585} verdeutlicht den Nutzen eines Monitors:155156\begin{verbatim}157monitor class Account {158private int balance := 0159invariant balance >= 0160161public method boolean withdraw(int amount)162precondition amount >= 0163{164if balance < amount:165return false166else:167balance := balance - amount168return true169}170171public method deposit(int amount)172precondition amount >= 0173{174balance := balance + amount175}176}177\end{verbatim}178\end{beispiel}179180\section{Parallelität in Java}181Java unterstützt mit der Klasse \texttt{Thread} und dem Interface \texttt{Runnable}182Parallelität.183184Interessante Stichwörder sind noch:185\begin{itemize}186\item ThreadPool187\item Interface Executor188\item Interface Future<V>189\item Interface Callable<V>190\end{itemize}191192\section{Message Passing Modell}193Das Message Passing Modell ist eine Art, wie man parallel laufende Programme194schreiben kann. Dabei tauschen die Prozesse Nachrichten aus um die Arbeit zu195verteilen.196197Ein wichtiges Konzept ist hierbei der \textit{Kommunikator}\xindex{Kommunikator}.198Ein Kommunikator definiert eine Gruppe von Prozessen, die mit einander kommunizieren199können. In dieser Gruppe von Prozessen hat jeder Prozesse einen eindeutigen200\textit{Rang}\xindex{Rang}, den sie zur Kommunikation nutzen.201202Die Grundlage der Kommunikation bilden \textit{send} und \textit{receive} Operationen.203Prozesse schicken Nachrichten an andere Prozesse, indem sie den eindeutigen Rang204und einen \textit{tag} angeben, der die Nachricht identifiziert.205206Wenn ein Prozess mit einem einzigen weiteren Prozess kommuniziert, wird dies207\textit{Punkt-zu-Punkt-Kommunikation}\xindex{Punkt-zu-Punkt-Kommunikation} genannt.208209Wenn ein Prozess allen anderen eine Nachricht schickt, nennt man das \textit{Broadcast}\xindex{Broadcast}.210211\index{Parallelität|)}212213