Folien VL-10 zusammengefasst

This commit is contained in:
Marco Ammon 2020-08-12 11:11:50 +02:00
parent 927a0edfa1
commit e605f24f47
2 changed files with 52 additions and 5 deletions

Binary file not shown.

View File

@ -136,10 +136,10 @@
\section{Datenflussanalyse} \section{Datenflussanalyse}
\begin{itemize} \begin{itemize}
\item Datenabhängigkeiten: \begin{itemize} \item Datenabhängigkeiten verhindern Umordnen: \begin{itemize}
\item Schreiben vor Lesen: \item Schreiben vor Lesen: Flussabhängigkeit $\delta^\mathrm{f}$
\item Schreiben vor Schreiben: Ausgabeabhängigkeit \item Schreiben vor Schreiben: Ausgabeabhängigkeit $\delta^\mathrm{o}$
\item Lesen vor Schreiben: Anti-Abhängigkeit \item Lesen vor Schreiben: Antiabhängigkeit $\delta^\mathrm{a}$
\end{itemize} \end{itemize}
\item Starke Variablendefinition: sichere Zuweisung zu einer Variablen \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) \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 \item Verringerung der Anzahl von Array-Bereichstests ggf. möglich
\end{itemize} \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} \subsection{Schleifentransformationen}