diff --git a/verfahren.pdf b/verfahren.pdf index e80ce5a..ae12280 100644 Binary files a/verfahren.pdf and b/verfahren.pdf differ diff --git a/verfahren.tex b/verfahren.tex index ad9d088..dea1b4c 100644 --- a/verfahren.tex +++ b/verfahren.tex @@ -410,8 +410,9 @@ \end{itemize} \end{itemize} -\subsection{Standard-Verfahren zur interprozeduralen, fluss-insensitiven may-Analyse mit $\mathcal{O}(n^2 + n \cdot e)$} +\subsection{Standard-Verfahren zur interprozeduralen, fluss-insensitiven may-Analyse} \begin{itemize} + \item Laufzeit: $\mathcal{O}(n^2 + n \cdot e)$ \item Alias-Quellen in Sprachen ohne \&-Operator: \begin{itemize} \item Übergabe globaler Variable an Funktion \item Übergabe der gleichen Variable an mehrere formale Parameter einer Funktion @@ -450,7 +451,7 @@ \end{enumerate} \end{enumerate} -\subsection{Steensgards Algorithmus für interprozedurale, fluss-insensitive may-Analyse} +\subsection{Steensgards Algorithmus zur interprozeduralen, fluss-insensitiven may-Analyse} \begin{itemize} \item Speichergraph: \begin{itemize} \item Knoten: eine oder mehrere Speicherstellen @@ -617,8 +618,118 @@ \end{itemize} \end{itemize} +\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[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) + \end{itemize} + \item Aus Laufzeitgründen lediglich Tests, sonst pessimistische Grundannahme: \begin{itemize} + \item GGT-Test:\begin{enumerate} + \item Gleichsetzen der beiden Array-Ausdrücke + \item Konstante auf eine Seite umformen + \item Abhängigkeit nur dann möglich, wenn der größte gemeinsame Teiler der Koeffizienten die Konstante teilt + \item Für verschiedene Arten der Abhängigkeit in obige Kriterien einsetzen + \end{enumerate} + \item Ungleichungstest:\begin{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 ü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} + \item Mit Fourier-Motzkin-Elimination Variable $z$ eliminieren: + \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 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 + \end{itemize} + \end{itemize} + \end{itemize} +\end{itemize} -\subsection{Schleifentransformationen} -\subsection{Schleifenrestrukturierungen} +\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, die entstehenden Abhängigkeitsdistanzvektoren nicht lexikographisch sein +\end{itemize} + +\subsubsection{Schleifentransformationen} +\begin{itemize} + \item Erhalten Durchlaufreihenfolge + \item Neuausrichtung:\begin{itemize} + \item Verschiebung der Ausführung einer Anweisung um $d$ Iterationen (wobei $d$ konstante Abhängigkeitsdistanz ist) + \item Bedingte Anweisungen für die ersten und letzten $d$ Anweisungen zur Erhaltung der Semantik + \end{itemize} + \item Ausrollen um Faktor $f$: \begin{itemize} + \item Pro Iteration der neuen Schleife gleich $f$ Iterationen der alten Schleife ausführen + \item Reduktion des Schleifenoverheads + \item Vergrößerung des Codes + \end{itemize} + \item Bereichtsteilen: \begin{itemize} + \item Iterationsbereich wird auf zwei Schleifen mit jeweils gleichem Rumpf aufgeteilt + \item ermöglicht weitere Optimierungen (etwa mit DFA oder Vektorisierung) + \item Vergrößerung des Codes + \end{itemize} + \item Schälen (Spezialfall des Bereichsteilens):\begin{itemize} + \item erste (oder letzte) Iteration der Schleife werden herausgezogen um spezielle Datenabhängigkeiten zu eliminieren + \item ermöglicht oft Parallelisierung der Restschleife + \item ergänzt Neuausrichtung + \end{itemize} + \item Produktschleifenbildung:\begin{itemize} + \item Kombination geschachtelter Schleifen zu einer Schleife durch Multiplikation der Bereiche + \item Produktgröße oft besser geeignet für Parallelisierung/Vektorisierung + \item fügt ggf. abhängige Induktionsvariablen ein + \item verhindert möglicherweise andere Optimierungen + \end{itemize} + \item Streifenschneiden:\begin{itemize} + \item Aufteilen des Schleifenbereichs in mehrere Bereiche (Blöcke, Streifen) bestimmter Größe + \item verbessert Parallelisierung/Vektorisierung der Schleife + \item oft nach Produktschleifenbildung + \item erhöht Schleifenoverhead durch zusätzliche Abhängigkeitsdimension + \end{itemize} +\end{itemize} + +\subsubsection{Schleifenrestrukturierungen} +\begin{itemize} + \item Ändern Durchlaufreihenfolge + \item Verschmelzung:\begin{itemize} + \item Zusammenfassen der Rümpfe mehrerer Schleifen + \item Voraussetzungen:\begin{itemize} + \item beide Schleifen haben gleichen Indexbereich + \item Namensgleichheit beider Laufvariablen kann durch Umbenennung erreicht werden + \item Bei keiner Skalarnutzung in zweiter Schleife darf es erreichende Definition aus anderer Schleife geben + \end{itemize} + \item Legalität: Es darf keine Abhängigkeit zwischen einer Instruktion aus der zweiten Schleife mit einer aus der ersten in einer späteren Iteration entstehen + \item Reduktion des Schleifenoverheads + \item größere Grundblöcke erlauben effizientere lokale Optimierungen + \item ggf. verbesserte zeitliche Lokalität + \end{itemize} + \item Rumpfteilen:\begin{itemize} + \item Aufteilen des Rumpfs einer Schleife auf mehrere Schleifen + \item Gegenteil der Verschmelzung + \item Legalität: \begin{itemize} + \item Anweisungen, die in starken Zusammenhangskomponenten des Abhängigkeitsgraphs der zu teilenden Schleife liegen, dürfen nicht auf verschiedene Schleifen verteilt werden + \item Reihenfolge der Schleifen muss Abhängigkeiten vor dem Teilen widerspiegeln + \end{itemize} + \item kleinere Grundblöcke verringern ggf. Registerdruck + \item kleinere Rümpfe passen besser in den Instruktionscache + \item ggf. kann eine der Schleifen parallelisiert/vektorisiert werden + \end{itemize} + \item Kachelschneiden +\end{itemize} +\paragraph{Lineare Schleifenrestrukturierungen} +\begin{itemize} + \item Schleifenvertauschung + \item Richtungsumkehr + \item Schleifenneigen +\end{itemize} \end{document}