CPU: Unterschied zwischen den Versionen

Aus Foxwiki
Markierung: Ersetzt
Zeile 8: Zeile 8:
==== Links ====
==== Links ====
===== Weblinks =====
===== Weblinks =====
= TMP =
==Funktion==
Mikroprozessoren sind hochkomplexe Maschinen. Sie basieren jedoch
auf einem einfachen Grundprinzip. Wer es kennt, versteht auch die
Funktionsweise der modernen CPUs.
==History==
* Die Von-Neumann-Architektur besteht aus vier Funktionseinheiten, die in Bild 1 zu sehen sind: Rechenwerk, Steuerwerk, Speicher (Memory) und Ein-/Ausgabeeinheit (I/O-Unit).
* Dazu kommen noch die Verbindungen zwischen den Funktionsblöcken - das Bussystem.
* Die beiden wichtigsten Einheiten Rechenwerk und Steuerwerk sind im Prozessor vereint.
* Die CPU als Ganzes übernimmt innerhalb des Von-Neumann-Rechners die Ausführung von Befehlen und die notwendige Ablaufsteuerung.
[[Datei:Bild 001.png|mini]]
'''Bild 1'''
'''Von-Neumann-Rechner:''' Er beinhaltete schon vor 50 Jahren die wesentlichen Bestandteile heutiger PCs.
==Von-Neumann-Rechner==
* Die Anpassung für jedes zu lösende Problem erfolgt mit im Speicher abgelegten Programmen.
* Diese Software beinhaltet die Informationen zur Steuerung des Rechners.
* Jede Speicherzelle ist mit einer festen Adresse eindeutig identifizierbar.
* In ihrer ursprünglichen Form verarbeitet sie mit nur einem Prozessor Schritt für Schritt Befehle und Daten, die aus dem Speicher stammen.
** Obwohl Befehle und Daten aus dem gleichen Speicher kommen, gibt es nur eine Busverbindung für Beides dorthin.
** So wurde eine hierarchisch gegliederte Speicherstruktur mit Registern und verschiedenen Cache-Ebenen eingeführt.
** Die sequenzielle Befehlsausführung wird in der CPU nach Kräften parallelisiert.
** Dazu stehen mehrere Funktionseinheiten und Ausführungsebenen bereit.
==Erweiterte Architektur==
* Der Von-Neumann-Rechner holt alle Befehle und Daten direkt aus dem Speicher. Für die heutigen CPUs wäre das viel zu langsam.
* Diese CPU orientiert sich hinsichtlich ihrer Arbeitsweise stark an den x86-Prozessor der PCs.
* Deshalb besitzt sie einen zusätzlichen Registersatz, der den Zugriff auf Befehle und Daten ohne Wartezyklen ermöglicht.
** Es handelt sich um Mehrzweckregister für Befehle und Daten.
** Das Adresswerk ist für die Berechnung der effektiven Adresse zuständig.
** Zusätzlich entkoppelt der L1-Cache den Prozessorkern vom langsamen externen Speicher.
[[Datei:Bild 002.png|mini]]
'''Bild 2'''
'''Beispiel-Prozessor:''' Die erweiterte CPU hat schon alles, was einen einfachen Mikroprozessor ausmacht.
===Grundsätzliche Programmablauf im Prozessor ===
==== Holphase (Fetch) ====
Zunächst muss ein Befehl aus dem Speicher geladen werden. Wenn sich die gesuchte Information noch nicht im L1-Cache befindet, muss die Busschnittstelle dafür den Speicher ansprechen.
==== Dekodierphase (Decode) ====
Das Steuerwerk untersucht den Befehl hinsichtlich der vorzunehmenden Arbeitsschritte. Es entscheidet, welche Operation (Addition, Subtraktion, logische Verknüpfung und so weiter) die ALU auszuführen hat.
==== Ausführungsphase (Execute) ====
Die ALU wird vom Steuerwerk nun angewiesen, die gewünschte Operation mit den geladenen Daten auszuführen
==== Schreibphase (Write Back) ====
Das Ergebnis der Operation landet in einem der Register oder im Speicher. Um langwierige Zugriffe auf das externe RAM zu vermeiden, sammelt die CPU die Daten eventuell im L1-Cache, damit sie später in einem schnellen Blockschreibvorgang übertragen werden können.
==Steuereinheit (CU)==
* Die CU ist die Kommandozentrale der CPU.
* Sie steuert alle Abläufe im Inneren des Prozessors sowie seine Kommunikation nach außen.
* Die CU holt sich einen Befehl aus dem Arbeitsspeicher/Cache und speichert ihn in einem Register zwischen.
* Damit ist der CPU-Bus frei für weitere Aktionen.
* Im Befehlsdecoder untersucht die CU die einzelnen Bit des Kommandos dann genauer.
** Aus einem Teil der Information ergibt sich der weitere logische und zeitliche Ablauf bei der Befehlsausführung.
** Handelt es sich um einen fest implementierten Befehl, werden sofort die entsprechenden Schritte in der Ablaufsteuerung eingeleitet.
** Sind alle zur Steuerung notwendigen Informationen gesammelt, beginnt die Ablaufsteuerung damit, das System zu koordinieren.
** Dazu gehört auch die Steuerung der BIU, um die Operanden für die Rechenbefehle in die Register zu laden.
[[Datei:Bild 003.png|mini]]
'''Bild 3'''
'''Control Unit:''' Die CU steuert alle Abläufe im Innern des Prozessors sowie seine Kommunikation nach außen.
==Rechenwerk (ALU)==
* Die ALU ist in der CPU für die Rechenarbeit zuständig.
* Alle aktuellen PC-Prozessoren besitzen neben einem oder mehreren dieser Rechenwerke für Ganzzahlen auch solche für Fließkommaarithmetik.
* Das Bild zeigt den Datenweg unserer Beispiel-CPU.
* Die CU steuert die ALU, die auf Anweisung die beiden Operanden aus dem Registersatz holt, mit denen sie rechnen soll.
** Sie werden zunächst in den beiden Hilfsregistern zwischengepuffert, damit sie während der gesamten Rechenoperation stabil anliegen.
** Im nächsten Schritt führt die ALU die von der CU geforderte Rechenoperation aus.
** Das Resultat wird schließlich im Ergebnisregister zwischengepuffert, damit sich die ALU sofort der nächsten Aufgabe zuwenden kann.
[[Datei:Bild 004.png|mini]]
'''Bild 4'''
'''Arithmetical and Logical Unit:''' Die ALU und ihr Datenweg. Die Hilfsregister für die Operanden und Ergebnisse gehören zu diesem Funktionsblock.
==Adresseinheit (AU) & Busschnittstelle (BIU)==
* Der Aufbau der AU mit einem zentralen Addierer in Bild 5 ähnelt dem der ALU.
* Tatsächlich wurde die Adressberechnung bei den ersten Prozessoren auch noch in dieser erledigt.
* Die spezialisierte AU erledigt das jedoch schneller und vor allem parallel zur ALU.
* Der Decoder ist im einfachsten Fall als Linksschieberegister realisiert.
* Dieser Barrel Shifter[[https://de.wikipedia.org/wiki/Barrel-Shifter]] extrahiert die Adressinformation aus dem Befehl durch Verschieben des Befehlscodes um n Bit in nur einem Taktzyklus.
* Die extrahierte Grundadresse gelangt dann in Hilfsregister A, wo Sie stabil anliegt bis der Addierer seine Arbeit beendet hat.
** Hilfsregister B beinhaltet den Inhalt des Programmzählers oder den des BIU-Adresspuffers.
** Die komplexere MMU (Memory management unit) realer PC-Prozessoren kann darüber hinaus virtuelle Adressen verwalten.
** Das Betriebssystem lagert hierbei den Speicher blockweise auf die Festplatte aus.
** Greift die CPU auf den ausgelagerten Speicher zu, verursacht das einen Seitenfehler, der die MMU (Memory management unit) zum Handeln veranlasst.
** Das Betriebssystem blendet dann den gewünschten Speicherbereich in das RAM des PCs ein und lagert einen gerade nicht benötigten dafür aus.
** Den virtuellen Speicher kann die CPU dank MMU (Memory management unit) so ansprechen, als wäre er real existierendes RAM.
[[Datei:Bild 005.png|mini]]
'''Bild 5'''
'''Address Unit:''' Die AU sorgt für die Berechnung der Adresse. In modernen CPUs verseht eine leistungsfähigere MMU (Memory management unit) diesen Dienst.
==Busschnittstelle (BIU)==
* Die Busschnittstelle verbindet die internen Busse des Prozessors mit der Außenwelt.
* Sie enthält Puffer zur Zwischenspeicherung von Adressen, Daten und Steuersignalen.
* Die CPU arbeitet intern mit einer möglichst niedrigen Spannung, damit die Erwärmung bei hohen Taktfrequenzen in erträglichen Grenzen bleibt.
* Die BIU sorgt deshalb auch für eine Pegelanpassung zwischen dem CPU-Kern und dem externen Bussystem.
==Cache-Grundlagen==
* Cache sitzt in der CPU zwischen den extrem schnellen Funktionseinheiten und dem langsamen Arbeitsspeicher der L1-Cache.
* Aus Platzgründen kann der L1-Cache in der CPU nicht besonders groß sein.
* Er bewegt sich in der Regel in Größenordnungen von 16 bis 64 KByte.
* Die Kunst besteht also darin, den schnellen kleinen Speicher so mit dem langsamen großen Arbeitsspeicher zu kombinieren, dass sich eine möglichst schnelle Gesamtlösung ergibt.
* Bild 6 zeigt die Auswertung einer 32-Bit-Adresse nach diesem Prinzip.
[[Datei:Bild 006.png|mini]]
'''Bild 6'''
'''Cache Interna:''' Der prinzipielle Aufbau eines Caches (oben) sowie die Adressauswertung im Cache-Controller (unten).
=== Briefträger bei der Arbeit ===
* Er trägt in einer Stadt (Arbeitsspeicher) die Post (Daten) aus.
* Dafür sortiert er die Post in seiner Tasche nach Straßen (Tag).
* In einer Straße holt er sich die hierfür bestimmte Post heraus und verteilt sie an die Häuser (Set-Zeile).
* Um in Mehrfamilienhäusern auch den richtigen Briefkasten zu erwischen, benötigt er noch den Familiennamen (Byte-Nummer).
==Cache-Organisation==
* Der direkt abgebildete (direct mapped) Cache im Bild unten ist die einfachste Form.
* Jedem Set ist nur ein Cache-Eintrag zugeordnet.
* Dadurch deckt man im Arbeitsspeicher einen Block von x+n Sets ab.
[[Datei:DiagrammHardwareCPU10.png|mini]]
'''Bild 7'''
'''Assoziativspeicher:''' Der teilassoziative Mehrweg-Cache beinhaltet im Prinzip mehrere Direct Mapped Caches plus Statistik-Bit (LRU).
=== Der Briefträger hat dieses Problem ebenfalls ===
* Wenn er einen Abstecher in eine Seitenstraße macht, muss er den nach Straßen vorsortierten Briefstapel zurücklegen und den für die Seitenstraße herausholen.
* Die Lösung des Problems sind teilassoziative Mehrweg-Caches.
* Auch dieser Cache-Typ speichert nur einen Teil der Adresse im Tag ab.
* Taucht ein Tag aber nochmals auf, erfolgt kein Komplettaustausch des Speicherblocks.
** Die Hardware merkt sich den Eintrag wieder in der gleichen Set-Zeile.
** Allerdings erfolgt die Speicherung in einer weiteren Ebene (Weg), sodass die erste Zeile nicht überschrieben werden muss.
** Die Ebenen- oder Wegauswahl erfolgt über den Set-Adressteil.
=== Mit einer Mehrwegsortierung arbeitet auch der Briefträger schneller ===
* Er hat sich die Post nicht nur in Straßenzüge (Tag) unterteilt, sondern nochmals mit einem Gummiband hinsichtlich der Straßenseite gebündelt (Set-Weg).
* Bei einem Abstecher in die Seitenstrasse greift er sich nur das Briefbündel für eine Straßenseite.
* Dafür legt er nur eines der zwei Bündel der alten Straße weg - und zwar das von der anderen Straßenseite.
* Wenn er aus der Seitenstrasse zurückkommt, hat er immer noch das Bündel der Seite in der Hand, bei der er abgebogen ist.
* Ein Mehrweg-Cache ist ein vervielfachter Direct Mapped Cache.
** Der Schaltungsaufwand für einen teilassoziativen 2-Wege-Cache ist demnach doppelt so hoch wie bei der einfachen Version.
** Bei einem 4-Wege-Cache vervierfacht er sich.
** Irgendwann sind jedoch auch die Ebenen eines Mehrweg-Caches voll.
** Mittels zusätzlich gespeicherter LRU-Bit kann der Cache dann feststellen, welcher Eintrag in welcher Ebene am längsten nicht mehr benutzt wurde.
** Dieser Wegeintrag wird dann überschrieben.
==Pipeline-Verfahren==
* Bis jetzt sind wir davon ausgegangen, dass die CPU die Befehle nach dem klassischen Von-Neumann-Prinzip nacheinander verarbeitet.
* Jeder Befehl wird innerhalb einer bestimmten Zeit (Taktzyklus) erledigt, dann ist der Nächste dran.
* Wenn man der BIU erlaubt, schon Befehle aus dem Speicher zu holen während die CU gerade einen analysiert, hat man zwei Arbeitsschritte parallelisiert.
* Es sind also zwei Befehle gleichzeitig in Teilbearbeitung. Überträgt man das Prinzip auf alle beteiligten Funktionseinheiten, erhöht sich die Zahl der Teilbearbeitungen weiter.
* Dieses Pipeline-Prinzip verarbeitet aber die eingehenden Befehle und Daten immer noch Schritt für Schritt.
[[Datei:DiagrammHardwareCPU11.png|mini]]
'''Bild 8'''
'''Pipeline in Funktion:''' Mit der Pipelining-Technik lässt sich die Befehlsausführung beschleunigen.
==Superskalare Architektur==
* Wenn schon eine Pipeline die Geschwindigkeit erhöht, geht es mit Zweien noch schneller.
* In Bild 9 "Parallel ist schneller" ist im oberen Teil ein solcher Ansatz zu sehen.
* Auf diese Weise arbeitet beispielsweise der Intel Pentium.
* Um unnötige Probleme mit Abhängigkeiten zwischen den Befehlen zu minimieren, arbeitet die Intel-CPU allerdings nur bei Kommandos gleichzeitig mit beiden Pipelines, die gut zueinander passen.
[[Datei:Diagram009.jpg|mini]]
'''Bild 9'''
'''Parallel ist schneller:''' Superskalare Architekturen mit einer doppelten Pipeline oben und parallel arbeitenden Ausführungseinheiten unten.
==Sprungvorhersage==
* Die Abhängigkeiten der Befehle untereinander sowie Sprungbefehle machen den Pipelines und superskalaren Architekturen zu schaffen.
* Je mehr parallel vorweggreifend erledigt wird, desto mehr Arbeit ist beispielsweise bei einem Sprungbefehl in ein anderes Programmsegment nachzuholen.
* Die ALUs müssen dann warten, bis sich die neuen Befehle durch die lange Pipeline gequält haben.
==Dynamische Sprungvorhersage==
Die Sprungvorhersage kann auf einfachen Regeln basieren:
* Beispielsweise ist es bei einem Sprungbefehl gegen den Befehlsstrom sehr wahrscheinlich, dass er mehrheitlich tatsächlich ausgeführt wird.
* Diese Annahme basiert auf der Feststellung, dass Rückwärtssprünge im Programmcode oft am Ende von Schleifen stehen.
* Und Programmschleifen werden in der Regel mehr als nur einmal durchlaufen.
* Bei Vorwärtssprüngen ist eine derart einfache Vorhersage kaum noch zu treffen.
* Hier kann man nur von der statistischen Erkenntnis ausgehen, dass die meisten bedingten Vorwärtssprünge nicht ausgeführt werden.


==Links==
==Links==

Version vom 12. Februar 2024, 16:38 Uhr