Informatik/Rechnerarchitekturen 2 - Cheatsheet.tex

806 lines
40 KiB
TeX
Raw Normal View History

2021-07-12 09:42:10 +00:00
\documentclass[a4paper]{article}
2021-02-05 11:55:40 +00:00
\usepackage[ngerman]{babel}
2021-07-12 09:42:10 +00:00
\usepackage[utf8]{inputenc}
2021-02-05 11:55:40 +00:00
\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
2021-07-12 09:42:10 +00:00
\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
2021-02-05 11:55:40 +00:00
\pdfinfo{
2021-03-12 13:44:10 +00:00
/Title (Rechnerarchitekturen 2 - Cheatsheet)
2021-02-05 11:55:40 +00:00
/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}}
2021-07-12 09:42:10 +00:00
{\geometry{top=1.3cm,left=1cm,right=1cm,bottom=1.2cm} }
{\geometry{top=1.3cm,left=1cm,right=1cm,bottom=1.2cm} }
2021-02-05 11:55:40 +00:00
}
2021-07-12 09:42:10 +00:00
2021-02-05 11:55:40 +00:00
% 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}
2021-02-15 07:22:19 +00:00
\footnotesize
2021-03-12 13:44:10 +00:00
\begin{description*}
2021-02-15 07:22:19 +00:00
\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}$
2021-03-12 13:44:10 +00:00
\end{description*}
2021-02-05 11:55:40 +00:00
\end{multicols}
2021-02-15 07:22:19 +00:00
\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}
}
2021-02-05 11:55:40 +00:00
\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}
2021-02-15 07:22:19 +00:00
2021-03-31 06:31:57 +00:00
\section{Prozessorarchitekturen}
2021-03-30 12:45:59 +00:00
\paragraph{CISC} complex instruction set computer
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Einfache und komplexe Befehle
\item Heterogener Befehlssatz
2021-03-30 12:45:59 +00:00
\item verschiedene Taktzahl pro Befehl
2021-02-05 11:55:40 +00:00
\item Viele Befehlscode-Formate mit unterschiedlicher Länge
\item Mikroprogrammwerk
\item Vermischung von Verarbeitungs \& Speicherbefehlen
\item schwierig, unter CPI = 2 zu kommen
\end{itemize*}
2021-03-30 12:45:59 +00:00
\paragraph{RISC} reduced instruction set computer
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item wenige, einfache Befehle
2021-03-30 12:45:59 +00:00
\item orthogonaler Befehlssatz
\item meist 1 Takt pro Befehl
\item wenige Befehlscode-Formate mit einheitlicher Länge
2021-02-05 11:55:40 +00:00
\item Direktverdrahtung
\item Trennung von Verarbeitungs \& Speicherbefehlen
2021-03-30 12:45:59 +00:00
\item hohe Ausführungsgeschwindigkeit $(CPI \leq 1)$
2021-02-05 11:55:40 +00:00
\end{itemize*}
\paragraph{MIPS}
\begin{itemize*}
\item Microprocessor without interlocked pipeline stages
\item 32-bit Architektur/64-bit Erweiterung
\end{itemize*}
2021-03-31 09:19:12 +00:00
\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}
2021-02-05 11:55:40 +00:00
Aufgaben der einzelnen Phasen
2021-03-12 13:44:10 +00:00
\begin{description*}
2021-03-31 06:31:57 +00:00
\item[Befehlsholphase] Lesen des aktuellen Befehls; separater zur Vermeidung von Konflikten mit Datenzugriffen
2021-02-05 11:55:40 +00:00
\item[Dekodier \& Register-Lese-Phase] Lesen der Register möglich wegen fester Plätze für Nr. im Befehlswort
2021-03-31 06:31:57 +00:00
\item[Ausführungs \& Adressberechnungsphase] Berechnung arithmetischer Funktion o. Adresse für Speicherzugriff
2021-02-05 11:55:40 +00:00
\item[Speicherzugriffsphase] Wird nur bei Lade \& Speicherbefehlen benötigt
\item[Abspeicherungsphase] Speichern in Register, bei Speicherbefehlen nicht benötigt
2021-03-12 13:44:10 +00:00
\end{description*}
2021-02-05 11:55:40 +00:00
\paragraph*{Hazards}
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item resource hazards: Ressourcenabhängigkeiten
2021-02-05 11:55:40 +00:00
\item data hazards: Datenabhängigkeiten
2021-03-12 13:44:10 +00:00
\begin{description*}
2021-03-31 09:19:12 +00:00
\item[Antidatenabhängig] WAR (write after read)
\item[Ausgabeabhängig] WAW (write after write)
\item[Datenabhängigkeit] RAW (read after write)
2021-03-12 13:44:10 +00:00
\end{description*}
2021-02-05 11:55:40 +00:00
\item control hazards: Kontrollabhängigkeiten
\begin{itemize*}
2021-03-31 09:19:12 +00:00
\item Gleichheit der Register in ID-Stufe prüfen
\item Sprungziel in separatem Adressaddierer in ID berechnet
2021-02-05 11:55:40 +00:00
\end{itemize*}
\end{itemize*}
2021-03-31 06:31:57 +00:00
\subsection{Sprungvorhersage}
2021-02-05 11:55:40 +00:00
\paragraph{Einfache lokale Prädiktoren}
\begin{itemize*}
2021-03-31 09:19:12 +00:00
\item Vorhersage: bedingter Sprung genommen oder nicht
\item Prädiktion anhand der Historie des betrachteten Sprungs
2021-03-31 06:31:57 +00:00
\item Historie eines Sprungs wird mit 1 bis n Bits gepuffert
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Einfache Sprungvorhersage (1 Bit)}
2021-02-05 11:55:40 +00:00
\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
2021-03-31 09:19:12 +00:00
\item Sprünge, gleicher Adressen im Indexteil, werden selber Zelle im branch prediction buffer zugeordnet
2021-03-31 06:31:57 +00:00
\item Einfachste Art von Puffer
2021-02-05 11:55:40 +00:00
\item Hat eine bestimmte Kapazität
2021-02-15 07:22:19 +00:00
\item Kann nicht für alle Sprünge Einträge enthalten
2021-03-31 09:19:12 +00:00
\item Reduziert branch penalty, wenn branch delay $>$ Berechnung der Zieladresse mit branch p. buffer
2021-02-05 11:55:40 +00:00
\item Prädiktion kann fehlerhaft sein
2021-03-31 06:31:57 +00:00
\item Prädiktion kann von anderem Sprungbefehl stammen
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Einführung von Tag Bits}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 09:19:12 +00:00
\item Sprünge, gleicher Adressen im Indexteil, in selber Zelle
2021-02-15 07:22:19 +00:00
\item Tag: gültiger Eintrag, falls Tag-Bits gleich sind
2021-03-31 09:19:12 +00:00
\item Fehlerrate 1-Bit-P in Schleifenkonstrukten doppelt so hoch wie Anzahl ausgeführter Sprünge
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{2 Bit Vorhersagen}
2021-02-05 11:55:40 +00:00
\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)
2021-03-31 06:31:57 +00:00
\paragraph{n-Bit Prädikator}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Verwendet n-Bit Zähler
\item Sättigungsarithmetik (kein wrap around bei Überlauf)
2021-02-15 07:22:19 +00:00
\item Kann Werte zwischen $0$ und $2^{n-1}$ annehmen
2021-03-31 09:19:12 +00:00
\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
2021-02-15 07:22:19 +00:00
\item Praxis: 2-Bit Prädiktor ähnlich gut wie n-Bit Prädiktor
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Korrelierende Prädikatoren}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item Betrachtet nur Verhalten eines Sprungs; rein lokal
2021-03-31 09:19:12 +00:00
\item Verbesserung durch Betrachtung anderer Sprünge
2021-02-15 07:22:19 +00:00
\item erhält so korrelierenden/zweistufigen Prädiktor
\item Prinzip: Aufgrund globaler Information wird einer von mehreren lokalen Prädiktoren ausgewählt
2021-03-31 06:31:57 +00:00
\item Beziehen zur Vorhersage des Verhaltens Kontext-Information mit ein
2021-02-05 11:55:40 +00:00
\item Prädiktor benutzt globale Kontext-Bits, um einen von mehreren lokalen Prädiktoren auszuwählen
2021-02-15 07:22:19 +00:00
\item Betrachten wiederholte Ausführung des Codefragments
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Zweistufiger Prädiktor}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Es existieren 2 lokale Prädiktoren, beide je 1-Bit
2021-02-15 07:22:19 +00:00
\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
2021-03-31 06:31:57 +00:00
\item Letzter Sprung ist i.a. nicht gleich aktuellem Sprung
2021-02-15 07:22:19 +00:00
\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
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{(m,n)-Prädiktor}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item Betrachtet das Verhalten der letzten m Sprünge, um aus $2^m$ vielen lokalen Prädiktoren einen n-Bit Prädiktor auszuwählen
2021-02-05 11:55:40 +00:00
\item Höhere Vorhersagegenauigkeit
\item Erfordert kaum Hardwareaufwand
2021-03-31 06:31:57 +00:00
\item Sprunggeschichte in m-Bit Schieberegister gespeichert
2021-02-15 07:22:19 +00:00
\item Vorhersagepuffer adressiert via Konkatenation von unteren Adressbits der Sprungbefehlsadresse
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 09:19:12 +00:00
\begin{center}
\includegraphics[width=\textwidth/7]{Assets/RA2_Vorhersagen.png}
\end{center}
2021-03-31 06:31:57 +00:00
2021-03-31 09:19:12 +00:00
\paragraph{High Performance Befehlsdekodierung}
2021-02-15 07:22:19 +00:00
reine Vorhersage eines Sprungs i.d.R. nicht ausreichend
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-02-15 07:22:19 +00:00
\item Befehlsstrom mit großer Bandbreite erforderlich
2021-03-31 06:31:57 +00:00
\item Kontrollflussabhängigkeiten dürfen nicht wahrnehmbar sein
2021-02-15 07:22:19 +00:00
\item Pufferung von Sprungzielen und nicht nur Vorhersage des Sprungverhaltens (branch target buffer)
\item Integrierte Einheit für das Holen der Befehle
2021-02-05 11:55:40 +00:00
\item Vorhersage von Rücksprungadressen (bei Prozeduraufruf)
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Branch Target Buffer}
2021-02-15 07:22:19 +00:00
5-stufige Pipeline, Auswertung von Sprungbedingungen in EX
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Branch delay von 2 Takten
2021-03-31 06:31:57 +00:00
\item mit Sprungvorhersage (branch prediction buffer)
\item Zugriff erfolgt in ID (Adresse des Sprungbefehls in IF bekannt)
2021-02-05 11:55:40 +00:00
\item Nächste vorhergesagte Instruktion kann erst nach ID geholt werden
\item Branch delay = 1, falls Prädiktion korrekt
2021-03-31 06:31:57 +00:00
\item Mit Pufferung des Sprungziels
\item Zugriff auf branch target buffer erfolgt in IF
\item Verhalten wie „echter“ Cache, adressiert mit Sprungbefehlsadresse
2021-02-15 07:22:19 +00:00
\item Liefert vorhergesagte Adresse als Ergebnis
\item Keine Verzögerung, falls Prädiktion korrekt
\item Zusätzliche Speicherung auch des Sprungziels
2021-03-31 06:31:57 +00:00
\item bei geschickter Organisation bleibt das Fließband immer gefüllt
\item Sprünge kosten dann effektiv keine Zeit; $CPI <1$ mögl.
2021-02-05 11:55:40 +00:00
\end{itemize*}
Eigenschaften
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\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
2021-02-15 07:22:19 +00:00
\item Speicherung nur für Sprünge notwendig, die als ausgeführt vorhergesagt werden
2021-03-31 06:31:57 +00:00
\item entsteht ursprüngliche Sprung-Verzögerung plus Aufwand zur Aktualisierung des Vorhersagepuffers
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Integrierte Befehls-Hol-Einheit (IF Unit)}
2021-02-05 11:55:40 +00:00
Insbesondere mit Blick auf multiple-issue Prozessoren eigene (autonome) funktionale Einheit für Befehlsholphase
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item führt Befehlscodes in Pipeline ein
2021-02-15 07:22:19 +00:00
\item Sprungvorhersage wird Teil der Befehlsholphase
2021-03-31 06:31:57 +00:00
\item Instruction Pre-fetch: Insbes. um mehrere Befehle pro Takt liefern zu können, läuft Befehlsholen weiterer Dekodierung voraus
2021-02-05 11:55:40 +00:00
\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*}
2021-03-31 06:31:57 +00:00
\paragraph{Vorhersage von Rücksprungadressen}
Vorhersage indirekter Sprünge (d.h. bzgl. Basisadresse in Register)
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Hauptverwendung: Rückkehr aus Prozeduraufrufen
2021-03-31 06:31:57 +00:00
\item MIPS: Prozeduraufruf per $jal$, Rückkehr per $jr$
2021-02-05 11:55:40 +00:00
\item Vorhersage mit branch target buffer schlecht, da Aufruf aus unterschiedlichen Codeteilen heraus möglich
\item Methode: (Stack-) Speicher für Rücksprungadressen
2021-03-31 06:31:57 +00:00
\item Push bei Prozeduraufruf (call)
2021-02-05 11:55:40 +00:00
\item Pop bei Rücksprung (return)
\item Vorhersagequalität „perfekt“, wenn Stack-Puffer größer als maximale Aufruftiefe
\end{itemize*}
2021-03-31 06:31:57 +00:00
\section{Multiple-Issue-Architekturen}
\paragraph{Mehrere Ausführungseinheiten}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item Weitere Leistungssteigerung $CPI < 1$
2021-02-15 07:22:19 +00:00
\item Mehrere Befehle pro Takt ausgeben
2021-03-31 06:31:57 +00:00
\item Zwei Grundtypen von multiple-issue Prozessoren
2021-03-12 13:44:10 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\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)
2021-03-12 13:44:10 +00:00
\end{itemize*}
2021-02-05 11:55:40 +00:00
\end{itemize*}
% !{In Order Pipeline; Quelle RA2 Vorlesung 2020/21](Assets/RA2_in-order-pipeline.png)
2021-03-31 06:31:57 +00:00
\subsection{Superskalar}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item IF holt 1-n Befehle von Instruction Fetch Unit
2021-02-05 11:55:40 +00:00
\item Befehlsgruppe, die potentiell ausgegeben werden kann = issue packet
2021-02-15 07:22:19 +00:00
\item Konflikte bzgl. Befehlen im issue packet werden in Issue-Stufe in Programmreihenfolge geprüft
2021-02-05 11:55:40 +00:00
\item Befehl ggfs. nicht ausgegeben (und alle weiteren)
\item Aufwand für Prüfung in Issue-Stufe groß!
2021-02-15 07:22:19 +00:00
\item Wegen Ausgewogenheit der Pipeline-Stufen ggfs. Issue in mehrere Stufen unterteilen = nicht-trivial
\item Parallele Ausgabe von Befehlen limitierender Faktor superskalarer Prozessoren
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{MIPS mit statischem Scheduling}
2021-02-05 11:55:40 +00:00
\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“)
2021-03-31 06:31:57 +00:00
\item 2 Befehlsworte holen (64-Bit Zugriff, komplexer als 1 B.)
2021-02-15 07:22:19 +00:00
\item Prüfen, ob 0/1/2 Befehle ausgegeben werden können
2021-03-31 06:31:57 +00:00
\item Befehle ausgeben an korrespondierende funk. Einheiten
2021-02-05 11:55:40 +00:00
\item Prüfen auf Konflikte durch Entflechtung vereinfacht
2021-03-31 06:31:57 +00:00
\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
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Dynamisches Scheduling} in-order-execution
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item Jeder Befehl, der aus der Instruction fetch-Einheit kommt, durchläuft Scoreboard
2021-02-15 07:22:19 +00:00
\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
2021-03-31 06:31:57 +00:00
\item Scoreboard erteilt Befehlen die Berechtigung zum Abspeichern von Ergebnissen und prüft, ob dadurch neue Befehle ausführbereit werd
2021-02-15 07:22:19 +00:00
\item Zentrale Datenstruktur: Scoreboard (für Befehlsstatus)
2021-02-05 11:55:40 +00:00
\item load/store-Architektur
2021-02-15 07:22:19 +00:00
\item mehrere funktionale Einheiten
2021-03-31 06:31:57 +00:00
\item Scoreboarding für MIPS nur sinnvoll wenn:
2021-02-05 11:55:40 +00:00
\item für FP-Pipeline (Operationen mit mehreren Taktzyklen)
2021-03-31 06:31:57 +00:00
\item mehrere funktionale Einheiten (zB: 2xMult, Div, Add, Int)
2021-02-05 11:55:40 +00:00
\end{itemize*}
% !{Out Of Order Execution; Quelle RA2 Vorlesung 2020/21](Assets/RA2_out-of-order-execution.png)
2021-03-31 06:31:57 +00:00
\paragraph{Verfahren von Tomasulo}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item erlaubt bei Ausgabe-/Antidatenabhängigkeiten Reihenfolge zu vertauschen
2021-02-15 07:22:19 +00:00
\item Umbenennung der Register
\item verschiedenen Benutzungen eines Registers werden verschiedene Speicherzellen zugeordnet
2021-02-05 11:55:40 +00:00
\item Jeder funktionalen Einheit wird eine Reservation Station zugeordnet
2021-02-15 07:22:19 +00:00
\item Reservation Stations enthalten die auszuführende Operation und die Operanden/tags des Operanden
2021-02-05 11:55:40 +00:00
\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
2021-03-31 06:31:57 +00:00
\item Registeradressen werden dynamisch auf größere Anzahl von Plätzen in den Reservation Stations abgebildet
2021-02-15 07:22:19 +00:00
\item Performance-Beschränkungen wegen weniger Register werden so umgangen
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Register Renaming}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-02-15 07:22:19 +00:00
\item Verwendung temporärer Register für (logisch) neue möglicherweise interferierende Belegung
2021-03-31 06:31:57 +00:00
\item Alle Namenskonflikte durch Umbenennung auflösbar
2021-02-05 11:55:40 +00:00
\item Wichtige Hardwarestruktur: Reservation Stations
2021-03-31 06:31:57 +00:00
\item Zugeordnet zu funktionalen Einheiten (pro Einheit)
2021-02-15 07:22:19 +00:00
\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
2021-02-05 11:55:40 +00:00
\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
2021-03-31 06:31:57 +00:00
\item Realisiert implizit Register Renaming durch gemeinsamen Ergebnisbus (common data bus)
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\subsection{Multiple-Issue mit dynamischem Scheduling}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-02-15 07:22:19 +00:00
\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
2021-03-31 06:31:57 +00:00
\item Lösung: Erweiterung des Tomasulo-Algorithmus auf Multiple-Issue
\item Sequentielles Ausgeben mehrerer Befehle an Reservation Stations innerhalb eines Taktes
2021-02-15 07:22:19 +00:00
\item oder „Verbreiterung“ der Ausgabe-Logik (issue logic) zur Behandlung mehrerer Operationen parallel
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-30 12:45:59 +00:00
\paragraph{VLIW} Very Long Instruction Word
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\item Befehlszuordnung und Konfliktvermeidung durch Compiler
\item Compiler muss Zeitbedarf der Speicherzugriffe in Befehlsplanung einbeziehen
\item Befehlsstrom mit Tupel von Befehlen
2021-03-31 06:31:57 +00:00
\item flexibel bei Reaktion auf Laufzeitereignisse
2021-03-30 12:45:59 +00:00
\item VLIW hat festes Befehlsformat; höhere Codedichte
2021-03-31 06:31:57 +00:00
\item Forwarding Hardware - nach EX können Daten vom nächsten Befehl genutzt werden
2021-03-30 12:45:59 +00:00
\item WB erfolgt erst darauf
\item Datenabhängigkeitsproblem wird verringert
\item MUX nutzt eher Pufferdaten als Registerdaten
2021-02-05 11:55:40 +00:00
\item verschiedene parallele Ausführungseinheiten
\item Verteilung von Maschinencode direkt vom Befehlswort im Speicher vorgegeben
2021-02-15 07:22:19 +00:00
\item für jede Ausführungseinheit dezidierte Anweisungen
2021-03-31 06:31:57 +00:00
\item meist für stark parallelisierbare Aufgaben verwendet
2021-02-05 11:55:40 +00:00
\item Vorteile:
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\item parallele Architektur des Prozessors kann während der Programmerstellung zur Optimierung genutzt werden
2021-02-15 07:22:19 +00:00
\item Keine aufwendige Prozessorhardware zur Befehlsverteilung erforderlich
2021-02-05 11:55:40 +00:00
\item Ausführungszeiten sind im wesentlichen bekannt
\end{itemize*}
\item Nachteile:
\begin{itemize*}
\item Aufwendigere Compiler
\item Schlechte Prozessorauslastung bei ungünstigem Code
2021-02-15 07:22:19 +00:00
\item Rekompilierung für den Prozessor erforderlich
\item Größerer Speicherbedarf, wenn Code nicht parallelisiert werden kann
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\end{itemize*}
2021-02-05 11:55:40 +00:00
% !{VLIW Dynamisch; Quelle RA2 Vorlesung 2020/21](Assets/RA2_VLIW-dynamisch.png)
2021-03-31 06:31:57 +00:00
\paragraph{EPIC} Explicitely Parallel Instruction Computing = IA64
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item im wesentlichen Prinzip des VLIW-Prozessors
\item Umsortieren der Befehle und Auflösung der Abhängigkeiten wird durch Compiler durchgeführt
2021-02-15 07:22:19 +00:00
\item Hauptnachteil: Neukompilierung erforderlich
2021-02-05 11:55:40 +00:00
\item Keine statische Aufteilung auf Funktionseinheiten
2021-02-15 07:22:19 +00:00
\item Effizienteres Befehlswort
\item Keine Verwendung von zwangsweise NOPs
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
verschiedene Ansätze, um die Prozessorlogik zu vereinfachen
2021-02-05 11:55:40 +00:00
\begin{enumerate*}
\item Bedingte Befehlsverarbeitung
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\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
2021-02-05 11:55:40 +00:00
\end{itemize*}
\item Statische Sprungvorhersage (Compiler)
2021-03-31 06:31:57 +00:00
\item Die Optimierung wird dem Compiler überlassen
2021-02-05 11:55:40 +00:00
\item Spekulatives Laden von Operanden
\begin{itemize*}
\item Möglichst geringe Wartezeit auf Operanden
2021-03-31 06:31:57 +00:00
\item Schon im Compiler werden entsprechende Ladebefehle vorgezogen
2021-02-05 11:55:40 +00:00
\end{itemize*}
\end{enumerate*}
% !{VLIW Vergleich; Quelle RA2 Vorlesung 2020/21](Assets/RA2_VLIW-vergleich.png)
2021-02-15 07:22:19 +00:00
\subsection{Simultaneous Multithreading (SMT)}
2021-02-05 11:55:40 +00:00
% !{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*}
2021-02-15 07:22:19 +00:00
\subsection{Speicherhierarchie}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Große Speicher sind langsam
\item Anwendung verhalten sich üblicherweise lokal
2021-03-31 06:31:57 +00:00
\item Häufig benötigte Speicherinhalte in kleinen Speichern
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-02-15 07:22:19 +00:00
\begin{center}
2021-03-31 09:19:12 +00:00
\includegraphics[width=\textwidth/4]{Assets/RA2_Speicherhierarchie.png}
2021-02-15 07:22:19 +00:00
\end{center}
2021-02-05 11:55:40 +00:00
2021-04-25 09:09:08 +00:00
\vfill
2021-03-30 12:45:59 +00:00
\section{Speicherarchitekturen}
\paragraph{Adresspipelining}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\item Aufteilen des Speicherzugriffs in mehrere Phasen
\item parallele gestaffelte Abarbeitung dieser Phasen für mehrere Speicherzugriffe
\item Adresse auslesen/dekodieren; Daten mit Prozessor
2021-02-15 07:22:19 +00:00
\end{itemize*}
2021-03-30 12:45:59 +00:00
% !{Pipelining; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Adresspipelining.png)
2021-02-15 07:22:19 +00:00
Lesezugriff auf Speicher
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\item Matrixaufbau eines Speichers
2021-03-31 06:31:57 +00:00
\item Aufteilen der Speicheradresse in Zeilen- und Spalten
2021-02-05 11:55:40 +00:00
\item Dekodierung der Zeilenadresse bestimmt Select-Leitung
\item Komplette Zeile wird in den Zeilenpuffer geschrieben
2021-03-30 12:45:59 +00:00
\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
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-02-15 07:22:19 +00:00
\subsection{Typischer DRAM-Speicher}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
\item Adressleitungen werden i.d.R. gemultiplext
2021-02-15 07:22:19 +00:00
\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
2021-02-05 11:55:40 +00:00
\item Zeilenadressdecoder liefert Select-Leitung für eine Zeile
2021-02-15 07:22:19 +00:00
\item Komplette Zeile wird in einen Zwischenpuffer übernommen und zurückgeschrieben
2021-02-05 11:55:40 +00:00
\item Nur 1 Transistor und 1 Kondensator pro Speicherzelle, statt 6 Transistoren bei SRAM
\item Integrationsdichte Faktor 4 höher als bei SRAMs
2021-03-31 06:31:57 +00:00
\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
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-02-15 07:22:19 +00:00
%Interleaving
2021-02-05 11:55:40 +00:00
% !{Interleaving; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Interleaving.png)
2021-03-31 06:31:57 +00:00
2021-03-30 12:45:59 +00:00
\subsection{Cache Speicher}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item kleiner, schneller prozessornaher Speicher
\item Puffer zwischen Hauptspeicher und Prozessor
2021-03-30 12:45:59 +00:00
\item CPU weiß nicht dass Cache zwischengeschaltet ist
2021-03-31 06:31:57 +00:00
\item es wird immer zuerst im Cache nachgeschaut (kostet Zeit)
2021-02-15 07:22:19 +00:00
\item 90\% der Zeit verbringt ein Programm in 10\% des Codes
2021-03-30 12:45:59 +00:00
\item Cache besteht aus Cache Tabelle
\begin{description*}
\item[voll assoziativ] Adressvergl. der kompletten Adresse
2021-03-31 06:31:57 +00:00
\item[direct-mapped] Adressvergleich nur über Teiladresse
\item[mehr-wege-assoziativ] mehrere Adressverg. parallel
2021-03-30 12:45:59 +00:00
\end{description*}
\item Schreibstategien
\begin{description*}
2021-03-31 09:19:12 +00:00
\item[Write Back] Cache sammelt Schreibvorgänge und aktualisiert Speicher nach Anweisung
2021-03-31 06:31:57 +00:00
\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)
2021-03-30 12:45:59 +00:00
\end{description*}
\item Speicherverwaltung mit memory management günstiger vor dem Cache
2021-03-31 06:31:57 +00:00
\item cache hit: benötigte Daten im Cache vorhanden
\item cache miss: Zugriff auf den (Haupt-) Speicher
2021-02-15 07:22:19 +00:00
%\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
2021-02-05 11:55:40 +00:00
\item Methoden dazu:
\begin{itemize*}
2021-03-31 06:31:57 +00:00
\item Schnelles Lesen aufeinanderfolgender Speicherzellen (Burst Mode)
2021-02-05 11:55:40 +00:00
\item Interleaving (mehrere Speicher ICs mit überlappenden Zugriffen)
2021-03-31 06:31:57 +00:00
\item Fließbandzugriff auf den Speicher (SDRAM)
\item Breite Speicher übertragen mehrere Worte parallel
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-02-15 07:22:19 +00:00
%\item 2-Wege Cache (Datensicht) !{2 Wege Cache; Quelle RA2 Vorlesung 2020/21](Assets/RA2_2-wege-cache.png)
2021-02-05 11:55:40 +00:00
\item Ersetzungs-Strategien
2021-03-30 12:45:59 +00:00
\begin{description*}
\item[Zufall] zu ersetzende Block zufällig ausgewählt
\item[FIFO] älteste Block ersetzt
2021-03-31 06:31:57 +00:00
\item[LRU](least recently used) längsten nicht zugegriffen
\item[LFU](least frequently used) am seltensten gelesene
\item[CLOCK] Zeiger im Uhrzeigersinn zeigt Eintrag
2021-03-30 12:45:59 +00:00
\end{description*}
2021-03-31 06:31:57 +00:00
\item Trefferquote $T=\frac{N_{Cache Zugriffe}}{N_{Cache Hit}}$
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-30 12:45:59 +00:00
\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}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\item Aufteilung eines Befehls in Teilbefehle
2021-03-31 09:19:12 +00:00
\item parallele Abarbeitung verschiedener Teilbefehle
\item Problem: bedingte Sprünge (unvorhergesehen)
2021-03-30 12:45:59 +00:00
\begin{itemize*}
\item LSG: Pipeline um 2 Schritte verzögern
\item LSG: Sprungzielspekulation
2021-03-31 09:19:12 +00:00
\end{itemize*}
2021-07-12 09:42:10 +00:00
\item Problem: Datenabhängigkeit
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\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
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-30 12:45:59 +00:00
\subsection{Skalare Prozessoren}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-30 12:45:59 +00:00
\item Mikroarchitektur
\item Befehlszuordnung und Konfliktvermeidung geschieht durch Hardware
\item Speicherzugriffe automatisch von Load/Store Einheit
2021-03-31 09:19:12 +00:00
\item Befehlsstrom mit einfachem Befehl an EX-Einheit
2021-03-30 12:45:59 +00:00
\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*}
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 09:19:12 +00:00
\paragraph{Multiprozessorarchitekturen}
nach Flynn
2021-02-15 07:22:19 +00:00
\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}
2021-03-31 09:19:12 +00:00
\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}
2021-07-12 09:42:10 +00:00
2021-02-15 07:22:19 +00:00
%Verbindungsnetzwerke
2021-02-05 11:55:40 +00:00
% !{Verbindungsnetzwerke; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Verbindungsnetzwerke.png)
% !{Verbindungsnetzwerke2; Quelle RA2 Vorlesung 2020/21](Assets/RA2_Verbindungsnetzwerke2.png)
2021-02-15 07:22:19 +00:00
%Dual-Core-System mit mehrstufiger Bushierarchie
2021-02-05 11:55:40 +00:00
% !{Dual Core System; Quelle RA2 Vorlesung 2020/21](Assets/RA2_DualCoreSystem.png)
2021-02-15 07:22:19 +00:00
%Reales Shared Memory System
2021-02-05 11:55:40 +00:00
% !{Shared Memory System; Quelle RA2 Vorlesung 2020/21](Assets/RA2_SharedMemorySystem.png)
2021-03-31 06:31:57 +00:00
2021-03-30 12:45:59 +00:00
\subsection{Kopplung}
\begin{description*}
\item[enge Kopplung] (shared memory)
\begin{itemize*}
\item parallelzugriff in Datenbreite des Prozessors
2021-03-31 09:19:12 +00:00
\item schneller Datenaustausch
2021-03-30 12:45:59 +00:00
\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
2021-03-31 06:31:57 +00:00
\end{itemize*}
2021-03-30 12:45:59 +00:00
\end{description*}
2021-03-31 09:19:12 +00:00
\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*}
2021-02-05 11:55:40 +00:00
2021-03-30 12:45:59 +00:00
\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*}
2021-03-31 06:31:57 +00:00
\paragraph{Cache(daten)-Kohärenz}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-02-15 07:22:19 +00:00
\item Kohärenz: welcher Wert wird beim Lesen abgeliefert
2021-02-05 11:55:40 +00:00
\item Bezug auf Lesen und Schreiben ein- und derselben Speicherzelle
\item Definition: Ein Speichersystem heißt kohärent, wenn
2021-03-12 13:44:10 +00:00
\begin{itemize*}
2021-02-15 07:22:19 +00:00
\item geschriebene Werte werden wieder gelesen
\item Schreibvorgänge derselben Zelle serialisiert
2021-03-12 13:44:10 +00:00
\end{itemize*}
2021-02-15 07:22:19 +00:00
\item Lösung des I/O-Problems: Zuordnung einer I/O-Einheit zu jedem Prozessor
2021-02-05 11:55:40 +00:00
% !{Cache I/O Einheit; Quelle RA2 Vorlesung 2020/21](Assets/RA2_CacheIOEinheit.png)
2021-02-15 07:22:19 +00:00
\item Hardware-Lösung: Aufwändig, schlechte Lokalität der Daten
2021-02-05 11:55:40 +00:00
\item Gemeinsamer Cache für alle Prozessoren: Hoher Hardware-Aufwand, geringe Effizienz
2021-02-15 07:22:19 +00:00
\item Unterscheidung in cacheable/non-cacheable Daten: Hoher Aufwand
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Snooping-Protokolle}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-03-31 09:19:12 +00:00
\item Caches aller Prozessoren beobachten alle Daten- übertragungen von jedem Cache zum Hauptspeicher
2021-02-05 11:55:40 +00:00
\item Voraussetzung: broadcastfähiges Verbindungsnetzwerk
\end{itemize*}
2021-03-31 09:19:12 +00:00
\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*}
2021-02-05 11:55:40 +00:00
2021-03-31 06:31:57 +00:00
\paragraph{Copy-Back}
2021-02-05 11:55:40 +00:00
\begin{itemize*}
2021-02-15 07:22:19 +00:00
\item Copy-Back Caches führen zur temp. Inkonsistenz
2021-02-05 11:55:40 +00:00
\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*}
2021-04-25 09:09:08 +00:00
2021-02-15 07:22:19 +00:00
\paragraph{MESI}
2021-03-31 09:19:12 +00:00
\begin{center}
2021-07-12 09:42:10 +00:00
\includegraphics[width=\textwidth/6]{Assets/RA2_MESI-Zustände.png}
\includegraphics[width=\textwidth/6]{Assets/RA2_MESI-Bedingungen.png}
2021-03-31 09:19:12 +00:00
\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*}
2021-03-31 06:31:57 +00:00
\paragraph{Bus-Operationen}
2021-03-31 09:19:12 +00:00
\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*}
2021-03-31 06:31:57 +00:00
\paragraph{Steuersignale}
2021-02-15 07:22:19 +00:00
\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*}
2021-03-31 06:31:57 +00:00
2021-02-15 07:22:19 +00:00
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
2021-02-05 11:55:40 +00:00
\end{itemize*}
2021-03-31 06:31:57 +00:00
\paragraph{Directory-Protokolle}
2021-02-05 11:55:40 +00:00
\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
2021-02-15 07:22:19 +00:00
\item Presence Flag Vector: Im Hauptspeicher abgelegter Bit-Vektor für jeden einzelnen Speicherblock (1 Bit pro Prozessor/Cache + Statusbits (dirty, modified))
2021-02-05 11:55:40 +00:00
\item Problem: Wachstum des Speicherbedarfs linear mit Anzahl der Prozessoren
2021-03-31 06:31:57 +00:00
\end{itemize*}
2021-03-12 13:44:10 +00:00
2021-02-05 11:55:40 +00:00
\end{multicols}
\end{document}