Zentrale Verarbeitungseinheit
Blockdiagramm eines grundlegenden Uniprozessor-CPU-Computers. Schwarze Linien zeigen den Datenfluss an, während rote Linien den Kontrollfluss anzeigen; Pfeile zeigen Flussrichtungen an.
fest Verdrahtete in eine CPU“s Schaltung ist eine Reihe von grundlegenden Operationen, die Sie ausführen können, bezeichnet eine Anleitung. Solche Operationen können beispielsweise das Addieren oder Subtrahieren von zwei Zahlen, das Vergleichen von zwei Zahlen oder das Springen zu einem anderen Teil eines Programms umfassen., Jede grundlegende Operation wird durch eine bestimmte Kombination von Bits dargestellt, die als Maschinensprache Opcode bekannt ist; Während der Ausführung von Anweisungen in einem Maschinensprachenprogramm entscheidet die CPU, welche Operation durch „Decodieren“ des Opcodes ausgeführt werden soll. Eine vollständige Maschinensprachenanweisung besteht aus einem Opcode und in vielen Fällen zusätzlichen Bits, die Argumente für die Operation angeben (z. B. die Zahlen, die im Falle einer Additionsoperation summiert werden sollen). Ein Maschinensprachenprogramm, das die Komplexitätsskala erhöht, ist eine Sammlung von Maschinensprachenanweisungen, die die CPU ausführt.,
Die tatsächliche mathematische Operation für jeden Befehl wird von einer Kombinationslogikschaltung innerhalb des Prozessors der CPU ausgeführt, die als arithmetische Logikeinheit oder ALU bekannt ist. Im Allgemeinen führt eine CPU eine Anweisung aus, indem Sie sie aus dem Speicher abruft, ihre ALU verwendet, um eine Operation auszuführen, und dann das Ergebnis im Speicher speichert., Neben den Anweisungen für Integer-Mathematik und Logikoperationen gibt es verschiedene andere Maschinenanweisungen, wie zum Beispiel die zum Laden von Daten aus dem Speicher und Speichern sie zurück, Verzweigungsoperationen und mathematische Operationen auf Gleitkommazahlen von der CPU Gleitkommaeinheit durchgeführt (FPU).
Control unitEdit
Die Control Unit (CU) ist eine Komponente der CPU, die den Betrieb des Prozessors steuert., Es teilt dem Speicher des Computers, Arithmetik – und Logikeinheit und Eingabe-und Ausgabegeräte, wie auf die Anweisungen zu reagieren, die an den Prozessor gesendet wurden.
Es steuert den Betrieb der anderen Einheiten durch Bereitstellung von Timing-und Steuersignalen. Die meisten Computerressourcen werden von der CU verwaltet. Es leitet den Datenfluss zwischen der CPU und den anderen Geräten. John von Neumann schloss die Steuereinheit als Teil der von Neumann-Architektur ein., Bei modernen Computerdesigns ist die Steuereinheit typischerweise ein interner Teil der CPU, wobei ihre allgemeine Rolle und ihr Betrieb seit ihrer Einführung unverändert sind.
Arithmetic logic unitEdit
Symbolische Darstellung einer ALU und ihrer Eingangs-und Ausgangssignale
Die Arithmetic logic Unit (ALU) ist eine digitale Schaltung innerhalb des Prozessors, die ganzzahlige arithmetische und bitweise logische Operationen ausführt., Die Eingaben an die ALU sind die zu bedienenden Datenwörter (sogenannte Operanden), Statusinformationen aus früheren Operationen und ein Code von der Steuereinheit, der angibt, welche Operation ausgeführt werden soll. Abhängig von der auszuführenden Anweisung können die Operanden aus internen CPU-Registern oder externem Speicher stammen oder Konstanten sein, die von der ALU selbst generiert werden.
Wenn sich alle Eingangssignale durch die ALU-Schaltung gelegt und verbreitet haben, erscheint das Ergebnis der durchgeführten Operation an den Ausgängen der ALU., Das Ergebnis besteht sowohl aus einem Datenwort, das in einem Register oder Speicher gespeichert werden kann, als auch aus Statusinformationen, die typischerweise in einem speziellen, für diesen Zweck reservierten internen CPU-Register gespeichert sind.
Address Generation unitEdit
Address Generation Unit (AGU), manchmal auch als Address Computation Unit (ACU) bezeichnet, ist eine Ausführungseinheit innerhalb der CPU, die Adressen berechnet, die von der CPU für den Zugriff auf den Hauptspeicher verwendet werden., Durch die Behandlung von Adressberechnungen durch separate Schaltungen, die parallel zum Rest der CPU arbeiten, kann die Anzahl der CPU-Zyklen, die zum Ausführen verschiedener Maschinenanweisungen erforderlich sind, reduziert werden, was zu Leistungsverbesserungen führt.
Während der Ausführung verschiedener Operationen müssen CPUs Speicheradressen berechnen, die zum Abrufen von Daten aus dem Speicher erforderlich sind; Beispielsweise müssen speicherinterne Positionen von Array-Elementen berechnet werden, bevor die CPU die Daten von tatsächlichen Speicherorten abrufen kann., Diese Adressgenerierungsberechnungen beinhalten verschiedene ganzzahlige arithmetische Operationen, wie Addition, Subtraktion, Modulo-Operationen oder Bitverschiebungen. Die Berechnung einer Speicheradresse umfasst häufig mehr als eine allgemeine Maschinenanweisung, die nicht unbedingt schnell dekodiert und ausgeführt werden muss. Durch die Integration einer AGU in ein CPU-Design können zusammen mit der Einführung spezieller Anweisungen, die die AGU verwenden, verschiedene Berechnungen zur Adressgenerierung vom Rest der CPU ausgeladen und häufig schnell in einem einzigen CPU-Zyklus ausgeführt werden.,
Die Fähigkeiten einer AGU hängen von einer bestimmten CPU und ihrer Architektur ab. Daher implementieren und stellen einige AGUs mehr Adressberechnungsoperationen bereit, während einige auch fortgeschrittenere spezialisierte Anweisungen enthalten, die gleichzeitig mit mehreren Operanden arbeiten können. Darüber hinaus enthalten einige CPU-Architekturen mehrere AGUs, sodass mehr als eine Adressberechnungsoperation gleichzeitig ausgeführt werden kann, wodurch weitere Leistungsverbesserungen erzielt werden, indem der superskalare Charakter fortschrittlicher CPU-Designs genutzt wird., Beispielsweise integriert Intel mehrere AGUs in seine Sandy Bridge-und Haswell-Mikroarchitekturen, die die Bandbreite des CPU-Speichersubsystems erhöhen, indem mehrere Speicherzugriffsanweisungen parallel ausgeführt werden können.
Speicherverwaltungseinheit (MMU)Bearbeiten
Die meisten High-End-Mikroprozessoren (in Desktop -, Laptop -, Servercomputern) verfügen über eine Speicherverwaltungseinheit, die logische Adressen in physische RAM-Adressen übersetzt und Speicherschutz-und Paging-Funktionen bietet, die für den virtuellen Speicher nützlich sind., Einfachere Prozessoren, insbesondere Mikrocontroller, enthalten normalerweise keine MMU.
CacheEdit
Ein CPU-Cache ist ein Hardware-Cache, der von der Zentraleinheit (CPU) eines Computers verwendet wird, um die durchschnittlichen Kosten (Zeit oder Energie) für den Zugriff auf Daten aus dem Hauptspeicher zu reduzieren. Ein Cache ist ein kleinerer, schnellerer Speicher, näher an einem Prozessorkern, der Kopien der Daten von häufig verwendeten Hauptspeicherorten speichert. Die meisten CPUs verfügen über verschiedene unabhängige Caches, einschließlich Befehls-und Datencaches, bei denen der Datencache normalerweise als Hierarchie mit mehreren Cache-Ebenen (L1, L2, L3, L4 usw.) organisiert ist.,).
Alle modernen (schnellen) CPUs (mit wenigen spezialisierten Ausnahmen) haben mehrere Ebenen von CPU-Caches. Die ersten CPUs, die einen Cache verwendeten, hatten nur eine Cache-Ebene; Im Gegensatz zu späteren Level-1-Caches wurde sie nicht in L1d (für Daten) und L1i (für Anweisungen) aufgeteilt. Fast alle aktuellen CPUs mit Caches haben einen geteilten L1-Cache. Sie haben auch L2-Caches und für größere Prozessoren auch L3-Caches. Der L2-Cache wird normalerweise nicht aufgeteilt und fungiert als gemeinsames Repository für den bereits geteilten L1-Cache. Jeder Kern eines Multi-Core-Prozessors verfügt über einen dedizierten L2-Cache und wird normalerweise nicht zwischen den Kernen geteilt., Der L3-Cache und Caches höherer Ebene werden zwischen den Kernen gemeinsam genutzt und nicht aufgeteilt. Ein L4-Cache ist derzeit ungewöhnlich und befindet sich im Allgemeinen auf dynamischem Random-Access-Speicher (DRAM) und nicht auf statischem Random-Access-Speicher (SRAM) auf einem separaten Chip. Das war historisch auch bei L1 der Fall, während größere Chips die Integration und im Allgemeinen alle Cache-Ebenen mit der möglichen Ausnahme der letzten Ebene ermöglicht haben. Jede zusätzliche Cache-Ebene ist tendenziell größer und wird anders optimiert.,
Es gibt andere Arten von Caches (die nicht zur „Cache-Größe“ der oben genannten wichtigsten Caches gezählt werden), z. B. den Translation Lookaside Buffer (TLB), der Teil der Speicherverwaltungseinheit (MMU) ist, die die meisten CPUs haben.
Caches sind in der Regel in Potenzen von zwei Größen: 4, 8,16 usw. KiB oder MiB (für größere Nicht-L1-Größen), obwohl der IBM z13 über einen 96 KiB L1-Befehls-Cache verfügt.
Clock rateEdit
Die meisten CPUs sind synchrone Schaltungen, was bedeutet, dass sie ein Taktsignal verwenden, um ihre sequentiellen Operationen zu beschleunigen., Das Taktsignal wird von einer externen Oszillatorschaltung erzeugt, die jede Sekunde eine konsistente Anzahl von Impulsen in Form einer periodischen Rechteckwelle erzeugt. Die Frequenz der Taktimpulse bestimmt die Geschwindigkeit, mit der eine CPU Anweisungen ausführt, und je schneller die Uhr ist, desto mehr Anweisungen führt die CPU jede Sekunde aus.
Um einen ordnungsgemäßen Betrieb der CPU sicherzustellen, ist die Taktperiode länger als die maximale Zeit, die für die Ausbreitung (Bewegung) aller Signale durch die CPU benötigt wird., Bei der Einstellung der Taktperiode auf einen Wert, der weit über der Worst-Case-Ausbreitungsverzögerung liegt, ist es möglich, die gesamte CPU und die Art und Weise, wie sie Daten um die „Kanten“ des steigenden und fallenden Taktsignals bewegt, zu entwerfen. Dies hat den Vorteil, dass die CPU sowohl aus Design-als auch aus Komponentenzahl-Sicht erheblich vereinfacht wird. Es hat jedoch auch den Nachteil, dass die gesamte CPU auf ihre langsamsten Elemente warten muss, obwohl einige Teile davon viel schneller sind. Diese Einschränkung wurde weitgehend durch verschiedene Methoden zur Erhöhung der CPU-Parallelität kompensiert (siehe unten).,
Architektonische Verbesserungen allein lösen jedoch nicht alle Nachteile global synchroner CPUs. Beispielsweise unterliegt ein Taktsignal den Verzögerungen eines anderen elektrischen Signals. Höhere Taktraten in immer komplexeren CPUs erschweren es, das Taktsignal über die gesamte Einheit in Phase (synchronisiert) zu halten. Dies hat dazu geführt, dass viele moderne CPUs mehrere identische Taktsignale bereitstellen müssen, um zu vermeiden, dass ein einzelnes Signal erheblich genug verzögert wird, um eine Fehlfunktion der CPU zu verursachen., Ein weiteres großes Problem, da die Taktraten dramatisch ansteigen, ist die Wärmemenge, die von der CPU abgeführt wird. Die sich ständig ändernde Uhr bewirkt, dass viele Komponenten unabhängig davon, ob sie zu diesem Zeitpunkt verwendet werden, wechseln. Im Allgemeinen verbraucht eine Komponente, die schaltet, mehr Energie als ein Element in einem statischen Zustand. Daher, wie Taktrate erhöht, so auch Energieverbrauch, wodurch die CPU mehr Wärmeableitung in Form von CPU-Kühllösungen erfordern.,
Eine Methode zum Umschalten nicht benötigter Komponenten wird als Clock Gating bezeichnet, bei der das Taktsignal auf nicht benötigte Komponenten ausgeschaltet (effektiv deaktiviert) wird. Dies wird jedoch oft als schwierig zu implementieren angesehen und sieht daher außerhalb sehr stromsparender Designs keinen gemeinsamen Einsatz. Ein bemerkenswertes neueres CPU-Design, das umfangreiche Taktraten verwendet, ist das IBM PowerPC-basierte Xenon, das in der Xbox 360 verwendet wird; Auf diese Weise wird der Strombedarf der Xbox 360 stark reduziert., Eine andere Methode, um einige der Probleme mit einem globalen Taktsignal anzugehen, ist das Entfernen des Taktsignals insgesamt. Während das Entfernen des globalen Taktsignals den Konstruktionsprozess in vielerlei Hinsicht erheblich komplexer macht, bieten asynchrone (oder taktlose) Konstruktionen im Vergleich zu ähnlichen synchronen Konstruktionen deutliche Vorteile in Bezug auf Stromverbrauch und Wärmeableitung. Obwohl etwas ungewöhnlich, wurden ganze asynchrone CPUs ohne Verwendung eines globalen Taktsignals erstellt. Zwei bemerkenswerte Beispiele dafür sind das ARM-kompatible AMULETT und die MIPS R3000-kompatiblen MiniMIPS.,
Anstatt das Taktsignal vollständig zu entfernen, ermöglichen einige CPU-Designs, dass bestimmte Teile des Geräts asynchron sind, z. B. die Verwendung asynchroner ALUs in Verbindung mit Superscalar-Pipelining, um einige arithmetische Leistungssteigerungen zu erzielen. Es ist zwar nicht ganz klar, ob vollständig asynchrone Designs auf einem vergleichbaren oder besseren Niveau als ihre synchronen Gegenstücke funktionieren können, es ist jedoch offensichtlich, dass sie sich zumindest in einfacheren mathematischen Operationen auszeichnen., Dies, kombiniert mit ihrem ausgezeichneten Stromverbrauch und Wärmeableitungseigenschaften, macht sie sehr geeignet für Embedded-Computer.
Spannungsreglermodul moduleEdit
Viele moderne CPUs verfügen über ein die-integriertes Leistungsmanagementmodul, das die Bedarfsspannungsversorgung der CPU-Schaltung regelt und so das Gleichgewicht zwischen Leistung und Stromverbrauch hält.
Integer rangeEdit
Jede CPU repräsentiert numerische Werte auf eine bestimmte Weise., Zum Beispiel stellten einige frühe digitale Computer Zahlen als vertraute dezimale (Basis 10) Zahlensystemwerte dar, und andere haben ungewöhnlichere Darstellungen wie ternäre (Basis drei) verwendet. Fast alle modernen CPUs stellen Zahlen in binärer Form dar, wobei jede Ziffer durch eine zweiwertige physikalische Größe wie eine „hohe“ oder „niedrige“ Spannung dargestellt wird.
Ein Sechs-Bit-Wort, das die binär codierte Darstellung des Dezimalwerts 40 enthält. Die meisten modernen CPUs verwenden Wortgrößen, die eine Potenz von zwei sind, zum Beispiel 8, 16, 32 oder 64 Bit.,
In Bezug auf numerische Darstellung ist die Größe und Genauigkeit von ganzzahligen Zahlen, die eine CPU darstellen kann. Im Falle einer binären CPU wird dies an der Anzahl der Bits (signifikanten Ziffern einer binär codierten Ganzzahl) gemessen, die die CPU in einem Vorgang verarbeiten kann, der üblicherweise als Wortgröße, Bitbreite, Datenpfadbreite, ganzzahlige Genauigkeit oder ganzzahlige Größe bezeichnet wird. Die ganzzahlige Größe einer CPU bestimmt den Bereich der ganzzahligen Werte, mit denen sie direkt arbeiten kann., Beispielsweise kann eine 8-Bit-CPU Ganzzahlen, die durch acht Bits dargestellt werden, die einen Bereich von 256 (28) diskreten ganzzahligen Werten haben, direkt bearbeiten.
Der ganzzahlige Bereich kann sich auch auf die Anzahl der Speicherorte auswirken, die die CPU direkt adressieren kann (eine Adresse ist ein ganzzahliger Wert, der einen bestimmten Speicherort darstellt). Wenn beispielsweise eine binäre CPU 32 Bit verwendet, um eine Speicheradresse darzustellen, kann sie 232 Speicherorte direkt adressieren. Um diese Einschränkung und aus verschiedenen anderen Gründen zu umgehen, verwenden einige CPUs Mechanismen (z. B. Bankumschaltung), mit denen zusätzlicher Speicher adressiert werden kann.,
CPUs mit größeren Wortgrößen benötigen mehr Schaltungen und sind folglich physikalisch größer, kosten mehr und verbrauchen mehr Strom (und erzeugen daher mehr Wärme). Infolgedessen werden in modernen Anwendungen häufig kleinere 4 – oder 8-Bit-Mikrocontroller verwendet, obwohl CPUs mit viel größeren Wortgrößen (wie 16, 32, 64, sogar 128-Bit) verfügbar sind. Wenn jedoch eine höhere Leistung erforderlich ist, können die Vorteile einer größeren Wortgröße (größere Datenbereiche und Adressräume) die Nachteile überwiegen. Eine CPU kann interne Datenpfade haben, die kürzer als die Wortgröße sind, um Größe und Kosten zu reduzieren., Obwohl beispielsweise der IBM System/360-Befehlssatz ein 32-Bit-Befehlssatz war, hatten das System/360-Modell 30 und das Modell 40 8-Bit-Datenpfade in der logischen arithmetischen Einheit, so dass ein 32-Bit-Add vier Zyklen erforderte, einen für jedes 8 Bit der Operanden, und obwohl der Befehlssatz der Motorola 68000-Serie ein 32-Bit-Befehlssatz war, hatten das Motorola 68000 und das Motorola 68010 16-Bit-Datenpfade in der logischen arithmetischen Einheit, so dass ein 32-Bit-Add zwei Zyklen erforderte.,
Um einige der Vorteile zu erzielen, die sowohl niedrigere als auch höhere Bitlängen bieten, haben viele Befehlssätze unterschiedliche Bitbreiten für ganzzahlige und Gleitkomma-Daten, sodass CPUs, die diesen Befehlssatz implementieren, unterschiedliche Bitbreiten für verschiedene Teile des Geräts haben können. Beispielsweise war der IBM System/360-Befehlssatz in erster Linie 32-Bit, unterstützte jedoch 64-Bit-Gleitkommawerte, um eine größere Genauigkeit und Reichweite bei Gleitkommazahlen zu ermöglichen., Das System / 360-Modell 65 hatte einen 8-Bit-Addierer für Dezimal-und Festkomma-Binärarithmetik und einen 60-Bit-Addierer für Gleitkomma-Arithmetik. Viele spätere CPU-Designs verwenden eine ähnliche gemischte Bitbreite, insbesondere wenn der Prozessor für allgemeine Zwecke gedacht ist, bei denen ein angemessenes Gleichgewicht zwischen Ganzzahl-und Gleitkommafähigkeit erforderlich ist.,
ParallelismEdit
Modell einer Subscalar-CPU, in dem fünfzehn Taktzyklen benötigt werden, um drei Anweisungen auszuführen
Die Beschreibung des grundlegenden Betriebs einer CPU, die im vorherigen Abschnitt angeboten wird, beschreibt die einfachste Form, die eine CPU annehmen kann. Dieser Typ von CPU, der normalerweise als Subskalar bezeichnet wird, arbeitet und führt jeweils einen Befehl für ein oder zwei Datenstücke aus, dh weniger als einen Befehl pro Taktzyklus (IPC < 1).,
Dieser Prozess führt zu einer inhärenten Ineffizienz von subskalaren CPUs. Da jeweils nur eine Anweisung ausgeführt wird, muss die gesamte CPU warten, bis diese Anweisung abgeschlossen ist, bevor mit der nächsten Anweisung fortgefahren wird. Infolgedessen wird die subskalare CPU an Anweisungen „aufgehängt“, die mehr als einen Taktzyklus benötigen, um die Ausführung abzuschließen. Selbst das Hinzufügen einer zweiten Ausführungseinheit (siehe unten) verbessert die Leistung nicht wesentlich; Anstatt dass ein Pfad aufgehängt wird, werden jetzt zwei Wege aufgehängt und die Anzahl der nicht verwendeten Transistoren erhöht., Diese Konstruktion, bei der die Ausführungsressourcen der CPU jeweils nur mit einem Befehl arbeiten können, kann möglicherweise nur eine skalare Leistung erreichen (ein Befehl pro Taktzyklus, IPC = 1). Die Leistung ist jedoch fast immer subskalar (weniger als ein Befehl pro Taktzyklus, IPC < 1).
Versuche, skalare und bessere Leistung zu erzielen, haben zu einer Vielzahl von Entwurfsmethoden geführt, die dazu führen, dass sich die CPU weniger linear und mehr parallel verhält., Wenn man sich auf Parallelität in CPUs bezieht, werden im Allgemeinen zwei Begriffe verwendet, um diese Entwurfstechniken zu klassifizieren:
- Parallelität auf Befehlsebene (ILP), die versucht, die Geschwindigkeit zu erhöhen, mit der Anweisungen innerhalb einer CPU ausgeführt werden (dh um die Verwendung von Ausführungsressourcen auf dem CHIP zu erhöhen);
- Parallelität auf Aufgabenebene (TLP), um die Anzahl der Threads oder Prozesse zu erhöhen, die eine CPU gleichzeitig ausführen kann.,
Jede Methodik unterscheidet sich sowohl in der Art und Weise, in der sie implementiert werden, als auch die relative Wirksamkeit, die sie bei der Erhöhung der CPU-Leistung für eine Anwendung leisten.
Parallelität auf Befehlsebene
Grundlegende fünfstufige Pipeline. Im besten Fall kann diese Pipeline eine Abschlussrate von einem Befehl pro Taktzyklus aufrechterhalten.,
Eine der einfachsten Methoden, um eine erhöhte Parallelität zu erreichen, besteht darin, die ersten Schritte des Befehlsabrufs und-decodierens zu beginnen, bevor die vorherige Anweisung ausgeführt wird. Dies ist die einfachste Form einer Technik, die als Instruction Pipelining bekannt ist und in fast allen modernen Allzweck-CPUs verwendet wird. Pipelining ermöglicht die Ausführung von mehr als einer Anweisung zu einem bestimmten Zeitpunkt, indem der Ausführungsweg in diskrete Stufen unterteilt wird., Diese Trennung kann mit einer Montagelinie verglichen werden, bei der eine Anweisung in jeder Phase vollständiger gemacht wird, bis sie die Ausführungspipeline verlässt und zurückgezogen wird.
Pipelining bietet jedoch die Möglichkeit für eine Situation, in der das Ergebnis der vorherigen Operation benötigt wird, um die nächste Operation abzuschließen.eine Bedingung, die oft als Datenabhängigkeitskonflikt bezeichnet wird. Um dies zu bewältigen, muss zusätzlich darauf geachtet werden, diese Art von Bedingungen zu überprüfen und einen Teil der Befehlspipeline zu verzögern, wenn dies geschieht., Um dies zu erreichen, ist natürlich eine zusätzliche Schaltung erforderlich, sodass Pipeline-Prozessoren komplexer sind als subskalare (wenn auch nicht sehr signifikant). Ein Pipeline-Prozessor kann sehr skalar werden und nur durch Pipeline-Stände gehemmt werden (ein Befehl, der mehr als einen Taktzyklus in einer Stufe ausgibt).
einfache superskalar-pipeline. Durch das Abrufen und Versenden von jeweils zwei Anweisungen können maximal zwei Anweisungen pro Taktzyklus abgeschlossen werden.,
Eine weitere Verbesserung der Idee des Befehlspipelinings führte zur Entwicklung einer Methode, die die Leerlaufzeit von CPU-Komponenten noch weiter verkürzt. Designs, die als Superscalar bezeichnet werden, umfassen eine lange Befehlspipeline und mehrere identische Ausführungseinheiten, wie Lastspeichereinheiten, arithmetisch-logische Einheiten, Gleitkommaeinheiten und Adressgenerierungseinheiten. In einer superskalaren Pipeline werden mehrere Anweisungen gelesen und an einen Dispatcher übergeben, der entscheidet, ob die Anweisungen parallel (gleichzeitig) ausgeführt werden können oder nicht., Wenn ja, werden sie an verfügbare Ausführungseinheiten gesendet, was dazu führt, dass mehrere Anweisungen gleichzeitig ausgeführt werden können. Im Allgemeinen gilt: Je mehr Anweisungen eine Superscalar-CPU gleichzeitig an wartende Ausführungseinheiten senden kann, desto mehr Anweisungen werden in einem bestimmten Zyklus ausgeführt.
Die meisten Schwierigkeiten beim Design einer Superscalar CPU-Architektur liegen in der Erstellung eines effektiven Dispatchers., Der Dispatcher muss schnell und korrekt feststellen können, ob Anweisungen parallel ausgeführt werden können, und sie so versenden, dass möglichst viele Ausführungseinheiten ausgelastet sind. Dies erfordert, dass die Befehlspipeline so oft wie möglich gefüllt wird und dass in superskalaren Architekturen erhebliche Mengen an CPU-Cache erforderlich sind. Es macht auch gefahrenvermeidende Techniken wie Verzweigungsvorhersage, spekulative Ausführung, Umbenennung von Registern, Ausführung außerhalb der Reihenfolge und Transaktionsspeicher entscheidend für die Aufrechterhaltung eines hohen Leistungsniveaus., Durch den Versuch, vorherzusagen, welchen Zweig (oder Pfad) eine bedingte Anweisung benötigt, kann die CPU die Anzahl der Wartezeiten minimieren, die die gesamte Pipeline warten muss, bis eine bedingte Anweisung abgeschlossen ist. Spekulative Ausführung bietet häufig bescheidene Leistungssteigerungen, indem Teile von Code ausgeführt werden, die nach Abschluss einer bedingten Operation möglicherweise nicht benötigt werden. Out-of-Order-Ausführung ordnet die Reihenfolge, in der Anweisungen ausgeführt werden, etwas an, um Verzögerungen aufgrund von Datenabhängigkeiten zu reduzieren., Auch im Falle eines einzelnen Befehlstroms, mehrerer Datenströme—ein Fall, in dem viele Daten desselben Typs verarbeitet werden müssen— können moderne Prozessoren Teile der Pipeline deaktivieren, so dass die CPU bei mehrmaliger Ausführung eines einzelnen Befehls die Abruf-und Dekodierungsphasen überspringt und somit die Leistung bei bestimmten Gelegenheiten erheblich erhöht, insbesondere bei sehr eintönigen Programm-Engines wie Videoerstellungssoftware und Fotoverarbeitung.,
In dem Fall, in dem ein Teil der CPU superskalar ist und ein Teil nicht, erleidet der Teil, der nicht ist, eine Leistungseinbuße aufgrund von Planungsständen. Der Intel P5 Pentium hatte zwei superskalare ALUs, die jeweils einen Befehl pro Taktzyklus akzeptieren konnten, aber seine FPU konnte keinen Befehl pro Taktzyklus akzeptieren. Somit war der P5 ganzzahliger Superskalar, aber kein Gleitkomma-Superskalar. Intel Nachfolger der P5-Architektur, P6, hinzugefügt superscalar Fähigkeiten zu seinen Gleitkomma-Funktionen, und damit eine deutliche Steigerung der Fließkomma-Befehlsleistung gewährt.,
Sowohl einfache Pipelining und superscalar Design erhöhen eine CPU “ s ILP, indem ein einzelner Prozessor die Ausführung von Anweisungen mit Raten zu übertreffen einen Befehl pro Taktzyklus abzuschließen. Die meisten modernen CPU-Designs sind zumindest etwas superskalar, und fast alle im letzten Jahrzehnt entwickelten Allzweck-CPUs sind superskalar. In späteren Jahren wurde ein Teil des Schwerpunkts bei der Entwicklung von High-ILP-Computern aus der CPU-Hardware und in seine Software-Schnittstelle oder Befehlssatzarchitektur (ISA) verschoben., Die Strategie des very Long Instruction Word (VLIW) bewirkt, dass einige ILP direkt von der Software impliziert werden, wodurch die Menge an Arbeit, die CPU ausführen muss ILP zu steigern und damit die Komplexität des Designs zu reduzieren.
Task-Level-Parallelitätedit
Eine weitere Strategie zur Erzielung von Leistung besteht darin, mehrere Threads oder Prozesse parallel auszuführen. Dieses Forschungsgebiet ist als Parallel Computing bekannt. In Flynns Taxonomie wird diese Strategie als Multiple Instruction Stream, Multiple Data Stream (MIMD) bekannt.,
Eine hierfür verwendete Technologie war das Multiprocessing (MP). Der anfängliche Geschmack dieser Technologie wird als Symmetric Multiprocessing (SMP) bezeichnet, bei dem eine kleine Anzahl von CPUs eine kohärente Sicht auf ihr Speichersystem hat. In diesem Schema verfügt jede CPU über zusätzliche Hardware, um eine ständig aktuelle Ansicht des Speichers aufrechtzuerhalten. Durch die Vermeidung veralteter Speicheransichten können die CPUs mit demselben Programm zusammenarbeiten und Programme können von einer CPU zur anderen migrieren., Um die Anzahl der kooperierenden CPUs über eine Handvoll hinaus zu erhöhen, wurden in den 1990er Jahren Schemata wie Non-Uniform Memory Access (NUMA) und verzeichnisbasierte Kohärenzprotokolle eingeführt. SMP-Systeme sind auf eine kleine Anzahl von CPUs beschränkt, während NUMA-Systeme mit Tausenden von Prozessoren gebaut wurden. Anfangs wurde Multiprocessing unter Verwendung mehrerer diskreter CPUs und Boards erstellt, um die Verbindung zwischen den Prozessoren zu implementieren., Wenn die Prozessoren und ihre Verbindung alle auf einem einzigen Chip implementiert sind, wird die Technologie als Chip-Level-Multiprocessing (CMP) und der einzelne Chip als Multi-Core-Prozessor bezeichnet.
Es wurde später erkannt, dass mit einem einzigen Programm feinere Parallelität existierte. Ein einzelnes Programm kann mehrere Threads (oder Funktionen) haben, die separat oder parallel ausgeführt werden können. Einige der frühesten Beispiele dieser Technologie implementiert Eingabe / Ausgabe-Verarbeitung wie direkten Speicherzugriff als separater Thread aus dem Berechnungsthread., Ein allgemeinerer Ansatz für diese Technologie wurde in den 1970er Jahren eingeführt, als Systeme entwickelt wurden, um mehrere Berechnungsthreads parallel auszuführen. Diese Technologie wird als Multi-Threading (MT) bezeichnet. Dieser Ansatz wird als kostengünstiger als Multiprocessing angesehen, da nur eine kleine Anzahl von Komponenten innerhalb einer CPU repliziert wird, um MT im Gegensatz zur gesamten CPU im Fall von MP zu unterstützen. In MT werden die Ausführungseinheiten und das Speichersystem einschließlich der Caches von mehreren Threads gemeinsam genutzt., Der Nachteil von MT ist, dass die Hardware-Unterstützung für Multithreading für Software sichtbarer ist als die von MP, und daher müssen Supervisor-Software-ähnliche Betriebssysteme größere Änderungen vornehmen, um MT zu unterstützen. Ein Typ von MT, der implementiert wurde, wird als temporales Multithreading bezeichnet, bei dem ein Thread ausgeführt wird, bis er zum Stillstand kommt und darauf wartet, dass Daten aus dem externen Speicher zurückgegeben werden. In diesem Schema würde die CPU dann schnell zu einem anderen Thread wechseln, der betriebsbereit ist, wobei der Switch häufig in einem CPU-Taktzyklus, wie dem UltraSPARC T1, erfolgt., Eine andere Art von MT ist das gleichzeitige Multithreading, bei dem Anweisungen von mehreren Threads innerhalb eines CPU-Taktzyklus parallel ausgeführt werden.
Seit mehreren Jahrzehnten von den 1970er bis Anfang der 2000er Jahre lag der Fokus bei der Entwicklung von Hochleistungs-Allzweck-CPUs weitgehend auf der Erreichung eines hohen ILP durch Technologien wie Pipelining, Caches, superskalare Ausführung, Out-of-Order-Ausführung usw. Dieser Trend gipfelte in großen, leistungshungrigen CPUs wie dem Intel Pentium 4., In den frühen 2000er Jahren wurden CPU-Designer daran gehindert, eine höhere Leistung durch ILP-Techniken zu erzielen, da die Unterschiede zwischen CPU-Betriebsfrequenzen und Hauptspeicherbetriebsfrequenzen zunahmen und die CPU-Verlustleistung aufgrund esoterischer ILP-Techniken zunahm.
CPU-Designer entlehnten dann Ideen aus kommerziellen Computing-Märkten wie Transaktionsverarbeitung, wo die Gesamtleistung mehrerer Programme, auch als Throughput Computing bezeichnet, wichtiger war als die Leistung eines einzelnen Threads oder Prozesses.,
Diese Umkehrung der Betonung wird durch die Verbreitung von Dual-und mehr Core-Prozessor-Designs und vor allem Intel neuere Designs ähnlich seiner weniger superscalar P6-Architektur belegt. Späte Designs in mehreren Prozessorfamilien zeigen CMP, einschließlich der x86-64 Opteron und Athlon 64 X2, die SPARC UltraSPARC T1, IBM POWER4 und POWER5,sowie mehrere Videospiel-Konsole CPUs wie die Xbox 360 Triple-Core PowerPC-Design, und die PlayStation 3 7-Core-Zelle Mikroprozessor.,
Datenparallelitätedit
Ein weniger verbreitetes, aber immer wichtigeres Paradigma von Prozessoren (und in der Tat, Computing im Allgemeinen) befasst sich mit Datenparallelität. Die zuvor diskutierten Prozessoren werden alle als eine Art Skalargerät bezeichnet. Wie der Name schon sagt, behandeln Vektorprozessoren mehrere Daten im Kontext einer Anweisung. Dies steht im Gegensatz zu skalaren Prozessoren, die für jeden Befehl ein Datenelement verarbeiten., Mit Flynns Taxonomie, diese beiden Schemata des Umgangs mit Daten werden im Allgemeinen als Single Instruction Stream bezeichnet, Multiple Data Stream (SIMD) und Single Instruction Stream, Single Data Stream (SISD), beziehungsweise. Der große Nutzen bei der Erstellung von Prozessoren, die sich mit Datenvektoren befassen, liegt in der Optimierung von Aufgaben, für die in der Regel dieselbe Operation (z. B. eine Summe oder ein Punktprodukt) für einen großen Datensatz ausgeführt werden muss. Einige klassische Beispiele für diese Arten von Aufgaben umfassen Multimedia-Anwendungen (Bilder, Video und Ton) sowie viele Arten von wissenschaftlichen und technischen Aufgaben., Während ein Skalarprozessor den gesamten Prozess des Abrufs, Decodierens und Ausführens jeder Anweisung und jedes Werts in einem Datensatz abschließen muss, kann ein Vektorprozessor eine einzelne Operation für einen vergleichsweise großen Datensatz mit einem Befehl ausführen. Dies ist nur möglich, wenn die Anwendung viele Schritte erfordert, die eine Operation auf einen großen Datensatz anwenden.
Die meisten frühen Vektorprozessoren, wie der Cray-1, waren fast ausschließlich mit wissenschaftlicher Forschung und Kryptographie-Anwendungen verbunden., Da sich Multimedia jedoch weitgehend auf digitale Medien verlagert hat, ist der Bedarf an SIMD in Allzweckprozessoren erheblich geworden. Kurz nachdem die Einbeziehung von Gleitkommaeinheiten in Allzweckprozessoren alltäglich geworden war, begannen Spezifikationen für und Implementierungen von SIMD-Ausführungseinheiten auch für Allzweckprozessoren zu erscheinen. Einige dieser frühen SIMD Spezifikationen – wie HP Multimedia Acceleration eXtensions (MAX) und Intel MMX – waren Integer-only., Dies erwies sich als ein erhebliches Hindernis für einige Softwareentwickler, da viele der Anwendungen, die von SIMD profitieren, sich hauptsächlich mit Gleitkommazahlen befassen. Nach und nach verfeinerten und überarbeiteten die Entwickler diese frühen Designs in einige der gängigen modernen SIMD-Spezifikationen, die normalerweise mit einer Befehlssatzarchitektur (ISA) verbunden sind. Einige bemerkenswerte moderne Beispiele sind Intel Streaming SIMD Extensions (SSE) und PowerPC-bezogene AltiVec (auch als VMX bekannt).