diff --git a/verfahren.pdf b/verfahren.pdf index e505110..e80ce5a 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index af38f72..ad9d088 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -136,10 +136,10 @@ \section{Datenflussanalyse} \begin{itemize} - \item Datenabhängigkeiten: \begin{itemize} - \item Schreiben vor Lesen: - \item Schreiben vor Schreiben: Ausgabeabhängigkeit - \item Lesen vor Schreiben: Anti-Abhängigkeit + \item Datenabhängigkeiten verhindern Umordnen: \begin{itemize} + \item Schreiben vor Lesen: Flussabhängigkeit $\delta^\mathrm{f}$ + \item Schreiben vor Schreiben: Ausgabeabhängigkeit $\delta^\mathrm{o}$ + \item Lesen vor Schreiben: Antiabhängigkeit $\delta^\mathrm{a}$ \end{itemize} \item Starke Variablendefinition: sichere Zuweisung zu einer Variablen \item Schwache Variablendefinition: mögliche Zuweisung zu einer Variablen (etwa über Zeiger oder Referenz, die möglicherweise auf Variable zeigen) @@ -569,7 +569,54 @@ \item Verringerung der Anzahl von Array-Bereichstests ggf. möglich \end{itemize} -\subsection{Schleifen und Arrays} +\subsection{Datenabhängigkeiten in Schleifen und Arrays} +\begin{itemize} + \item Schleifenunabhängige Datenabhängigkeiten: existieren auch ohne Schleife (etwa wenn im Rumpf) + \item Schleifengetragene Datenabhängigkeiten: resultieren ausschließlich aus Schleife (etwa zwischen verschiedenen Iterationen) + \item Iterationsvektor $i = (i_1, i_2, \textellipsis, i_d)$ für $d$ geschachtelte Schleifen\begin{itemize} + \item eindeutig für jede Iteration + \item lexikographische Ordnung auf Iterationsvektoren + \item $i \angle j$ $\Leftrightarrow$ Iteration $i$ zur Laufzeit vor Iteration $j$ + \end{itemize} + \item Iterationsraum: Menge aller möglichen Iterationsvektoren + \item Abhängigkeitsdistanz (bei geschachtelten Schleifen Vektor) $d$: Bei Datenabhängigkeit zwischen Iteration $i_\mathrm{source}$ und $j_\mathrm{target}$ und $i_\mathrm{source} \angle j_\mathrm{target}$, dann $i_\mathrm{source} + d = j_\mathrm{target}$ + \item Abhängigkeitsrichtung: Vergröberung der Abhängigkeitsdistanz mit folgenden Ersetzungen an jeder Position des Vektors: \begin{equation*} + r_i = \begin{cases*} + = & falls $0 = d_i$\\ + < & falls $0 < d_i$\\ + > & falls $0 > d_i$ + \end{cases*} + \end{equation*} + \item Richtungsvektor: Zusammenfassung aller Abhängigkeitsrichtungen einer Schleife:\begin{itemize} + \item \enquote{übliche} Zusammenfassungen (z.B. $=$ und $<$ zu $\leq$) + \item keine Aussage $*$ bei $<$ und $>$ + \end{itemize} + \item Die Abhängigkeit tragende Schleife $p$ folgt aus der Struktur der Abhängigkeitsdistanzen bei Inkrementschleifen: + \begin{equation*} + (\underbrace{d_1, d_2, \textellipsis}_{0}, \underbrace{d_p}_{>0}, \underbrace{\textellipsis, d_n}_{\mathrm{beliebig}}) + \end{equation*} + \item Parallele Ausführbarkeit aller Iterationen einer Schleife $p$ gegeben, wenn \begin{itemize} + \item diese keine Abhängigkeit trägt (alle Abhängigkeitsdistanzen haben $d_p = 0$) oder + \item jede schleifengetragene Abhängigkeit von einer $p$ umgebenden Schleife getragen wird (für jede Abhängigkeitsdistanz $\exists q < p: d_q > 0$) + \end{itemize} + \item Parallele Ausführung nicht immer gewinnbringend, da auf Cache-Ebene Abhängigkeiten auftreten können (\enquote{False Sharing}) + \item Optimierungsmöglichkeiten:\begin{itemize} + \item Skalare Ersetzung von Array-Ausdrücken (\enquote{register pipelining}), wenn: \begin{itemize} + \item Abhängigkeit wird von innerster Schleife getragen + \item Konstante Abhängigkeitsdistanz $d$ + \item $d+1$ freie Register + \end{itemize}\begin{enumerate} + \item Vor Schleife Initialisierung der Register und \enquote{Abschälen} der ersten $d$ Iterationen + \item In Schleife Benutzung der Register bei Lesezugriff und Speicherung der Registerinhalte bei Speicherzugriff, sowie am Anfang des Rumpfs \enquote{Aufrücken} der Register + \end{enumerate} + \item Skalar-Vervielfachung: Einführung eines Arrays zur Elimination von unnötigen Abhängigkeiten einer Temporärvariable + \item Verbesserung der zeitlichen Lokalität durch optimierte Registerverwendung + \item Verbesserung der räumlichen Lokalität durch optimierte Cache-Verwendung + \item Parallelisierung/Vektorisierung von Schleifen + \item Daten-/Prozessplatzierung zur Kommunikationsoptimierung + \end{itemize} +\end{itemize} + \subsection{Schleifentransformationen}