806 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			806 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \documentclass[a4paper]{article}
 | |
| \usepackage[ngerman]{babel}
 | |
| \usepackage[utf8]{inputenc}
 | |
| \usepackage{multicol}
 | |
| \usepackage{calc}
 | |
| \usepackage{ifthen}
 | |
| \usepackage[landscape]{geometry}
 | |
| \usepackage{amsmath,amsthm,amsfonts,amssymb}
 | |
| \usepackage{color,graphicx,overpic}
 | |
| \usepackage{listings}
 | |
| \usepackage[compact]{titlesec} %less space for headers
 | |
| \usepackage{mdwlist} %less space for lists
 | |
| \usepackage{pdflscape}
 | |
| \usepackage{verbatim}
 | |
| \usepackage[hidelinks,pdfencoding=auto]{hyperref}
 | |
| \usepackage{fancyhdr}
 | |
| \usepackage{lastpage}
 | |
| \pagestyle{fancy}
 | |
| \fancyhf{}
 | |
| \fancyhead[L]{Rechnerarchitekturen 2}
 | |
| \fancyfoot[L]{\thepage/\pageref{LastPage}}
 | |
| \renewcommand{\headrulewidth}{0pt} %obere Trennlinie
 | |
| \renewcommand{\footrulewidth}{0pt} %untere Trennlinie
 | |
| 
 | |
| \pdfinfo{
 | |
|     /Title (Rechnerarchitekturen 2 - Cheatsheet)
 | |
|     /Creator (TeX)
 | |
|     /Producer (pdfTeX 1.40.0)
 | |
|     /Author (Robert Jeutter)
 | |
|     /Subject ()
 | |
| }
 | |
| 
 | |
| % This sets page margins to .5 inch if using letter paper, and to 1cm
 | |
| % if using A4 paper. (This probably isn't strictly necessary.)
 | |
| % If using another size paper, use default 1cm margins.
 | |
| \ifthenelse{\lengthtest { \paperwidth = 11in}}
 | |
|     { \geometry{top=.5in,left=.5in,right=.5in,bottom=.5in} }
 | |
|     {\ifthenelse{ \lengthtest{ \paperwidth = 297mm}}
 | |
|     {\geometry{top=1.3cm,left=1cm,right=1cm,bottom=1.2cm} }
 | |
|     {\geometry{top=1.3cm,left=1cm,right=1cm,bottom=1.2cm} }
 | |
|     }
 | |
|   
 | |
| % Redefine section commands to use less space
 | |
| \makeatletter
 | |
| \renewcommand{\section}{\@startsection{section}{1}{0mm}%
 | |
|                                 {-1ex plus -.5ex minus -.2ex}%
 | |
|                                 {0.5ex plus .2ex}%x
 | |
|                                 {\normalfont\large\bfseries}}
 | |
| \renewcommand{\subsection}{\@startsection{subsection}{2}{0mm}%
 | |
|                                 {-1explus -.5ex minus -.2ex}%
 | |
|                                 {0.5ex plus .2ex}%
 | |
|                                 {\normalfont\normalsize\bfseries}}
 | |
| \renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0mm}%
 | |
|                                 {-1ex plus -.5ex minus -.2ex}%
 | |
|                                 {1ex plus .2ex}%
 | |
|                                 {\normalfont\small\bfseries}}
 | |
| \makeatother
 | |
| 
 | |
| % Don't print section numbers
 | |
| \setcounter{secnumdepth}{0}
 | |
| 
 | |
| \setlength{\parindent}{0pt}
 | |
| \setlength{\parskip}{0pt plus 0.5ex}    
 | |
| % compress space
 | |
| \setlength\abovedisplayskip{0pt}
 | |
| \setlength{\parskip}{0pt}
 | |
| \setlength{\parsep}{0pt}
 | |
| \setlength{\topskip}{0pt}
 | |
| \setlength{\topsep}{0pt}
 | |
| \setlength{\partopsep}{0pt}
 | |
| \linespread{0.5}
 | |
| \titlespacing{\section}{0pt}{*0}{*0}
 | |
| \titlespacing{\subsection}{0pt}{*0}{*0}
 | |
| \titlespacing{\subsubsection}{0pt}{*0}{*0}
 | |
| 
 | |
| \begin{document}
 | |
| 
 | |
| \begin{multicols}{2}
 | |
|   \footnotesize
 | |
|   \begin{description*}
 | |
|     \item[Ausführungszeit] $t[s]=\frac{\text{Taktzyklen [Takte]}}{\text{Frequenz [Hz]}} =\frac{C}{f}$
 | |
|     \item[Leistung absolut] $L_{abs}[MIPS]=\frac{\text{Befehlsanzahl}}{\text{Ausführungszeit [s]}*10^6}=\frac{n}{t*10^6}$
 | |
|     \item[Leistung relativ] $L_{rel}[MIPS]=\frac{\text{Referenzzeit [s]}}{\text{Ausführungszeit [s]}}*\text{RefLeistung [MIPS]} = \frac{t_{ref}}{t_mess}*L_{ref}$
 | |
|     \item[Clocks per Instruction] $CPI=\frac{\text{Taktzyklen [Takte]}}{\text{Befehlsanzahl}} =\frac{C}{n}$
 | |
|     \item[Gewichtete mittlere] $CPI_{G}=\sum (CPI_{Bef.gr.}*\text{Rel.Häufigkeit}_{Bef.gr.})=\sum_{i=1}^n(CPI_i*p_i)$
 | |
|     \item[Instructions per Clock] $IPC=\frac{Befehlsanzahl}{\text{Taktzyklen [Takt]}}=\frac{n}{C}$
 | |
|     \item[Speedup] $S_n=\frac{1}{AnteilSeriell + Overhead + \frac{AnteilParallel}{AnzahlProzessoren}}=\frac{1}{ A_{seriell} + o(n) + \frac{ A_{parallel} }{ n }}$
 | |
|     \item[Effizienz] $E_n=\frac{Speedup}{AnzahlProzessoren}=\frac{S_n}{n}$
 | |
|   \end{description*}
 | |
| \end{multicols}
 | |
| 
 | |
| \centering{
 | |
|   \begin{tabular}{l | c | c | c | c | c}
 | |
|     Bezeichnung  & Konflikterkennung & Issue-Struktur & Scheduling                & Hauptmerkmal                 & Beispiele                          \\\hline
 | |
|     Superskalar  & Hardware          & Dynamisch      & Statisch                  & In-order Execution           & Sun UltraSPARC II/ III             \\
 | |
|     Out of Order & Hardware          & Dynamisch      & Dynamisch mit Spekulation & Out of Order mit Spekulation & Pentium III, Pentium 4, MIPS 10000 \\ 
 | |
|     VLIW         & Software          & Statisch       & Statisch                  & Keine Konflikte              & Trimedia, diverse DSPs
 | |
|   \end{tabular}
 | |
| }
 | |
| 
 | |
| \raggedright
 | |
| \footnotesize
 | |
| \begin{multicols}{3}
 | |
|   
 | |
|   % multicol parameters
 | |
|   % These lengths are set only within the two main columns
 | |
|   \setlength{\columnseprule}{0.25pt}
 | |
|   \setlength{\premulticols}{1pt}
 | |
|   \setlength{\postmulticols}{1pt}
 | |
|   \setlength{\multicolsep}{1pt}
 | |
|   \setlength{\columnsep}{2pt}
 | |
|   
 | |
|   
 | |
|   \section{Prozessorarchitekturen}
 | |
|   \paragraph{CISC} complex instruction set computer
 | |
|   \begin{itemize*}
 | |
|     \item Einfache und komplexe Befehle
 | |
|     \item Heterogener Befehlssatz
 | |
|     \item verschiedene Taktzahl pro Befehl
 | |
|     \item Viele Befehlscode-Formate mit unterschiedlicher Länge
 | |
|     \item Mikroprogrammwerk                             
 | |
|     \item Vermischung von Verarbeitungs \& Speicherbefehlen
 | |
|     \item schwierig, unter CPI = 2 zu kommen
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{RISC} reduced instruction set computer
 | |
|   \begin{itemize*}
 | |
|     \item wenige, einfache Befehle
 | |
|     \item orthogonaler Befehlssatz   
 | |
|     \item meist 1 Takt pro Befehl
 | |
|     \item wenige Befehlscode-Formate mit einheitlicher Länge 
 | |
|     \item Direktverdrahtung
 | |
|     \item Trennung von Verarbeitungs \& Speicherbefehlen  
 | |
|     \item hohe Ausführungsgeschwindigkeit $(CPI \leq 1)$
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{MIPS}
 | |
|   \begin{itemize*}
 | |
|     \item Microprocessor without interlocked pipeline stages
 | |
|     \item 32-bit Architektur/64-bit Erweiterung
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \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*}
 | |
|     \item[Befehlsholphase] Lesen des aktuellen Befehls; separater zur Vermeidung von Konflikten mit Datenzugriffen
 | |
|     \item[Dekodier \& Register-Lese-Phase] Lesen der Register möglich wegen fester Plätze für Nr. im Befehlswort
 | |
|     \item[Ausführungs \& Adressberechnungsphase] Berechnung arithmetischer Funktion o. Adresse für Speicherzugriff
 | |
|     \item[Speicherzugriffsphase] Wird nur bei Lade \& Speicherbefehlen benötigt
 | |
|     \item[Abspeicherungsphase] Speichern in Register, bei Speicherbefehlen nicht benötigt
 | |
|   \end{description*}
 | |
|   
 | |
|   \paragraph*{Hazards}
 | |
|   \begin{itemize*}
 | |
|     \item resource hazards: Ressourcenabhängigkeiten
 | |
|     \item data hazards: Datenabhängigkeiten
 | |
|     \begin{description*}
 | |
|       \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 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: 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*}
 | |
|   
 | |
|   \paragraph{Einfache Sprungvorhersage (1 Bit)}
 | |
|   \begin{itemize*}
 | |
|     \item Branch prediction buffer oder branch history table
 | |
|     \item Kleiner Speicher, der mit (Teil der) Adresse des Sprungbefehls indiziert wird
 | |
|     \item Verwendet nur wenige untere Bits der Adresse
 | |
|     \item Enthält 1 Bit: Sprung beim letzten Mal ausgeführt (taken) oder nicht (not taken)
 | |
|     \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 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, 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 Fehlerrate 1-Bit-P in Schleifenkonstrukten doppelt so hoch wie Anzahl ausgeführter Sprünge
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{2 Bit Vorhersagen}
 | |
|   \begin{itemize*}
 | |
|     \item Änderung der Vorhersage nur, wenn 2 falsche Vorhersagen in Folge
 | |
|     \item 2-Bit Branch-Prediction Buffer: Speicherung der Historie, Befehlsadressen als Zugriffsschlüssel
 | |
|   \end{itemize*}
 | |
|   % !{Sprungvorhersage; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Sprungvorhersage.png)
 | |
|   
 | |
|   \paragraph{n-Bit Prädikator}
 | |
|   \begin{itemize*}
 | |
|     \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
 | |
|     \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 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
 | |
|     \item Prädiktor benutzt globale Kontext-Bits, um einen von mehreren lokalen Prädiktoren auszuwählen
 | |
|     \item Betrachten wiederholte Ausführung des Codefragments
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Zweistufiger Prädiktor}
 | |
|   \begin{itemize*}
 | |
|     \item Es existieren 2 lokale Prädiktoren, beide je 1-Bit
 | |
|     \item Kontext: Letzter Sprung wurde (nicht) ausgeführt
 | |
|     \item Anhand des Kontexts wird lokaler Prädiktor für die Vorhersage des aktuell betrachteten Sprungs ausgewählt
 | |
|     \item Letzter Sprung ist i.a. nicht gleich aktuellem Sprung
 | |
|     \item Notation des Prädiktorstatus:$<X>/<Y>$ mit
 | |
|     \item $<X>$: Vorhersage, falls letzter Sprung not taken
 | |
|     \item $<Y>$: Vorhersage, falls letzter Sprung taken
 | |
|     \item $<X>\vee<Y>$ Vorhersagen: entweder T oder NT
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{(m,n)-Prädiktor}
 | |
|   \begin{itemize*}
 | |
|     \item Betrachtet das Verhalten der letzten m Sprünge, um aus $2^m$ vielen lokalen Prädiktoren einen n-Bit Prädiktor auszuwählen
 | |
|     \item Höhere Vorhersagegenauigkeit
 | |
|     \item Erfordert kaum Hardwareaufwand
 | |
|     \item Sprunggeschichte in m-Bit Schieberegister gespeichert
 | |
|     \item Vorhersagepuffer adressiert via Konkatenation von unteren Adressbits der Sprungbefehlsadresse
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \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
 | |
|     \item Kontrollflussabhängigkeiten dürfen nicht wahrnehmbar sein 
 | |
|     \item Pufferung von Sprungzielen und nicht nur Vorhersage des Sprungverhaltens (branch target buffer)
 | |
|     \item Integrierte Einheit für das Holen der Befehle
 | |
|     \item Vorhersage von Rücksprungadressen (bei Prozeduraufruf)
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Branch Target Buffer}
 | |
|   5-stufige Pipeline, Auswertung von Sprungbedingungen in EX
 | |
|   \begin{itemize*}
 | |
|     \item Branch delay von 2 Takten
 | |
|     \item mit Sprungvorhersage (branch prediction buffer)
 | |
|     \item Zugriff erfolgt in ID (Adresse des Sprungbefehls in IF bekannt)
 | |
|     \item Nächste vorhergesagte Instruktion kann erst nach ID geholt werden
 | |
|     \item Branch delay = 1, falls Prädiktion korrekt
 | |
|     \item Mit Pufferung des Sprungziels
 | |
|     \item Zugriff auf branch target buffer erfolgt in IF
 | |
|     \item Verhalten wie „echter“ Cache, adressiert mit Sprungbefehlsadresse
 | |
|     \item Liefert vorhergesagte Adresse als Ergebnis
 | |
|     \item Keine Verzögerung, falls Prädiktion korrekt
 | |
|     \item Zusätzliche Speicherung auch des Sprungziels
 | |
|     \item bei geschickter Organisation bleibt das Fließband immer gefüllt
 | |
|     \item Sprünge kosten dann effektiv keine Zeit; $CPI <1$ mögl.
 | |
|   \end{itemize*}
 | |
|   Eigenschaften
 | |
|   \begin{itemize*}
 | |
|     \item Verzögerung durch Sprung vollständig vermieden, da bereits in IF Entscheidung über nächsten Befehlszähler getroffen
 | |
|     \item Entscheidung allein auf Basis des PC getroffen wird, muss überprüft werden ob Adresse im Puffer
 | |
|     \item Speicherung nur für Sprünge notwendig, die als ausgeführt vorhergesagt werden
 | |
|     \item entsteht ursprüngliche Sprung-Verzögerung plus Aufwand zur Aktualisierung des Vorhersagepuffers
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Integrierte Befehls-Hol-Einheit (IF Unit)}
 | |
|   Insbesondere mit Blick auf multiple-issue Prozessoren eigene (autonome) funktionale Einheit für Befehlsholphase
 | |
|   \begin{itemize*}
 | |
|     \item führt Befehlscodes in Pipeline ein
 | |
|     \item Sprungvorhersage wird Teil der Befehlsholphase
 | |
|     \item Instruction Pre-fetch: Insbes. um mehrere Befehle pro Takt liefern zu können, läuft Befehlsholen weiterer Dekodierung voraus
 | |
|     \item Zugriff auf Befehlsspeicher: Bei mehreren Befehlen pro Takt mehrere Zugriffe erforderlich (bei Cache auf ggfs. mehrere cache lines). Werden hier koordiniert/geplant
 | |
|     \item Befehlspuffer: Befehle können hier (lokal im Prozessor!) von Issue-Stufe nach Bedarf abgerufen werden
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Vorhersage von Rücksprungadressen}
 | |
|   Vorhersage indirekter Sprünge (d.h. bzgl. Basisadresse in Register)
 | |
|   \begin{itemize*}
 | |
|     \item Hauptverwendung: Rückkehr aus Prozeduraufrufen
 | |
|     \item MIPS: Prozeduraufruf per $jal$, Rückkehr per $jr$
 | |
|     \item Vorhersage mit branch target buffer schlecht, da Aufruf aus unterschiedlichen Codeteilen heraus möglich
 | |
|     \item Methode: (Stack-) Speicher für Rücksprungadressen
 | |
|     \item Push bei Prozeduraufruf (call)
 | |
|     \item Pop bei Rücksprung (return)
 | |
|     \item Vorhersagequalität „perfekt“, wenn Stack-Puffer größer als maximale Aufruftiefe
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \section{Multiple-Issue-Architekturen}
 | |
|   \paragraph{Mehrere Ausführungseinheiten}
 | |
|   \begin{itemize*}
 | |
|     \item Weitere Leistungssteigerung $CPI < 1$
 | |
|     \item Mehrere Befehle pro Takt ausgeben
 | |
|     \item Zwei Grundtypen von multiple-issue Prozessoren
 | |
|     \begin{itemize*}
 | |
|       \item Superskalar: var. Anzahl von Befehlen pro Takt
 | |
|       \item VLIW/EPIC: Feste Anzahl von Befehlen ausgegeben, definiert durch Befehlscode (Planung der Issue-Phase durch Compiler)
 | |
|     \end{itemize*}
 | |
|   \end{itemize*}
 | |
|   % !{In Order Pipeline; Quelle RA2 Vorlesung 2020/21](Assets/RA2_in-order-pipeline.png)
 | |
|   
 | |
|   \subsection{Superskalar}
 | |
|   \begin{itemize*}
 | |
|     \item IF holt 1-n Befehle von Instruction Fetch Unit
 | |
|     \item Befehlsgruppe, die potentiell ausgegeben werden kann = issue packet
 | |
|     \item Konflikte bzgl. Befehlen im issue packet werden in Issue-Stufe in Programmreihenfolge geprüft
 | |
|     \item Befehl ggfs. nicht ausgegeben (und alle weiteren)
 | |
|     \item Aufwand für Prüfung in Issue-Stufe groß!
 | |
|     \item Wegen Ausgewogenheit der Pipeline-Stufen ggfs. Issue in mehrere Stufen unterteilen = nicht-trivial
 | |
|     \item Parallele Ausgabe von Befehlen limitierender Faktor superskalarer Prozessoren
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{MIPS mit statischem Scheduling}
 | |
|   \begin{itemize*}
 | |
|     \item Annahme: 2 Befehle pro Takt können ausgegeben werden (1x ALU, Load/Store plus 1x FP)
 | |
|     \item Einfacher als 2 beliebige Befehle (wegen „Entflechtung“)
 | |
|     \item 2 Befehlsworte holen (64-Bit Zugriff, komplexer als 1 B.)
 | |
|     \item Prüfen, ob 0/1/2 Befehle ausgegeben werden können
 | |
|     \item Befehle ausgeben an korrespondierende funk. Einheiten
 | |
|     \item Prüfen auf Konflikte durch Entflechtung vereinfacht
 | |
|     \item Integer und FP-Operationen nahezu unabhängig
 | |
|     \item Abhängigkeiten nur bei Speichertransfers möglich (von Integer-ALU für FP ausgeführt)
 | |
|     \item Leistungssteigerung nur bei geeignetem Anteil von FP-Operationen und Verflechtung durch Compiler
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Dynamisches Scheduling} in-order-execution
 | |
|   \begin{itemize*}
 | |
|     \item Jeder Befehl, der aus der Instruction fetch-Einheit kommt, durchläuft Scoreboard
 | |
|     \item Wenn für Befehl alle Daten/Operanden bekannt sind und Ausführungseinheit frei ist, wird Befehl gestartet
 | |
|     \item Alle Ausführungseinheiten melden abgeschlossene Berechnungen dem Scoreboard
 | |
|     \item Scoreboard erteilt Befehlen die Berechtigung zum Abspeichern von Ergebnissen und prüft, ob dadurch neue Befehle ausführbereit werd
 | |
|     \item Zentrale Datenstruktur: Scoreboard (für Befehlsstatus)
 | |
|     \item load/store-Architektur
 | |
|     \item mehrere funktionale Einheiten
 | |
|     \item Scoreboarding für MIPS nur sinnvoll wenn:
 | |
|     \item für FP-Pipeline (Operationen mit mehreren Taktzyklen)
 | |
|     \item mehrere funktionale Einheiten (zB: 2xMult, Div, Add, Int)
 | |
|   \end{itemize*}
 | |
|   % !{Out Of Order Execution; Quelle RA2 Vorlesung 2020/21](Assets/RA2_out-of-order-execution.png)
 | |
|   
 | |
|   \paragraph{Verfahren von Tomasulo}
 | |
|   \begin{itemize*}
 | |
|     \item erlaubt bei Ausgabe-/Antidatenabhängigkeiten Reihenfolge zu vertauschen
 | |
|     \item Umbenennung der Register
 | |
|     \item verschiedenen Benutzungen eines Registers werden verschiedene Speicherzellen zugeordnet
 | |
|     \item Jeder funktionalen Einheit wird eine Reservation Station zugeordnet
 | |
|     \item Reservation Stations enthalten die auszuführende Operation und die Operanden/tags des Operanden
 | |
|     \item Sind alle Operanden bekannt und ist die funktionale Einheit frei, so kann die Bearbeitung beginnen
 | |
|     \item Am Ende der Bearbeitung wird das Ergebnis von allen Einheiten übernommen, die das Ergebnis benötigen
 | |
|     \item Verteilen der Daten erfolgt vor der Abspeicherung im Registerspeicher
 | |
|     \item Aus den tag bits geht hervor, aus welcher Einheit der Operand kommen muss
 | |
|     \item Registeradressen werden dynamisch auf größere Anzahl von Plätzen in den Reservation Stations abgebildet
 | |
|     \item Performance-Beschränkungen wegen weniger Register werden so umgangen
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Register Renaming}
 | |
|   \begin{itemize*}
 | |
|     \item Verwendung temporärer Register für (logisch) neue möglicherweise interferierende Belegung
 | |
|     \item Alle Namenskonflikte durch Umbenennung auflösbar
 | |
|     \item Wichtige Hardwarestruktur: Reservation Stations
 | |
|     \item Zugeordnet zu funktionalen Einheiten (pro Einheit)
 | |
|     \item Puffern Operanden für Befehle (sobald verfügbar)
 | |
|     \item Müssen nicht aus Registern gelesen werden
 | |
|     \item Ausstehende Operanden verweisen auf Reservation Station, die Eingabe bereitstellen
 | |
|     \item Bei aufeinander folgenden Schreibzugriffen auf Register: Nur letzter für Aktualisierung des Inhalts verwendet
 | |
|     \item Wichtige Eigenschaften der Verwendung von Reservation Stations anstelle des zentralen Registersatzes
 | |
|     \item Konfliktdetektion und Ausführungskontrolle verteilt
 | |
|     \item Informationen in Reservation Stations bei den funktionalen Einheiten bestimmen, wann Ausführung eines Befehls möglich ist
 | |
|     \item Ergebnisse werden direkt zu den funktionalen Einheiten (in jeweiliger Reservation Station) weitergereicht
 | |
|     \item Erweiterte Form des Forwarding
 | |
|     \item Realisiert implizit Register Renaming durch gemeinsamen Ergebnisbus (common data bus)
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Multiple-Issue mit dynamischem Scheduling}
 | |
|   \begin{itemize*}
 | |
|     \item Nachteil von statischem Scheduling: Latenzzeiten werden ca. mit Länge des issue packets skaliert
 | |
|     \item Längere Verzögerung für Load/Stores bzw. Branches
 | |
|     \item Lösung: Erweiterung des Tomasulo-Algorithmus auf Multiple-Issue
 | |
|     \item Sequentielles Ausgeben mehrerer Befehle an Reservation Stations innerhalb eines Taktes
 | |
|     \item oder „Verbreiterung“ der Ausgabe-Logik (issue logic) zur Behandlung mehrerer Operationen parallel
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{VLIW} Very Long Instruction Word
 | |
|   \begin{itemize*}
 | |
|     \item Befehlszuordnung und Konfliktvermeidung durch Compiler
 | |
|     \item Compiler muss Zeitbedarf der Speicherzugriffe in Befehlsplanung einbeziehen
 | |
|     \item Befehlsstrom mit Tupel von Befehlen
 | |
|     \item flexibel bei Reaktion auf Laufzeitereignisse
 | |
|     \item VLIW hat festes Befehlsformat; höhere Codedichte
 | |
|     \item Forwarding Hardware - nach EX können Daten vom nächsten Befehl genutzt werden
 | |
|     \item WB erfolgt erst darauf
 | |
|     \item Datenabhängigkeitsproblem wird verringert
 | |
|     \item MUX nutzt eher Pufferdaten als Registerdaten
 | |
|     \item verschiedene parallele Ausführungseinheiten
 | |
|     \item Verteilung von Maschinencode direkt vom Befehlswort im Speicher vorgegeben
 | |
|     \item für jede Ausführungseinheit dezidierte Anweisungen
 | |
|     \item meist für stark parallelisierbare Aufgaben verwendet
 | |
|     \item Vorteile:
 | |
|     \begin{itemize*}
 | |
|       \item parallele Architektur des Prozessors kann während der Programmerstellung zur Optimierung genutzt werden
 | |
|       \item Keine aufwendige Prozessorhardware zur Befehlsverteilung erforderlich
 | |
|       \item Ausführungszeiten sind im wesentlichen bekannt
 | |
|     \end{itemize*}
 | |
|     \item Nachteile:
 | |
|     \begin{itemize*}
 | |
|       \item Aufwendigere Compiler
 | |
|       \item Schlechte Prozessorauslastung bei ungünstigem Code
 | |
|       \item Rekompilierung für den Prozessor erforderlich
 | |
|       \item Größerer Speicherbedarf, wenn Code nicht parallelisiert werden kann
 | |
|     \end{itemize*}
 | |
|   \end{itemize*}
 | |
|   % !{VLIW Dynamisch; Quelle RA2 Vorlesung 2020/21](Assets/RA2_VLIW-dynamisch.png)
 | |
|   
 | |
|   \paragraph{EPIC} Explicitely Parallel Instruction Computing = IA64
 | |
|   \begin{itemize*}
 | |
|     \item im wesentlichen Prinzip des VLIW-Prozessors
 | |
|     \item Umsortieren der Befehle und Auflösung der Abhängigkeiten wird durch Compiler durchgeführt
 | |
|     \item Hauptnachteil: Neukompilierung erforderlich
 | |
|     \item Keine statische Aufteilung auf Funktionseinheiten
 | |
|     \item Effizienteres Befehlswort
 | |
|     \item Keine Verwendung von zwangsweise NOPs
 | |
|   \end{itemize*}
 | |
|   verschiedene Ansätze, um die Prozessorlogik zu vereinfachen
 | |
|   \begin{enumerate*}
 | |
|     \item Bedingte Befehlsverarbeitung
 | |
|     \begin{itemize*}
 | |
|       \item Befehl abhängig von Statusbit ausgeführt
 | |
|       \item Sprungvorhersage kann bei einfachen if-then-else Zweigen entfallen
 | |
|       \item then/else Befehle parallel, nur einer ausgeführt
 | |
|     \end{itemize*}
 | |
|     \item Statische Sprungvorhersage (Compiler)
 | |
|     \item Die Optimierung wird dem Compiler überlassen
 | |
|     \item Spekulatives Laden von Operanden
 | |
|     \begin{itemize*}
 | |
|       \item Möglichst geringe Wartezeit auf Operanden
 | |
|       \item Schon im Compiler werden entsprechende Ladebefehle vorgezogen
 | |
|     \end{itemize*}
 | |
|   \end{enumerate*}
 | |
|   % !{VLIW Vergleich; Quelle RA2 Vorlesung 2020/21](Assets/RA2_VLIW-vergleich.png)
 | |
|   
 | |
|   \subsection{Simultaneous Multithreading (SMT)}
 | |
|   % !{SMT; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Simultaneous-Multithreading.png)
 | |
|   \begin{itemize*}
 | |
|     \item Modellprozessor I (2-fach Superskalar)
 | |
|     \item Modellprozessor II (2-fach Out-of-Order)
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Speicherhierarchie}
 | |
|   \begin{itemize*}
 | |
|     \item Große Speicher sind langsam
 | |
|     \item Anwendung verhalten sich üblicherweise lokal
 | |
|     \item Häufig benötigte Speicherinhalte in kleinen Speichern
 | |
|   \end{itemize*}
 | |
|   \begin{center}
 | |
|     \includegraphics[width=\textwidth/4]{Assets/RA2_Speicherhierarchie.png}
 | |
|   \end{center}
 | |
|   
 | |
|   \vfill
 | |
|   \section{Speicherarchitekturen}
 | |
|   \paragraph{Adresspipelining}
 | |
|   \begin{itemize*}
 | |
|     \item Aufteilen des Speicherzugriffs in mehrere Phasen
 | |
|     \item parallele gestaffelte Abarbeitung dieser Phasen für mehrere Speicherzugriffe
 | |
|     \item Adresse auslesen/dekodieren; Daten mit Prozessor
 | |
|   \end{itemize*}
 | |
|   % !{Pipelining; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Adresspipelining.png)
 | |
|   Lesezugriff auf Speicher
 | |
|   \begin{itemize*}
 | |
|     \item Matrixaufbau eines Speichers
 | |
|     \item Aufteilen der Speicheradresse in Zeilen- und Spalten
 | |
|     \item Dekodierung der Zeilenadresse bestimmt Select-Leitung
 | |
|     \item Komplette Zeile wird in den Zeilenpuffer geschrieben
 | |
|     \item Dekodierung der Spaltenadresse bestimmt Datenwort
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Speicher Interlacing}
 | |
|   \begin{itemize*}
 | |
|     \item Speicheraufteilung in mehrere physische Bände
 | |
|     \item Adressen nicht kontinuierlich in den Bänden, sondern wechseln von Band zu Band
 | |
|     \item nahezu gleichzeitiges Benutzen der Daten möglich (Daten-/Adressbus verhindern Parallelität)
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Burst Mode} Blocktransfer
 | |
|   \begin{itemize*}
 | |
|     \item Auslesen des kompletten Zeilenpuffers durch automatisches Inkrementieren der Spaltenadresse
 | |
|     \item Prozessor gibt eine Adresse, Speicher liefert n Datenworte (Adr, Adr+1,..., Adr+n-1)
 | |
|     \item falls folgende Datenworte genutzt werden, war für n Datenworte nur 1 Speicherzugriff (Zeit) nötig
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Typischer DRAM-Speicher}
 | |
|   \begin{itemize*}
 | |
|     \item Adressleitungen werden i.d.R. gemultiplext
 | |
|     \item gleiche Adressleitungen werden einmal zur Auswahl der Zeile verwendet, dann zur Auswahl der Spalte
 | |
|     \item Einsparung von Leitungen, gerade für große Speicher
 | |
|     \item Steuerleitungen RAS/CAS codieren
 | |
|     \item RAS (Row Address Strobe): Bei fallenden Flanke auf RAS ist anliegende Adresse Zeilenadresse
 | |
|     \item CAS (Column Address Strobe): Bei fallenden Flanke auf CAS ist anliegende Adresse Spaltenadresse
 | |
|     \item Zeilenadressdecoder liefert Select-Leitung für eine Zeile
 | |
|     \item Komplette Zeile wird in einen Zwischenpuffer übernommen und zurückgeschrieben
 | |
|     \item Nur 1 Transistor und 1 Kondensator pro Speicherzelle, statt 6 Transistoren bei SRAM
 | |
|     \item Integrationsdichte Faktor 4 höher als bei SRAMs
 | |
|     \item Weniger Platzbedarf aber Langsamerer Zugriff wegen Zwischenspeicherung und Auffrischung
 | |
|     \item während Auffrischung kann nicht zugegriffen werden
 | |
|     \item Hoher Energieverbrauch bei Aktivität/Inaktivität
 | |
|     \item Ladungsverlust Ausgleich durch periodische Auffrischung
 | |
|   \end{itemize*}
 | |
|   %Interleaving
 | |
|   % !{Interleaving; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Interleaving.png)
 | |
|   
 | |
|   \subsection{Cache Speicher}
 | |
|   \begin{itemize*}
 | |
|     \item kleiner, schneller prozessornaher Speicher
 | |
|     \item Puffer zwischen Hauptspeicher und Prozessor
 | |
|     \item CPU weiß nicht dass Cache zwischengeschaltet ist
 | |
|     \item es wird immer zuerst im Cache nachgeschaut (kostet Zeit)
 | |
|     \item 90\% der Zeit verbringt ein Programm in 10\% des Codes
 | |
|     \item Cache besteht aus Cache Tabelle
 | |
|     \begin{description*}
 | |
|       \item[voll assoziativ] Adressvergl. der kompletten Adresse
 | |
|       \item[direct-mapped] Adressvergleich nur über Teiladresse
 | |
|       \item[mehr-wege-assoziativ] mehrere Adressverg. parallel
 | |
|     \end{description*}
 | |
|     \item Schreibstategien
 | |
|     \begin{description*}
 | |
|       \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)
 | |
|     \end{description*}
 | |
|     \item Speicherverwaltung mit memory management günstiger vor dem Cache
 | |
|     \item cache hit: benötigte Daten im Cache vorhanden
 | |
|     \item cache miss: Zugriff auf den (Haupt-) Speicher
 | |
|     %\item Prinzip eines Cache (Hit) !{Cachehit; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Cachehit.png)
 | |
|     \item Such-Einheit im Cache: Cache-Zeile (cache line)
 | |
|     \item Blockgröße ist Anzahl der Worte, die im Fall eines cache misses aus Speicher nachgeladen werden
 | |
|     \item Verbindung Speicher $\leftrightarrow$ Cache ist so entworfen, dass Speicher durch zusätzliches Lesen nicht langsamer wird
 | |
|     \item Methoden dazu:
 | |
|     \begin{itemize*}
 | |
|       \item Schnelles Lesen aufeinanderfolgender Speicherzellen (Burst Mode)
 | |
|       \item Interleaving (mehrere Speicher ICs mit überlappenden Zugriffen)
 | |
|       \item Fließbandzugriff auf den Speicher (SDRAM)
 | |
|       \item Breite Speicher übertragen mehrere Worte parallel
 | |
|     \end{itemize*}
 | |
|     %\item 2-Wege Cache (Datensicht) !{2 Wege Cache; Quelle RA2 Vorlesung 2020/21](Assets/RA2_2-wege-cache.png)
 | |
|     \item Ersetzungs-Strategien
 | |
|     \begin{description*}
 | |
|       \item[Zufall] zu ersetzende Block zufällig ausgewählt
 | |
|       \item[FIFO] älteste Block ersetzt
 | |
|       \item[LRU](least recently used) längsten nicht zugegriffen
 | |
|       \item[LFU](least frequently used) am seltensten gelesene
 | |
|       \item[CLOCK] Zeiger im Uhrzeigersinn zeigt Eintrag
 | |
|     \end{description*}
 | |
|     \item Trefferquote $T=\frac{N_{Cache Zugriffe}}{N_{Cache Hit}}$
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \section{Spezialrechner}
 | |
|   \subsection{Einchiprechner}
 | |
|   \begin{itemize*}
 | |
|     \item geringer Stromverbrauch, Wärme
 | |
|     \item relativ geringer Befehlsdurchsatz
 | |
|     \item einfacher Befehlssatz
 | |
|     \item komplexer Rechner auf einem Chip (Ram/Rom intern)
 | |
|     \item an Problem angepasst
 | |
|     \item so Leistungsfähig wie nötig
 | |
|     \item Anwendung: einfache Steuer-/Regelungsaufgaben
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Digital-Signal-Prozessoren}
 | |
|   \begin{itemize*}
 | |
|     \item hohe Leistung, u.a. sich wiederholende, numerisch intensive Aufgaben
 | |
|     \item pro Befehlszyklus kann man ausführen
 | |
|     \begin{itemize*}
 | |
|       \item mehrere ALU Funktionen (+Shifter)
 | |
|       \item eine/mehrere MAC-Operationen
 | |
|       \item ein/mehrere Speicherzugriffe
 | |
|       \item spezielle Unterstützung effiziente Schleifen
 | |
|     \end{itemize*}
 | |
|     \item Die Hardware enthält
 | |
|     \begin{itemize*}
 | |
|       \item Eine oder mehrere MAC-Einheiten
 | |
|       \item On-Chip- und Off-Chip-Speicher mit mehreren Ports
 | |
|       \item Mehrere On-Chip-Busse
 | |
|       \item Adressgenerierungseinheit
 | |
|       \item größerer ROM, RAM (mit Stack), Cache
 | |
|       \item externes Interface für Speicher und E/A
 | |
|       \item DMA-Coprozessor
 | |
|       \item mehrere universelle parallele E/A-Ports
 | |
|       \item AD-Wandler meist nicht on-chip
 | |
|     \end{itemize*}
 | |
|     \item DSP's benutzung häufig VLIW
 | |
|     \item Anwendung: Signal-/Bildverarbeitung
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Pipeline Prozessoren}
 | |
|   \begin{itemize*}
 | |
|     \item Aufteilung eines Befehls in Teilbefehle
 | |
|     \item parallele Abarbeitung verschiedener Teilbefehle
 | |
|     \item Problem: bedingte Sprünge (unvorhergesehen)
 | |
|     \begin{itemize*}
 | |
|       \item LSG: Pipeline um 2 Schritte verzögern
 | |
|       \item LSG: Sprungzielspekulation
 | |
|     \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
 | |
|     \end{itemize*}
 | |
|     \item Superpipelining - noch mehr Befehlsaufteilung
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \subsection{Skalare Prozessoren}
 | |
|   \begin{itemize*}
 | |
|     \item Mikroarchitektur
 | |
|     \item Befehlszuordnung und Konfliktvermeidung geschieht durch Hardware
 | |
|     \item Speicherzugriffe automatisch von Load/Store Einheit
 | |
|     \item Befehlsstrom mit einfachem Befehl an EX-Einheit
 | |
|     \item bessere Reaktion auf Laufzeitereignisse
 | |
|     \item Spekulation möglich
 | |
|     \item Superskalar ($\geq 2$ EX Einheiten)
 | |
|     \begin{itemize*}
 | |
|       \item Befehle in Befehlsfenster gespeichert
 | |
|       \item Zuordnungseinheit wählt Befehl aus, die parallel verarbeitet werden können
 | |
|     \end{itemize*}
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Multiprozessorarchitekturen}
 | |
|   nach Flynn
 | |
|   \begin{center}
 | |
|     \begin{tabular}{ c | c | c}
 | |
|                        & Ein Datenstrom & mehrere Datenströme \\\hline
 | |
|       ein Befehlsstrom & SISD           & SIMD                \\
 | |
|       mehrere Bs       & MISD           & MIMD 
 | |
|     \end{tabular}
 | |
|   \end{center}
 | |
|   \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)
 | |
|   
 | |
|   %Dual-Core-System mit mehrstufiger Bushierarchie
 | |
|   % !{Dual Core System; Quelle RA2 Vorlesung 2020/21](Assets/RA2_DualCoreSystem.png)
 | |
|   
 | |
|   %Reales Shared Memory System
 | |
|   % !{Shared Memory System; Quelle RA2 Vorlesung 2020/21](Assets/RA2_SharedMemorySystem.png)
 | |
|   
 | |
|   \subsection{Kopplung}
 | |
|   \begin{description*}
 | |
|     \item[enge Kopplung] (shared memory)
 | |
|     \begin{itemize*}
 | |
|       \item parallelzugriff in Datenbreite des Prozessors
 | |
|       \item schneller Datenaustausch 
 | |
|       \item neu lokal benachbarte Rechner
 | |
|       \item aus Sicht des Prozessors gemeinsamer Speicher
 | |
|       \item Arbites - Zuteiler für Busanforderungen
 | |
|     \end{itemize*}
 | |
|     \item[lose Kopplung] (distributed memory)
 | |
|     \begin{itemize*}
 | |
|       \item meist seriell 1 bit breit
 | |
|       \item langsamer da über Kommunikations-schnittstelle
 | |
|       \item auch global verteilte Rechner
 | |
|       \item verschiedene Speicher dem Prozessor bewusst
 | |
|     \end{itemize*}
 | |
|     \item[Kopplung] verändern
 | |
|     \begin{itemize*}
 | |
|       \item Wartezeit auf Speicher
 | |
|       \item Kommunikationsaufwand
 | |
|       \item Kommunikationsfähigkeit
 | |
|     \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*}
 | |
|     \item statt Pipeline bei Datenabhängigen Befehlen um 2 Schritte verzögern, datenunabhängige Befehle einschieben
 | |
|     \item möglichst ständige Auslastung aller EX Einheiten
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Cache(daten)-Kohärenz}
 | |
|   \begin{itemize*}
 | |
|     \item Kohärenz: welcher Wert wird beim Lesen abgeliefert
 | |
|     \item Bezug auf Lesen und Schreiben ein- und derselben Speicherzelle
 | |
|     \item Definition: Ein Speichersystem heißt kohärent, wenn
 | |
|     \begin{itemize*}
 | |
|       \item geschriebene Werte werden wieder gelesen
 | |
|       \item Schreibvorgänge derselben Zelle serialisiert
 | |
|     \end{itemize*}
 | |
|     \item Lösung des I/O-Problems: Zuordnung einer I/O-Einheit zu jedem Prozessor
 | |
|     % !{Cache I/O Einheit; Quelle RA2 Vorlesung 2020/21](Assets/RA2_CacheIOEinheit.png)
 | |
|     \item Hardware-Lösung: Aufwändig, schlechte Lokalität der Daten
 | |
|     \item Gemeinsamer Cache für alle Prozessoren: Hoher Hardware-Aufwand, geringe Effizienz
 | |
|     \item Unterscheidung in cacheable/non-cacheable Daten: Hoher Aufwand
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Snooping-Protokolle}
 | |
|   \begin{itemize*}
 | |
|     \item Caches aller Prozessoren beobachten alle Daten- übertragungen von jedem Cache zum Hauptspeicher
 | |
|     \item Voraussetzung: broadcastfähiges Verbindungsnetzwerk
 | |
|   \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*}
 | |
|     \item Copy-Back Caches führen zur temp. Inkonsistenz
 | |
|     \item Lösung: exklusives Eigentumskonzept durch Zustandsgraph pro Cache-Block
 | |
|     \item MESI (Modified, Exclusive, Shared, Invalid)
 | |
|     \item Mischung zwischen Write-Through und Copy-Back
 | |
|   \end{itemize*}
 | |
| 
 | |
|   \paragraph{MESI}
 | |
|   \begin{center}
 | |
|     \includegraphics[width=\textwidth/6]{Assets/RA2_MESI-Zustände.png}
 | |
|     \includegraphics[width=\textwidth/6]{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{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*}
 | |
|     \item Invalidate-Signal: Invalidieren des Blocks in den Caches anderer Prozessoren
 | |
|     \item Shared-Signal: Signalisierung, ob ein zu ladendes Datum bereits als Kopie im Cache vorhanden ist
 | |
|     \item Retry-Signal: Aufforderung von Prozessor $P_i$ an Prozessor $P_j$, das Laden eines Datums vom Hauptspeicher abzubrechen, da der Hauptspeicher noch ein altes, ungültiges Datum besitzt und vorher aktualisiert werden muss. Das Laden durch $P_j$ kann danach wiederholt werden.
 | |
|   \end{itemize*}
 | |
|   
 | |
|   Bewertung von Snooping-Protokollen
 | |
|   \begin{itemize*}
 | |
|     \item Leichte Implementierbarkeit bei Bus-basierten Shared Memory Systemen
 | |
|     \item Snooping skaliert bei Bussen jedoch nicht
 | |
|     \item Bei vielen beteiligten Prozessoren sinkt die effektive Bandbreite des Busses, da überproportional viele Invalidierungsnachrichten per Broadcast über den Bus gehen
 | |
|     \item Punkt-zu-Punkt Netzwerke sind skalierbar, jedoch ist die Implementierung von Broadcasts hier aufwändig
 | |
|     \item Für Snooping-Protokolle daher oft ungeeignet
 | |
|   \end{itemize*}
 | |
|   
 | |
|   \paragraph{Directory-Protokolle}
 | |
|   \begin{itemize*}
 | |
|     \item Nur wenige Prozessoren teilen sich die gleichen Daten in vielen Anwendungen
 | |
|     \item Directory-Protokolle nutzen Lokalitätsinformationen, um die Anzahl an Invalidierungsnachrichten zu minimieren
 | |
|     \item Nachrichten gehen nur an Prozessoren, die eine Kopie des Cache-Blocks besitzen
 | |
|     \item Directory-Protokolle skalieren daher auch für Netze ohne Broadcast-Fähigkeit
 | |
|     \item Presence Flag Vector: Im Hauptspeicher abgelegter Bit-Vektor für jeden einzelnen Speicherblock (1 Bit pro Prozessor/Cache + Statusbits (dirty, modified))
 | |
|     \item Problem: Wachstum des Speicherbedarfs linear mit Anzahl der Prozessoren
 | |
|   \end{itemize*}
 | |
|   
 | |
| \end{multicols}
 | |
| \end{document} |