Folien VL-09 zusammengefasst

This commit is contained in:
Marco Ammon 2020-08-12 10:19:41 +02:00
parent 66b3b16f04
commit 927a0edfa1
2 changed files with 82 additions and 4 deletions

Binary file not shown.

View File

@ -488,12 +488,90 @@
\end{itemize} \end{itemize}
\end{enumerate} \end{enumerate}
\section{Schleifen}
\subsection{Schleifeninvariante Anweisungen}
\begin{itemize}
\item schleifeninvariante Instruktion: alle Operanden $v$ sind \begin{itemize}
\item konstant oder
\item nur außerhalb der Schleife berechnet oder
\item innerhalb der Schleife in \emph{einer} schleifeninvarianten Instruktion berechnet
\end{itemize}
\item Auffinden schleifeninvarianter Instruktionen: \begin{enumerate}
\item Identifikation natürlicher Schleifen
\item Berechnung der erreichenden Definitionen
\item Konstantenfaltung
\item Markierung aller konstanten Ausdrücke und Variablen, sowie alle Markierung, deren erreichende Definitionen außerhalb der Schleife liegen, als schleifeninvariant
\item Solange neue Markierungen auftreten: alle Instruktionen/Variablen als schleifeninvariant markieren, wenn \begin{itemize}
\item sie konstant sind oder
\item wenn alle erreichenden Definitionen außerhalb der Schleife liegen oder
\item wenn genau eine erreichende Definition existiert und diese als schleifeninvariant markiert ist
\end{itemize}
\end{enumerate}
\item Herausziehen von schleifeninvarianten (Teil-)Ausdrücken vor den Schleifenkopf unter Beachtung von Seiteneffekten/Fehlern immer möglich
\item Auswahl von herausziehbaren Zuweisungen: \begin{enumerate}
\item Berechnung der Dominanz, erreichenden Definitionen und Anwendung von Konstantenfaltung
\item Berechnung der invarianten Instruktionen
\item Bestimmung der Schleifenausgänge, also Knoten, die KFG-Nachfolger außerhalb der natürlichen Schleife besitzen
\item Alle Anforderungen an Zuweisungen müssen für Herausziehbarkeit gelten:\begin{itemize}
\item schleifeninvariant
\item in Grundblock, der alle Schleifenausgänge dominiert und alle die Variable nutzenden Blöcke strikt dominiert
\item einzige Zuweisung zu Variable in der ganzen Schleife
\end{itemize}
\item Herausziehen vor den Schleifenkopf in Breitensuchreihenfolge zur Bewahrung der Datenabhängigkeiten zwischen herausgezogenen Zuweisungen
\end{enumerate}
\item Sonderfall while-Schleife: Schleifenausgang wird von keinem anderen Grundblock in der Schleife dominiert, also keine herausziehbaren Zuweisungen in der Schleife $\rightarrow$ erst Umbau zu do-while-Schleife
\item Optimierung bei invariantem Test: Generierung einer eigenen Schleife für jeden Fall
\end{itemize}
\section{Induktionsvarianten und schleifeninvarianter Code} \subsection{Induktionsvariablen}
\begin{itemize}
\item Induktionsvariable: Variable, die bei jeder Schleifeniteration um konstanten Wert inkrementiert oder dekrementiert wird
\item Einfache Induktionsvariable: Variable $x$, die nur durch $x = x \pm c$ mit schleifeninvariantem $c$ verändert wird
\item Abhängige Induktionsvariable: Variable $y$, die in der Schleife durch $y = a \cdot x \pm b$ mit schleifeninvarianten $a$ und $b$ als lineare Funktion aus Induktionsvariable $x$ berechnet wird
\item Berechnung der Familie einer einfachen Induktionsvariable $x$: Menge der Induktionsvariablen $y$, die mit linearer Funktion $y = c_1 \cdot x \pm c_2$ von $x$ mit schleifeninvarianten $c_1$ und $c_2$ abhängen: \begin{itemize}
\item Zuweisung der Form $y = c_1 \cdot x \pm c_2$
\item Zuweisung der Form $y = c_1 \cdot z \pm c_2$, wobei $z \in \mathrm{Familie}(x)$ und \begin{itemize}
\item keine Veränderung von $x$ zwischen Zuweisung zu $z$ und Zuweisung zu $y$
\item keine von außerhalb der Schleife erreichende Definition von $z$ erreicht Zuweisung zu $y$
\end{itemize}
\end{itemize}
\item Berechnungen der Tripel $(x, c_1, c_2)$ für alle Induktionsvariablen $y$ einer Schleife:\begin{enumerate}
\item Berechnung von Schleifeninvarianz und erreichenden Definitionen
\item Bestimmung aller einfachen Induktionsvariablen durch Code-Inspektion (\enquote{Pattern Matching})
\item Bestimmung aller Variablen $y$ mit einziger (oder identischen) Zuweisung der Form $y = x \pm c$ oder $y = c \cdot x$ mit $x$ Induktionsvariable und $c$ schleifeninvariant:\begin{itemize}
\item $x$ ist einfache Induktionsvariable:
\begin{equation*}
\mathrm{Tripel}(y) = \begin{cases*}
(x, 1, c) & falls $y = x + c$ oder $y = c + x$\\
(x, 1, -c)& falls $y = x - c$\\
(x, c, 0)& sonst ($y = x \cdot c$ oder $y = c \cdot x$)
\end{cases*}
\end{equation*}
\item $x$ ist abhängige Induktionsvariable mit Tupel $(u, d_1, d_2)$:
\begin{equation*}
\mathrm{Tripel}(y) = \begin{cases*}
(u, d_1, d_2 + c) & falls $y = x + c$ oder $y = c + x$\\
(u, d_1, d_2 - c) & falls $y = x - c$\\
(u, d_1 \cdot c, d_2 \cdot c_2) & sonst ($y = c \cdot x$ oder $y = x \cdot c$)
\end{cases*}
\end{equation*}
\end{itemize}
\end{enumerate}
\item Vereinfachung der Berechnungsvorschrift von Schleifenlaufvariablen pro Iteration (Reduktion der Ausdrucksstärke, \enquote{Strength Reduction}) für jede einfache Induktionsvariable $x$: \begin{enumerate}
\item Für jede von $x$ abhängige Induktionsvariable $y$ mit Tripel $(x, a, b)$:\begin{enumerate}
\item Einführung neuer Variable $y'$
\item Ersetzung der Zuweisung zu $y$ durch $y = y'$
\item Einfügen der Zuweisung $y' = y' \pm (a \cdot c)$ nach jeder Zuweisung $x = x \pm c$
\item Einfügen der Zuweisung $y' = x\cdot a + b$ vor dem Schleifenkopf
\end{enumerate}
\end{enumerate}
\item Modifikation von bedingten Sprüngen ggf. möglich
\item Verringerung der Anzahl von Array-Bereichstests ggf. möglich
\end{itemize}
\section{Schleifen und Arrays} \subsection{Schleifen und Arrays}
\section{Schleifentransformationen} \subsection{Schleifentransformationen}
\section{Schleifenrestrukturierungen} \subsection{Schleifenrestrukturierungen}
\end{document} \end{document}