Compare commits

..

1 Commits

Author SHA1 Message Date
Marco Ammon
857ad42140 Steensgard konkretisiert 2020-08-14 12:56:20 +02:00
2 changed files with 16 additions and 80 deletions

Binary file not shown.

View File

@@ -212,7 +212,7 @@
\item Vorverarbeitung: und sowie Wertgleichheit
\end{itemize}
\item Kopienfortschreibung: \begin{itemize}
\item Eine Bitposition pro aus Kopieren entstandener Wertgleichtheitsbeziehung
\item Eine Bitposition pro aus Kopieren entstandener Wergleichtheitsbeziehung
\item Setzen bei Kopieroperation
\item Zurücksetzen wenn Original oder Kopie mindestens schwach definiert wird
\item Anfangsbelegung: false
@@ -316,51 +316,6 @@
\item Falls $t$ in unbesuchten Blöcken nicht geändert wurde, $\mathrm{wn}_Z(t) = \phi'(\mathrm{wn}_X(t),\mathrm{wn}_Y(t))$ löschen und alle Verwendungen von $\mathrm{wn}_Z(t)$ durch $\mathrm{wn}_X(t)$ ersetzen
\end{itemize}
\end{itemize}
\newpage
\subsubsection{Wertnummerierungsverfahren nach Click/Braun (aus Übung)}
\begin{algorithmic}
\Function{Visit}{Basisblock $b$}
\State Wertnummerierung mit ReadVar/WriteVar durchführen
\ForAll{KFG-Nachfolger $s$ von $b$}
\If{$b$ ist letzter Vorgänger (höchste Tiefensuchnummer) von $s$}
\State \Call{Seal}{$s$}
\EndIf
\If{$s$ noch nicht besucht}
\State \Call{Visit}{$s$}
\EndIf
\EndFor
\EndFunction
\Statex
\Function{Seal}{Basisblock $b$}
\ForAll{vorläufige $\phi$-Funktion für Variable $v$ in $b$}
\ForAll{KFG-Vorgänger $p$ von $b$}
\State \Call{ReadVar}{$v$, $p$} als Operand zu $\phi$-Funktion hinzufügen
\EndFor
\EndFor
\EndFunction
\Statex
\Function{WriteVar}{Variable $v$, Basisblock $b$}
\State \Return nächste frische Wertnummer für $v$
\EndFunction
\Statex
\Function{ReadVar}{Variable $v$, Basisblock $b$}
\If{$b$ enthält bereits Wertnummer für $v$}
\State \Return Wertnummer für $v$ in $b$
\EndIf
\If{$b$ ist noch nicht versiegelt}
\State vorläufige $\phi$-Funktion mit nächster Wertnummer für $v$ in $b$ einfügen
\State \Return Wertnummer der $\phi$-Funktion
\ElsIf{$b$ hat nur einen Vorgänger $p$}
\State \Return \Call{ReadVar}{$v$, $p$}
\Else
\State $phi$-Funktion mit nächster Wertnummer für $v$ in $b$ in einfügen
\ForAll{KFG-Vorgänger $p$ von $b$}
\State \Call{ReadVar}{$v$, $p$} als Operand zu $\phi$-Funktion hinzufügen
\EndFor
\State \Return Wertnummer der $\phi$-Funktion
\EndIf
\EndFunction
\end{algorithmic}
\subsection{Optimierungen auf SSA-Form}
\begin{itemize}
@@ -494,7 +449,6 @@
\mathit{Ptr}(P',x) & sonst
\end{cases*}
\end{equation*}
\item Bei Flussfunktion $\mathit{ptr}_P(*c)$ für alle $k \in \mathit{Ptr}(P, c)$ Wissen $\mathit{Ptr}(P, k)$ berechnen
\end{itemize}
\end{itemize}
@@ -556,19 +510,19 @@
\item $a = \&b$: Kante zwischen $a$ und $b$ einfügen; sofern bereits Kante zwischen $a$ und $x$ existiert, rekursives Verschmelzen von $x$ und $b$
\item $a = b$:\begin{itemize}
\item $b$ ist Zeiger: Verschmelzen der Ziele von $a$ und $b$, anschließend zeigen beide auf diesen Knoten
\item $b$ ist kein Zeiger bzw. noch nicht erkannt: Annotiere $b$ mit $\lbrace a = b\rbrace$ (Falls später Zeigerziel $y$ von $b$ entdeckt wird, muss Kante von $a$ nach $y$ ergänzt werden)
\item $b$ ist kein Zeiger bzw. noch nicht erkannt: Annotiere $b$ mit $(a:b)$ (Falls später Zeigerziel $y$ von $b$ entdeckt wird, muss Kante von $a$ nach $y$ ergänzt werden)
\end{itemize}
\item $a = *b$: \begin{itemize}
\item $b$, $*b$ haben bereits ausgehende Kanten: Kante zwischen $a$ und $**b$ ergänzen
\item sonst: analog zu $a = b$ mit adäquaten Annotationen
\item sonst: analog zu $a = b$ mit adäquaten Annotationen (TODO: Übung)
\end{itemize}
\item $*a = b$: \begin{itemize}
\item $a$, $*a$ mit ausgehenden Kanten: rekursives Verschmelzen von $*b$ und $**a$
\item $a$ noch ohne ausgehende Kante: Annotation von $a$ mit $\lbrace *a = b\rbrace$
\item $a$ noch ohne ausgehende Kante: Annotation von $a$ mit $(b:*a)$
\end{itemize}
\item $a = b \oplus c$ mit $\oplus$ binärer Operation: \begin{itemize}
\item $a$, $b$, $c$ nicht als Zeiger erkannt: Annotation von $b$ und $c$ mit $\lbrace a= b\rbrace$ bzw. $\lbrace a= c\rbrace$
\item $b$ oder $c$ Zeiger: Kante von $a$ nach $*b$ hinzufügen, $c$ mit $\lbrace a = b\rbrace$ annotieren
\item $a$, $b$, $c$ keine Zeiger: Annotation von $b$ und $c$ mit $(a:b)$ bzw. $(a:c)$
\item $b$ oder $c$ Zeiger: Kante von $a$ nach $*b$ hinzufügen, $c$ mit $(a:c)$ annotieren
\end{itemize}
\item $x = p(y_1, \textellipsis, y_n)$ mit Funktion $p(z_1, \textellipsis, z_n)$ \begin{enumerate}
\item Zuweisungsregeln $z_i = y_i$ verwenden
@@ -605,7 +559,7 @@
\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, nach denen die Variable lebendig ist, dominiert und alle die Variable nutzenden Blöcke strikt dominiert (oder in definierendem Block nach Definition auftritt)
\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
@@ -711,8 +665,7 @@
\subsection{Indexanalyse}
\begin{itemize}
\item Bestimmung, ob 2 Array-Zugriffe selbe bzw. unterschiedliche Elemente ansprechen: Grundannahme pessimistisch (gleiches Element)
\item Für 2 Array-Zugriffe $S1$ $A[f_1(i_1, \textellipsis, i_d), \textellipsis, f_m(i_1, \textellipsis, i_d)]$ und\\
$S2$ $A[g_1(i_1, \textellipsis, i_d), \textellipsis, g_m(i_1, \textellipsis, i_d)]$ gilt $S1 \delta S2$ $\Leftrightarrow$:\begin{itemize}
\item Für 2 Array-Zugriffe $S1: A[f_1(i_1, \textellipsis, i_d), \textellipsis, f_m(i_1, \textellipsis, i_d)]$ und $S2: A[f_1(i_1, \textellipsis, i_d), \textellipsis, f_m(i_1, \textellipsis, i_d)]$ gilt $S1 \delta S2$ $\Leftrightarrow$:\begin{itemize}
\item mindestens ein Schreibzugriff
\item $\exists I, J: I=(i_1, \textellipsis, i_d) \angle J =(j_1, \textellipsis, j_d)$ mit $I, J$ innerhalb der Schleifengrenzen (Ungleichunssystem mit Nebenbedingungen)
\item $\forall p: f_p(I) = g_p(J)$ (Gleichungssystem mit Schleifenlaufvariablen als Variablen und Konstanten aus linearem Index-Ausdruck als Koeffizienten)
@@ -725,16 +678,13 @@
\item Für verschiedene Arten der Abhängigkeit in obige Kriterien einsetzen
\end{enumerate}
\item Ungleichungstest:\begin{enumerate}
\item Ungleichungen für im Code verwendete Variablen $i$ mit $i_\mathrm{w}$, $i_\mathrm{r}$ für Schreib- und Lesezugriff aufstellen:\begin{enumerate}
\item Ungleichungen für Schleifengrenzen
\item Ungleichungen für relative Beziehung von $i_\mathrm{w}$ und $i_\mathrm{r}$
\end{enumerate}
\item Ungleichungen für verwendete Variablen aufstellen
\item Gleichung für Zugriff aufstellen und so umstellen, dass 0 auf einer Seite steht
\item In Gleichung jeweils untere und obere Grenzwerte einsetzen und damit ein Intervall bestimmen
\item Sofern Intervall nicht 0 enthält, keine Abhängigkeit
\end{enumerate}
\item Fourier-Motzkin-Test: \begin{itemize}
\item Ungleichungssystem in kanonische Form ($\le c$, $c$ Konstante) überführen \begin{itemize}
\item Ungleichungssystem in kanonische Form überführen: \begin{itemize}
\item $\beta < b \cdot z$ untere Schranke für $z$ mit $\beta > 0$
\item $a \cdot z < \alpha$ obere Schranke für $z$ mit $\alpha > 0$
\end{itemize}
@@ -742,22 +692,6 @@
\begin{equation*}
a\cdot \beta \leq a \cdot z \cdot b \leq b\cdot \alpha \rightarrow a\cdot \beta \leq b\cdot \alpha
\end{equation*}
\item Algorithmus aus Übung: \begin{algorithmic}
\Repeat
\State Unbekannte $x_j$ auswählen
\State $L \gets \lbrace i \mid a_{ij} < 0 \rbrace$
\State $U \gets \lbrace i \mid a_{ij} > 0 \rbrace$
\ForAll{$i \in L \cup U$}
\State Reihe $i$ mit $\vert a_{ij}\vert$ normalisieren
\EndFor
\ForAll{$i \in L$}
\ForAll{$k \in U$}
\State Füge Ungleichung $A_{[i]} + A {[k]} \leq b_i + b_k$ hinzu
\EndFor
\EndFor
\State Ignoriere/Lösche alle Reihen aus $L \cup U$
\Until{System aus trivialen Ungleichungen}
\end{algorithmic}
\item Kleineres Problem $a\cdot \beta \leq b\cdot \alpha$ rekursiv lösen:\begin{itemize}
\item keine Lösung $\rightarrow$ unabhängig
\item Lösung existiert $\rightarrow$ Prüfung, ob auch ganzzahlige Lösung für $a\cdot z\cdot b$ existiert
@@ -769,7 +703,7 @@
\subsection{Entfernung von schleifengetragenen Datenabhängigkeiten}
\begin{itemize}
\item Legalität: Für jede Datenabhängigkeit muss die relative Reihenfolge auch nach Anwendung der Transformation bzw. Restrukturierung erhalten bleiben, d.h. die entstehenden Abhängigkeits\-distanz\-vektoren dürfen nicht lexikographisch negativ sein und müssen ihre Datenabhängigkeitsart behalten
\item Legalität: Für jede Datenabhängigkeit muss die relative Reihenfolge auch nach Anwendung der Transformation bzw. Restrukturierung erhalten bleiben, die entstehenden Abhängigkeitsdistanzvektoren nicht lexikographisch sein
\end{itemize}
\subsubsection{Schleifentransformationen}
@@ -860,9 +794,11 @@
\item ggf. Ermöglichung weiterer Optimierungen wie Verschmelzung
\end{itemize}
\item Neigen:\begin{itemize}
\item Verschiebung des Array-Indexbereichs der inneren Schleife um $f \cdot i$ mit $f$ Neigungsfaktor und $i$ Iterationsvariable der äußeren Schleife
\item Abzug von $f \cdot i$ bei Verwendungen der inneren Iterationsvariable
\item Abhängigkeit $(d_1, d_2)$ wird zu $(d_1, d_2 + f \cdot d_1)$ $\rightarrow$ Ermöglichung weiterer Restrukturierungen
\item Schleifenneigen:\begin{itemize}
\item Verschiebung des Array-Indexbereichs der inneren Schleife um $f \cdot i$ mit $f$ Neigungsfaktor und $i$ Iterationsvariable der äußeren Schleife
\item Abzug von $f \cdot i$ bei Verwendungen der inneren Iterationsvariable
\item Abhängigkeit $(d_1, d_2)$ wird zu $(d_1, d_2 + f \cdot d_1)$ $\rightarrow$ Ermöglichung weiterer Restrukturierungen
\end{itemize}
\end{itemize}
\item Allgemeiner Fall:\begin{itemize}
\item Transformation der Indexvektoren mit Matrix $U$ mit Eigenschaften (unimodular):\begin{itemize}