% !TeX spellcheck = de_DE
\subsection{Lastausgleich}
\begin{itemize}
	\item meist durch Verteilung der Datenstrukturen einer Anwendung anhand von Heuristiken
	\item \begriff{statisch}, falls Ausführungszeiten vorher bekannt:\begin{itemize}
		\item \begriff{Koordinaten-Bisektion}:\begin{itemize}
			\item jedem Punkt Koordinaten zuordnen
			\item entlang längster Achse sortieren und in gleich große Gruppen partitionieren
			\item jetzt längste Achse wählen und rekursiv in Teilgruppen fortsetzen
			\item einfach implementierbar und parallel berechenbar
			\item keine Berücksichtigung von Kommunikationsbeziehungen (Kommunikation insbesondere oft über Gruppen hinweg)
		\end{itemize}
		\item \begriff{Graph-Koordinate}:\begin{itemize}
			\item zwei Knoten mit größter Distanz im Graphen wählen
			\item pro Extremknoten möglichst gleich große Gruppe an nahegelegenen Punkten wählen
			\item rekursiv in Teilgruppen fortsetzen
			\item Berücksichtigung der Kommunikationsbeziehungen
			\item kompliziertere Distanzberechnung und potentiell ungleiche Lastverteilung
		\end{itemize}
	\end{itemize}
	\item \begriff{dynamisch}, falls Ausführungszeiten erst zur Laufzeit bestimmt:\begin{itemize}
		\item  diffusionsbasierte (synchron und asynchron) Algorithmen: \begin{itemize}
			\item lokal, basiert auf Nachbarschaftsinformationen
			\item sukzessive Migration
			\item für Gitterprobleme besonders geeignet
		\end{itemize}		
		\item synchron-parallele Algorithmen (\enquote{scratch and map}): \begin{itemize}
			\item global, Neuverteilung der Rechenlast
			\item für switch-basierte Netzwerke wie Cluster besonders geeignet
			\item \begriff{Tree-Walking}-Algorithmus:\begin{itemize}
				\item synchron
				\item Anstoß, wenn Warteschlange an Threads für Knoten unter Schwelle fällt, durch Nachricht an Nachbarn (und Weiterverbreitung)
				\item jeder Knoten sammelt Last-Informationen seiner Kindknoten bis zur Wurzel hoch
				\item Durchschnittslast $l_\text{avg} = \lfloor \frac{W}{N}\rfloor$ und Rest $l_\text{rem} = W \mod N$ an alle Kinder rekursiv verteilen
				\item Ausgleichsanteil $Q = l_\text{avg} \cdot \#\text{PEs in Unterbaum}$ pro Knoten bestimmen
				\item falls $Q - W > 0$, Empfang von $Q - W$ Tasks von Eltern-Knoten
				\item sonst Senden von $W - Q$ Tasks an Eltern-Knoten
				\item hoher Kommunikationsaufwand
			\end{itemize}
			\item \begriff{Switch-Walking}-Algorithmus:\begin{itemize}
				\item verteilte Berechnung der Lastinformationen
				\item Start-Nachricht durch \begriff{In-Fat}-Algorithmus verteilen (rekursives Senden an den an der Grenze liegenden Prozessor der andern Hälfte)
				\item Last-Informationen durch \begriff{All-Gather}-Algorithmus einsammeln (Umkehrung von In-Fat-Verfahren)
				\item Last-Informationen global durch In-Fat-Algorithmus wieder verteilen
				\item in jedem Knoten $l_\text{avg}$ und $l_\text{rem}$ bestimmen und für jeden Knoten Über- bzw. Unterschuss berechnen
				\item überschüssige Tasks versenden, fehlende Empfangen
			\end{itemize} 
		\end{itemize}
	\end{itemize}
\end{itemize}