added Images
BIN
Assets/RA2_ATiny.png
Normal file
After Width: | Height: | Size: 124 KiB |
BIN
Assets/RA2_Architekturen.png
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
Assets/RA2_Aufbau.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
Assets/RA2_Cache-Controller.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
Assets/RA2_Cache-Funktion.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
Assets/RA2_Cache-Index.png
Normal file
After Width: | Height: | Size: 214 KiB |
BIN
Assets/RA2_Cache-Tags.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
Assets/RA2_Cache-Tags2.png
Normal file
After Width: | Height: | Size: 65 KiB |
BIN
Assets/RA2_Cache-line.png
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
Assets/RA2_DRAM.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
Assets/RA2_Partitionierung.png
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
Assets/RA2_Pipeline.png
Normal file
After Width: | Height: | Size: 45 KiB |
BIN
Assets/RA2_Pipelines.png
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
Assets/RA2_Speicherhierarchie.png
Normal file
After Width: | Height: | Size: 141 KiB |
BIN
Assets/RA2_Tomasulo-Prinzip.png
Normal file
After Width: | Height: | Size: 115 KiB |
BIN
Assets/RA2_Vorhersagen.png
Normal file
After Width: | Height: | Size: 137 KiB |
@ -141,11 +141,11 @@
|
||||
\item 32-bit Architektur/64-bit Erweiterung
|
||||
\end{itemize*}
|
||||
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_Operanden.png}
|
||||
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_pipelineCPU.png}
|
||||
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_mehrzyklenCPU.png}
|
||||
\begin{center}
|
||||
\includegraphics[width=\textwidth/7]{Assets/RA2_Operanden.png}
|
||||
\includegraphics[width=\textwidth/7]{Assets/RA2_pipelineCPU.png}
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_mehrzyklenCPU.png}
|
||||
\end{center}
|
||||
|
||||
Aufgaben der einzelnen Phasen
|
||||
\begin{description*}
|
||||
@ -161,22 +161,22 @@
|
||||
\item resource hazards: Ressourcenabhängigkeiten
|
||||
\item data hazards: Datenabhängigkeiten
|
||||
\begin{description*}
|
||||
\item[Antidatenabhängig] Befehl j beschreibt Speicherzelle, die von i noch gelesen werden: WAR
|
||||
\item[Ausgabeabhängig] Befehle i und j beschreiben die selbe Speicherzelle: WAW (write after write)
|
||||
\item[Datenabhängigkeit] Operation hängt von vorhergehender Operation ab: RAW
|
||||
\item[Antidatenabhängig] WAR (write after read)
|
||||
\item[Ausgabeabhängig] WAW (write after write)
|
||||
\item[Datenabhängigkeit] RAW (read after write)
|
||||
\end{description*}
|
||||
\item control hazards: Kontrollabhängigkeiten
|
||||
\begin{itemize*}
|
||||
\item Gleichheit der Register wird in instruction decode-Stufe geprüft
|
||||
\item Sprungziel wird in separatem Adressaddierer in instruction decode-Stufe berechnet
|
||||
\item Gleichheit der Register in ID-Stufe prüfen
|
||||
\item Sprungziel in separatem Adressaddierer in ID berechnet
|
||||
\end{itemize*}
|
||||
\end{itemize*}
|
||||
|
||||
\subsection{Sprungvorhersage}
|
||||
\paragraph{Einfache lokale Prädiktoren}
|
||||
\begin{itemize*}
|
||||
\item Vorhersage, ob bedingter Sprung genommen wird oder nicht
|
||||
\item Prädiktion allein anhand der Historie des betrachteten, aktuellen Sprungs
|
||||
\item Vorhersage: bedingter Sprung genommen oder nicht
|
||||
\item Prädiktion anhand der Historie des betrachteten Sprungs
|
||||
\item Historie eines Sprungs wird mit 1 bis n Bits gepuffert
|
||||
\end{itemize*}
|
||||
|
||||
@ -189,20 +189,20 @@
|
||||
\item Prädiktion: Sprung verhält sich wie beim letzten Mal
|
||||
\item Nachfolgebefehle ab vorhergesagter Adresse holen
|
||||
\item Falls Prädiktion fehlerhaft: Prädiktionsbit invertieren
|
||||
\item Alle Sprünge, deren Adressen im Indexteil übereinstimmen, werden derselben Zelle im branch prediction buffer zugeordnet
|
||||
\item Sprünge, gleicher Adressen im Indexteil, werden selber Zelle im branch prediction buffer zugeordnet
|
||||
\item Einfachste Art von Puffer
|
||||
\item Hat eine bestimmte Kapazität
|
||||
\item Kann nicht für alle Sprünge Einträge enthalten
|
||||
\item Reduziert branch penalty nur, wenn branch delay länger als Berechnung der Zieladresse mit branch prediction buffer dauert
|
||||
\item Reduziert branch penalty, wenn branch delay $>$ Berechnung der Zieladresse mit branch p. buffer
|
||||
\item Prädiktion kann fehlerhaft sein
|
||||
\item Prädiktion kann von anderem Sprungbefehl stammen
|
||||
\end{itemize*}
|
||||
|
||||
\paragraph{Einführung von Tag Bits}
|
||||
\begin{itemize*}
|
||||
\item Sprünge, gleicher Adressen im Indexteil, in selber Zelle
|
||||
\item Tag: gültiger Eintrag, falls Tag-Bits gleich sind
|
||||
\item Alle Sprünge, deren Adressen im Indexteil übereinstimmen, werden derselben Zelle im branch prediction buffer zugeordnet. Überprüfung mittels tags, ob es der richtige Eintrag ist.
|
||||
\item Allgemein: Fehlerrate von 1-Bit Prädiktor ist für Sprünge in Schleifenkonstrukten doppelt so hoch wie die Anzahl ausgeführter Sprünge
|
||||
\item Fehlerrate 1-Bit-P in Schleifenkonstrukten doppelt so hoch wie Anzahl ausgeführter Sprünge
|
||||
\end{itemize*}
|
||||
|
||||
\paragraph{2 Bit Vorhersagen}
|
||||
@ -217,15 +217,15 @@
|
||||
\item Verwendet n-Bit Zähler
|
||||
\item Sättigungsarithmetik (kein wrap around bei Überlauf)
|
||||
\item Kann Werte zwischen $0$ und $2^{n-1}$ annehmen
|
||||
\item Wenn Zähler größer als Hälfte des Maximums $(2^{n-1})$: Vorhersagen, dass Sprung ausgeführt wird; ansonsten vorhersagen, dass Sprung nicht genommen wird
|
||||
\item Zähler wird bei ausgeführtem Sprung inkrementiert und bei nicht ausgeführtem dekrementiert
|
||||
\item Wenn Zähler größer als Hälfte des Maximums $(2^{n-1})$: Vorhersagen, dass Sprung ausgeführt wird
|
||||
\item Zähler bei ausgeführtem Sprung inkrementiert und bei nicht ausgeführtem dekrementiert
|
||||
\item Praxis: 2-Bit Prädiktor ähnlich gut wie n-Bit Prädiktor
|
||||
\end{itemize*}
|
||||
|
||||
\paragraph{Korrelierende Prädikatoren}
|
||||
\begin{itemize*}
|
||||
\item Betrachtet nur Verhalten eines Sprungs; rein lokal
|
||||
\item Verbesserung durch Betrachtung des Verhaltens anderer Sprünge
|
||||
\item Verbesserung durch Betrachtung anderer Sprünge
|
||||
\item erhält so korrelierenden/zweistufigen Prädiktor
|
||||
\item Prinzip: Aufgrund globaler Information wird einer von mehreren lokalen Prädiktoren ausgewählt
|
||||
\item Beziehen zur Vorhersage des Verhaltens Kontext-Information mit ein
|
||||
@ -254,8 +254,11 @@
|
||||
\item Vorhersagepuffer adressiert via Konkatenation von unteren Adressbits der Sprungbefehlsadresse
|
||||
\end{itemize*}
|
||||
|
||||
\paragraph{High Performance Befehlsdekodierung}
|
||||
\begin{center}
|
||||
\includegraphics[width=\textwidth/7]{Assets/RA2_Vorhersagen.png}
|
||||
\end{center}
|
||||
|
||||
\paragraph{High Performance Befehlsdekodierung}
|
||||
reine Vorhersage eines Sprungs i.d.R. nicht ausreichend
|
||||
\begin{itemize*}
|
||||
\item Befehlsstrom mit großer Bandbreite erforderlich
|
||||
@ -478,15 +481,7 @@
|
||||
\item Häufig benötigte Speicherinhalte in kleinen Speichern
|
||||
\end{itemize*}
|
||||
\begin{center}
|
||||
\begin{tabular}{c | c | c}
|
||||
Ebene & Latenz & Kapazität \\\hline
|
||||
Register & 100 ps & 1 KB \\
|
||||
Cache & 1 ns & 12 MB \\
|
||||
Hauptspeicher/RAM & 10 ns & 8 GB \\
|
||||
Festplatte & 10 ms & 1 TB \\
|
||||
CD-ROM/DVD & 100 ms & 50 GB \\
|
||||
Magnetbänder & 100 s & 5 TB
|
||||
\end{tabular}
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_Speicherhierarchie.png}
|
||||
\end{center}
|
||||
|
||||
\section{Speicherarchitekturen}
|
||||
@ -555,7 +550,7 @@
|
||||
\end{description*}
|
||||
\item Schreibstategien
|
||||
\begin{description*}
|
||||
\item[Write Back] Cache sammelt Schreibvorgänge und aktualisiert nur im Cache. Nach einer entsprechenden Anweisung werden Daten in den hauptspeicher kopiert (aktualisiert)
|
||||
\item[Write Back] Cache sammelt Schreibvorgänge und aktualisiert Speicher nach Anweisung
|
||||
\item[Copy Back] Rückschreiben erfolgt erst, wenn Cache-Zeile bei Miss verdrängt wird
|
||||
\item[Write Through] Daten werden sowohl im Cache als auch im Hauptspeicher aktualisiert
|
||||
% !{Write Trough vs Write Back; Quelle RA2 Vorlesung 2020/21](Assets/RA2_cache-write-trough-vs-back.png)
|
||||
@ -627,13 +622,14 @@
|
||||
\subsection{Pipeline Prozessoren}
|
||||
\begin{itemize*}
|
||||
\item Aufteilung eines Befehls in Teilbefehle
|
||||
\item parallele Abarbeitung verschiedener Teilbefehle von unerschiedlichen Befehlen möglich
|
||||
\item Probleme
|
||||
\item parallele Abarbeitung verschiedener Teilbefehle
|
||||
\item Problem: bedingte Sprünge (unvorhergesehen)
|
||||
\begin{itemize*}
|
||||
\item bedingte Sprünge (unvorhergesehen)
|
||||
\item LSG: Pipeline um 2 Schritte verzögern
|
||||
\item LSG: Sprungzielspekulation
|
||||
\item Datenabhängigkeit
|
||||
\end{itemize*}
|
||||
\item Problem: Datenabhängigkeit
|
||||
\begin{itemize*}
|
||||
\item LSG: Pipeline um 2 Schritte verzögern
|
||||
\item LSG: Out-of-Order Prinzip nutzen
|
||||
\item LSG: Forwarding Hardware
|
||||
@ -646,7 +642,7 @@
|
||||
\item Mikroarchitektur
|
||||
\item Befehlszuordnung und Konfliktvermeidung geschieht durch Hardware
|
||||
\item Speicherzugriffe automatisch von Load/Store Einheit
|
||||
\item ein Befehlsstrom mit einfachem Befehl an Ausführungseinheit
|
||||
\item Befehlsstrom mit einfachem Befehl an EX-Einheit
|
||||
\item bessere Reaktion auf Laufzeitereignisse
|
||||
\item Spekulation möglich
|
||||
\item Superskalar ($\geq 2$ EX Einheiten)
|
||||
@ -656,8 +652,8 @@
|
||||
\end{itemize*}
|
||||
\end{itemize*}
|
||||
|
||||
\section{Multiprozessorarchitekturen}
|
||||
Klassifikation nach Flynn (Instruction/Data)
|
||||
\paragraph{Multiprozessorarchitekturen}
|
||||
nach Flynn
|
||||
\begin{center}
|
||||
\begin{tabular}{ c | c | c}
|
||||
& Ein Datenstrom & mehrere Datenströme \\\hline
|
||||
@ -665,16 +661,13 @@
|
||||
mehrere Bs & MISD & MIMD
|
||||
\end{tabular}
|
||||
\end{center}
|
||||
|
||||
% !{SISD; Quelle RA2 Vorlesung 2020/21](Assets/RA2_SISD.png)
|
||||
% !{SIMD; Quelle RA2 Vorlesung 2020/21](Assets/RA2_SIMD.png)
|
||||
% !{MISD; Quelle RA2 Vorlesung 2020/21](Assets/RA2_MISD.png)
|
||||
% !{MIMD; Quelle RA2 Vorlesung 2020/21](Assets/RA2_MIMD.png)
|
||||
|
||||
% Speicherstrukturen: !{Speicherstrukturen; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Speicherstrukturen.png)
|
||||
|
||||
%Enge und lose Kopplung !{Enge und lose Kopplung; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Enge%20und%20lose%20Kopplung.png)
|
||||
|
||||
\begin{center}
|
||||
\includegraphics[width=\textwidth/13]{Assets/RA2_SISD.png}
|
||||
\includegraphics[width=\textwidth/13]{Assets/RA2_SIMD.png}
|
||||
\includegraphics[width=\textwidth/13]{Assets/RA2_MISD.png}
|
||||
\includegraphics[width=\textwidth/13]{Assets/RA2_MIMD.png}
|
||||
\end{center}
|
||||
|
||||
%Verbindungsnetzwerke
|
||||
% !{Verbindungsnetzwerke; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Verbindungsnetzwerke.png)
|
||||
% !{Verbindungsnetzwerke2; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Verbindungsnetzwerke2.png)
|
||||
@ -690,7 +683,7 @@
|
||||
\item[enge Kopplung] (shared memory)
|
||||
\begin{itemize*}
|
||||
\item parallelzugriff in Datenbreite des Prozessors
|
||||
\item schneller Datenaustausch (Proz-Speicher-Zugriffszeit)
|
||||
\item schneller Datenaustausch
|
||||
\item neu lokal benachbarte Rechner
|
||||
\item aus Sicht des Prozessors gemeinsamer Speicher
|
||||
\item Arbites - Zuteiler für Busanforderungen
|
||||
@ -707,9 +700,22 @@
|
||||
\item Wartezeit auf Speicher
|
||||
\item Kommunikationsaufwand
|
||||
\item Kommunikationsfähigkeit
|
||||
\item optimale Prozessor-/Speicher-/Kommunikationspfad anzahl $<\infty$
|
||||
\end{itemize*}
|
||||
\end{description*}
|
||||
\begin{center}
|
||||
\includegraphics[width=\textwidth/7]{Assets/RA2_Enge und lose Kopplung.png}
|
||||
\includegraphics[width=\textwidth/7]{Assets/RA2_Speicherstrukturen.png}
|
||||
\end{center}
|
||||
|
||||
\paragraph{Verbindungsnetzwerke}
|
||||
\begin{description*}
|
||||
\item[Linie] $KL_{max}=n-1$
|
||||
\item[Ring] $KL_{max}=\frac{n}{2}$
|
||||
\item[Torus 2D] $KL_{max}=\sqrt{n}-1$
|
||||
\item[Torus 3D] $KL_{max}=\frac{3}{2}\sqrt[3]{n}-1$
|
||||
\item[Hypercube] $iD=i$
|
||||
\item[Gitter] $iD=i*\sqrt[i]{n}-1$
|
||||
\end{description*}
|
||||
|
||||
\subsection{Out-of-Order Architektur}
|
||||
\begin{itemize*}
|
||||
@ -735,11 +741,13 @@
|
||||
|
||||
\paragraph{Snooping-Protokolle}
|
||||
\begin{itemize*}
|
||||
\item Die Caches aller Prozessoren beobachten alle Datenübertragungen von jedem Cache zum Hauptspeicher.
|
||||
\item Caches aller Prozessoren beobachten alle Daten- übertragungen von jedem Cache zum Hauptspeicher
|
||||
\item Voraussetzung: broadcastfähiges Verbindungsnetzwerk
|
||||
\item Write Invalidate: Das Verändern eines Blocks im Speicher führt zur Invalidierung aller Cache-Kopien mit der gleichen Adresse
|
||||
\item Write Update / Write Broadcast: Das Verändern eines Blocks im Speicher führt zur Modifikation aller anderen Cache-Blöcke mit der gleichen Adresse
|
||||
\end{itemize*}
|
||||
\begin{description*}
|
||||
\item[Write Invalidate] Verändern eines Blocks im Speicher führt zur Invalidierung aller Cache-Kopien mit der gleichen Adresse
|
||||
\item[Write Update/Broadcast] Verändern eines Blocks im Speicher führt zur Modifikation aller anderen Cache-Blöcke mit der gleichen Adresse
|
||||
\end{description*}
|
||||
|
||||
\paragraph{Copy-Back}
|
||||
\begin{itemize*}
|
||||
@ -749,20 +757,25 @@
|
||||
\item Mischung zwischen Write-Through und Copy-Back
|
||||
\end{itemize*}
|
||||
|
||||
\vfill
|
||||
\paragraph{MESI}
|
||||
\begin{description*}
|
||||
\item[Modified] Cache-Block wurde lokal geändert, die Kopie im Hauptspeicher ist ungültig. Will ein anderer Prozessor im Hauptspeicher lesen, so muss der Cache-Block erst in den Hauptspeicher zurückgeschrieben werden
|
||||
\item[Exclusive] (unmodified): Dieser Cache ist der einzige, der den Cache-Block enthält, Wert im Hauptspeicher ist gültig. Liest ein anderer Prozessor im Hauptspeicher, so muss die Zeile als shared markiert werden. Wird das Datum im Hauptspeicher verändert, ist der Cache-Block auf invalid zu setzen
|
||||
\item[Shared] (unmodified): Mehrere Caches enthalten Daten. Da alle bisher nur gelesen haben, sind Daten im Hauptspeicher gültig. Schreibzugriffe auf einen shared Cache-Block müssen immer zu einer Bus-Operation führen, damit die Cache-Blocks der anderen Caches auf invalid gesetzt werden können
|
||||
\item[Invalid] Cache-Block ist nicht geladen bzw. veraltet/ungültig
|
||||
\end{description*}
|
||||
\begin{center}
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_MESI-Zustände.png}
|
||||
\includegraphics[width=\textwidth/4]{Assets/RA2_MESI-Bedingungen.png}
|
||||
\end{center}
|
||||
%\begin{description*}
|
||||
% \item[Modified] Cache-Block wurde lokal geändert, die Kopie im Hauptspeicher ist ungültig. Will ein anderer Prozessor im Hauptspeicher lesen, so muss der Cache-Block erst in den Hauptspeicher zurückgeschrieben werden
|
||||
% \item[Exclusive] (unmodified): Dieser Cache ist der einzige, der den Cache-Block enthält, Wert im Hauptspeicher ist gültig. Liest ein anderer Prozessor im Hauptspeicher, so muss die Zeile als shared markiert werden. Wird das Datum im Hauptspeicher verändert, ist der Cache-Block auf invalid zu setzen
|
||||
% \item[Shared] (unmodified): Mehrere Caches enthalten Daten. Da alle bisher nur gelesen haben, sind Daten im Hauptspeicher gültig. Schreibzugriffe auf einen shared Cache-Block müssen immer zu einer Bus-Operation führen, damit die Cache-Blocks der anderen Caches auf invalid gesetzt werden können
|
||||
% \item[Invalid] Cache-Block ist nicht geladen bzw. veraltet/ungültig
|
||||
%\end{description*}
|
||||
|
||||
\paragraph{Bus-Operationen}
|
||||
\begin{itemize*}
|
||||
\item Bus Read: wenn ein Prozessor Wert eines Speicherblocks lesen will
|
||||
\item Bus Read Exclusive: wenn ein Prozessor Wert eines Speicherblocks überschreiben will
|
||||
\item Flush: wenn ein Prozessor $P_i$ einen Speicherblock alleinig in seinem Cache hat, ein anderer Prozessor $P_j$ aber lesend oder schreibend auf diesen Block zugreift. Bei einer Flush-Operation legt $P_i$ ebenfalls das Datum des Speicherblocks auf den Bus.
|
||||
\end{itemize*}
|
||||
\begin{description*}
|
||||
\item[Bus Read] Prozessor liest Wert eines Speicherblocks
|
||||
\item[Bus Read Exclusive] Prozessor überschreibt Wert eines Speicherblocks
|
||||
\item[Flush] Prozessor $P_i$ hat Speicherblock alleinig in seinem Cache, ein anderer Prozessor $P_j$ aber lesend oder schreibend auf diesen Block zugreift
|
||||
\end{description*}
|
||||
|
||||
\paragraph{Steuersignale}
|
||||
\begin{itemize*}
|
||||
|