Prozessor in parallelen Systemen
In den 80er Jahren war ein Spezialprozessor beliebt, um Multicomputer anzurufen Transputer. Ein Transputer bestand aus einem Kernprozessor, einem kleinen SRAM-Speicher, einer DRAM-Hauptspeicherschnittstelle und vier Kommunikationskanälen, alle auf einem einzigen Chip. Um eine parallele Computerkommunikation herzustellen, wurden Kanäle verbunden, um ein Netzwerk von Transputern zu bilden. Es mangelt jedoch an Rechenleistung und konnte daher die steigende Nachfrage nach parallelen Anwendungen nicht befriedigen. Dieses Problem wurde durch die Entwicklung von RISC-Prozessoren gelöst und war auch billig.
Moderne Parallelcomputer verwenden Mikroprozessoren, die Parallelität auf mehreren Ebenen wie Parallelität auf Befehlsebene und Parallelität auf Datenebene verwenden.
Hochleistungsprozessoren
RISC- und RISCy-Prozessoren dominieren den heutigen Markt für Parallelcomputer.
Merkmale des traditionellen RISC sind -
- Hat nur wenige Adressierungsmodi.
- Hat ein festes Format für Anweisungen, normalerweise 32 oder 64 Bit.
- Verfügt über dedizierte Anweisungen zum Laden / Speichern, um Daten aus dem Speicher in das Register zu laden und Daten aus dem Register in den Speicher zu speichern.
- Arithmetische Operationen werden immer an Registern ausgeführt.
- Verwendet Pipelining.
Die meisten Mikroprozessoren sind heutzutage superskalar, dh in einem Parallelcomputer werden mehrere Anweisungspipelines verwendet. Daher können superskalare Prozessoren mehr als einen Befehl gleichzeitig ausführen. Die Wirksamkeit von superskalaren Prozessoren hängt von der in den Anwendungen verfügbaren Parallelität auf Befehlsebene (ILP) ab. Um die Pipelines gefüllt zu halten, werden die Anweisungen auf Hardwareebene in einer anderen Reihenfolge als der Programmreihenfolge ausgeführt.
Viele moderne Mikroprozessoren verwenden den Super-Pipelining- Ansatz. Beim Super-Pipelining wird zur Erhöhung der Taktfrequenz die in einer Pipeline-Stufe geleistete Arbeit reduziert und die Anzahl der Pipeline-Stufen erhöht.
VLIW-Prozessoren (Very Large Instruction Word)
Diese werden aus der horizontalen Mikroprogrammierung und der superskalaren Verarbeitung abgeleitet. Anweisungen in VLIW-Prozessoren sind sehr umfangreich. Die Operationen innerhalb eines einzelnen Befehls werden parallel ausgeführt und zur Ausführung an die entsprechenden Funktionseinheiten weitergeleitet. Nach dem Abrufen eines VLIW-Befehls werden seine Operationen dekodiert. Anschließend werden die Operationen an die Funktionseinheiten gesendet, in denen sie parallel ausgeführt werden.
Vektorprozessoren
Vektorprozessoren sind Co-Prozessoren zu Allzweck-Mikroprozessoren. Vektorprozessoren sind im Allgemeinen Register-Register oder Speicher-Speicher. Ein Vektorbefehl wird abgerufen und decodiert, und dann wird eine bestimmte Operation für jedes Element der Operandenvektoren ausgeführt, während in einem normalen Prozessor eine Vektoroperation eine Schleifenstruktur im Code benötigt. Um es effizienter zu machen, verketten Vektorprozessoren mehrere Vektoroperationen miteinander, dh das Ergebnis einer Vektoroperation wird als Operand an eine andere weitergeleitet.
Caching
Caches sind ein wichtiges Element von Hochleistungs-Mikroprozessoren. Nach jeweils 18 Monaten wird die Geschwindigkeit von Mikroprozessoren doppelt so hoch, aber DRAM-Chips für den Hauptspeicher können mit dieser Geschwindigkeit nicht mithalten. Daher werden Caches eingeführt, um die Geschwindigkeitslücke zwischen Prozessor und Speicher zu schließen. Ein Cache ist ein schneller und kleiner SRAM-Speicher. In modernen Prozessoren wie TLBs (Translation Look-Side Buffers), Anweisungs- und Datencaches usw. werden viel mehr Caches angewendet.
Direkt zugeordneter Cache
In direkt zugeordneten Caches wird eine Modulo-Funktion für die Eins-zu-Eins-Zuordnung von Adressen im Hauptspeicher zu Cache-Speicherorten verwendet. Da demselben Cache-Eintrag mehrere Hauptspeicherblöcke zugeordnet sein können, muss der Prozessor bestimmen können, ob ein Datenblock im Cache der tatsächlich benötigte Datenblock ist. Diese Identifizierung erfolgt durch Speichern eines Tags zusammen mit einem Cache-Block.
Voll assoziativer Cache
Eine vollständig assoziative Zuordnung ermöglicht das Platzieren eines Cache-Blocks an einer beliebigen Stelle im Cache. Durch die Verwendung einer Ersetzungsrichtlinie bestimmt der Cache einen Cache-Eintrag, in dem er einen Cache-Block speichert. Vollassoziative Caches verfügen über eine flexible Zuordnung, die die Anzahl der Cache-Eintragskonflikte minimiert. Da eine vollständig assoziative Implementierung teuer ist, werden diese niemals in großem Maßstab verwendet.
Set-assoziativer Cache
Eine satzassoziative Zuordnung ist eine Kombination aus einer direkten Zuordnung und einer vollständig assoziativen Zuordnung. In diesem Fall werden die Cache-Einträge in Cache-Sätze unterteilt. Wie bei der direkten Zuordnung gibt es eine feste Zuordnung von Speicherblöcken zu einem Satz im Cache. Innerhalb eines Cache-Sets wird ein Speicherblock jedoch vollständig assoziativ zugeordnet.
Cache-Strategien
Neben dem Mapping-Mechanismus benötigen Caches auch eine Reihe von Strategien, die festlegen, was bei bestimmten Ereignissen geschehen soll. Bei (set-) assoziativen Caches muss der Cache bestimmen, welcher Cache-Block durch einen neuen Block ersetzt werden soll, der in den Cache eintritt.
Einige bekannte Ersatzstrategien sind -
- First-In First Out (FIFO)
- Am wenigsten verwendet (LRU)