Folien VL-11 zusammengefasst

This commit is contained in:
Marco Ammon 2020-08-12 12:35:47 +02:00
parent e605f24f47
commit 0bc34fb409
2 changed files with 115 additions and 4 deletions

Binary file not shown.

View File

@ -410,8 +410,9 @@
\end{itemize} \end{itemize}
\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} \begin{itemize}
\item Laufzeit: $\mathcal{O}(n^2 + n \cdot e)$
\item Alias-Quellen in Sprachen ohne \&-Operator: \begin{itemize} \item Alias-Quellen in Sprachen ohne \&-Operator: \begin{itemize}
\item Übergabe globaler Variable an Funktion \item Übergabe globaler Variable an Funktion
\item Übergabe der gleichen Variable an mehrere formale Parameter einer Funktion \item Übergabe der gleichen Variable an mehrere formale Parameter einer Funktion
@ -450,7 +451,7 @@
\end{enumerate} \end{enumerate}
\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} \begin{itemize}
\item Speichergraph: \begin{itemize} \item Speichergraph: \begin{itemize}
\item Knoten: eine oder mehrere Speicherstellen \item Knoten: eine oder mehrere Speicherstellen
@ -617,8 +618,118 @@
\end{itemize} \end{itemize}
\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} \end{document}