Zentraleinheit

  Dies ist ein hervorgehobener Artikel. Klicken Sie hier für weitere Informationen.   Chip eines Intel 80486DX2-Mikroprozessors (tatsächliche Größe: 12 × 6,75 mm) in seiner Verpackung   Vergrößern Chip eines Intel 80486DX2-Mikroprozessors (tatsächliche Größe: 12 × 6,75 mm) in seiner Verpackung

EIN Zentraleinheit ( Zentralprozessor ), oder manchmal einfach Prozessor, ist die Komponente in einem digitalen Computer, die Anweisungen interpretiert und Daten verarbeitet, die in Computerprogrammen enthalten sind. CPUs bieten die grundlegende Eigenschaft digitaler Computer Programmierbarkeit , und sind eine der notwendigen Komponenten, die in gefunden werden Computers aller Epochen, zusammen mit Primärspeichern und Ein-/Ausgabeeinrichtungen. Eine CPU, die unter Verwendung von hergestellt wird integrierte Schaltkreise wird als Mikroprozessor bezeichnet. Seit Mitte der 1970er Jahre haben Single-Chip-Mikroprozessoren alle anderen Arten von CPUs fast vollständig ersetzt, und heute wird der Begriff 'CPU' normalerweise auf irgendeine Art von Mikroprozessor angewendet.

Der Ausdruck 'Zentraleinheit' ist eine Beschreibung einer bestimmten Klasse von logischen Maschinen, die komplexe Computerprogramme ausführen können. Diese breite Definition kann leicht auf viele frühe Computer angewendet werden, die existierten, lange bevor der Begriff 'CPU' jemals weit verbreitet wurde. Der Begriff selbst und sein Initialismus werden jedoch mindestens seit den frühen 1960er Jahren in der Computerindustrie verwendet. Die Form, das Design und die Implementierung von CPUs haben sich seit den frühesten Beispielen dramatisch verändert, aber ihre grundlegende Funktionsweise ist weitgehend gleich geblieben.

Frühe CPUs wurden als Teil eines größeren, normalerweise einzigartigen Computers kundenspezifisch entwickelt. Dieses kostspielige Verfahren zum Entwerfen kundenspezifischer CPUs für eine bestimmte Anwendung ist jedoch weitgehend der Entwicklung kostengünstiger und standardisierter Klassen von Prozessoren gewichen, die für einen oder mehrere Zwecke geeignet sind. Dieser Standardisierungstrend begann im Allgemeinen in der Ära der Mainframes und Minicomputer mit diskreten Transistoren und hat sich mit der Popularisierung der Integrierter Schaltkreis (IK). Der IC hat es ermöglicht, immer komplexere CPUs auf sehr kleinem Raum (in der Größenordnung von Millimetern) zu entwerfen und herzustellen. Sowohl die Miniaturisierung als auch die Standardisierung von CPUs haben die Präsenz dieser digitalen Geräte im modernen Leben weit über die begrenzte Anwendung dedizierter Rechenmaschinen hinaus erhöht. Moderne Mikroprozessoren tauchen in allem auf Autos über Handys bis hin zu Kinderspielzeug.

Geschichte

Vor dem Aufkommen von Maschinen, die den heutigen CPUs ähneln, mussten Computer wie der ENIAC physisch neu verkabelt werden, um verschiedene Aufgaben ausführen zu können. Diese Maschinen werden oft als 'Festprogrammcomputer' bezeichnet, da sie physisch neu konfiguriert werden mussten, um ein anderes Programm auszuführen. Da der Begriff 'CPU' im Allgemeinen als ein Gerät zur Ausführung von Software (Computerprogramm) definiert ist, kamen die frühesten Geräte, die zu Recht als CPUs bezeichnet werden konnten, mit dem Aufkommen der Computer mit gespeicherten Programmen.

Die Idee eines speicherprogrammierbaren Computers war bereits während des Entwurfs von ENIAC vorhanden, wurde jedoch zunächst weggelassen, um die Maschine früher fertigzustellen. Am 30. Juni 1945, noch vor der Fertigstellung von ENIAC, Mathematiker John von Neumann verteilte das Papier mit dem Titel „First Draft of a Report on the EDVAC“. Es skizzierte das Design eines Computers mit gespeicherten Programmen, der schließlich im August 1949 fertiggestellt werden sollte. EDVAC wurde entwickelt, um eine bestimmte Anzahl von Befehlen (oder Operationen) verschiedener Typen auszuführen. Diese Anweisungen könnten kombiniert werden, um nützliche Programme für den Ablauf des EDVAC zu erstellen. Bezeichnenderweise wurden die für EDVAC geschriebenen Programme im Hochgeschwindigkeits-Computerspeicher gespeichert und nicht durch die physische Verkabelung des Computers spezifiziert. Dadurch wurde eine schwerwiegende Einschränkung von ENIAC überwunden, nämlich die große Menge an Zeit und Mühe, die erforderlich war, um den Computer neu zu konfigurieren, um eine neue Aufgabe auszuführen. Mit von Neumanns Design konnte das Programm oder die Software, die EDVAC ausführte, einfach durch Ändern des Inhalts des Computerspeichers geändert werden.

Es sei darauf hingewiesen, dass von Neumann zwar am häufigsten das Design des speicherprogrammierbaren Computers aufgrund seines Designs von EDVAC zugeschrieben wird, andere vor ihm wie Konrad Zuse jedoch ähnliche Ideen vorgeschlagen hatten. Darüber hinaus verwendete die sogenannte Harvard-Architektur des Harvard Mark I, die vor EDVAC fertiggestellt wurde, auch ein gespeichertes Programmdesign, bei dem Lochstreifen anstelle eines elektronischen Speichers verwendet wurden. Der Hauptunterschied zwischen der von Neumann- und der Harvard-Architektur besteht darin, dass letztere die Speicherung und Behandlung von CPU-Anweisungen und -Daten trennt, während erstere für beide den gleichen Speicherplatz verwendet. Die meisten modernen CPUs sind in erster Linie von Neumann im Design, aber auch Elemente der Harvard-Architektur sind häufig zu sehen.

Da alle CPUs digitale Geräte sind, behandeln sie diskrete Zustände und benötigen daher eine Art von Schaltelementen, um zwischen diesen Zuständen zu unterscheiden und sie zu ändern. Vor der kommerziellen Akzeptanz des Transistors wurden üblicherweise elektrische Relais und Vakuumröhren (thermionische Ventile) als Schaltelemente verwendet. Obwohl diese deutliche Geschwindigkeitsvorteile gegenüber früheren, rein mechanischen Konstruktionen hatten, waren sie aus verschiedenen Gründen unzuverlässig. Zum Beispiel erfordert der Aufbau von sequentiellen Gleichstrom-Logikschaltungen aus Relais zusätzliche Hardware, um das Problem des Kontaktprellens zu bewältigen. Während Vakuumröhren nicht unter Kontaktprellen leiden, müssen sie sich erwärmen, bevor sie voll funktionsfähig sind, und schließlich ganz aufhören zu funktionieren. Wenn eine Röhre ausfällt, muss normalerweise die CPU diagnostiziert werden, um die fehlerhafte Komponente zu lokalisieren, damit sie ersetzt werden kann. Daher waren frühe elektronische (auf Vakuumröhren basierende) Computer im Allgemeinen schneller, aber weniger zuverlässig als elektromechanische (auf Relais basierende) Computer. Röhrencomputer wie EDVAC neigten dazu, im Durchschnitt acht Stunden zwischen Ausfällen zu liegen, während Relaiscomputer wie der (langsamere, aber frühere) Harvard Mark I sehr selten ausfielen. Am Ende wurden CPUs auf Röhrenbasis dominant, weil die signifikanten Geschwindigkeitsvorteile im Allgemeinen die Zuverlässigkeitsprobleme überwogen. Die meisten dieser frühen synchronen CPUs liefen im Vergleich zu modernen mikroelektronischen Designs mit niedrigen Taktraten (siehe unten für eine Diskussion der Taktrate). Taktsignalfrequenzen im Bereich von 100 kHz bis 4 MHz waren zu dieser Zeit weit verbreitet und weitgehend durch die Geschwindigkeit der Schaltgeräte begrenzt, mit denen sie gebaut wurden.

Diskrete Transistor- und IC-CPUs

  CPU, Kernspeicher und externe Busschnittstelle eines MSI PDP-8/I.   Vergrößern CPU, Kernspeicher und externe Busschnittstelle eines MSI PDP-8/I.

Die Designkomplexität von CPUs nahm zu, da verschiedene Technologien den Bau kleinerer und zuverlässigerer elektronischer Geräte erleichterten. Die erste derartige Verbesserung kam mit dem Aufkommen des Transistors. Transistorisierte CPUs mussten in den 1950er und 1960er Jahren nicht mehr aus sperrigen, unzuverlässigen und zerbrechlichen Schaltelementen wie Vakuumröhren und elektrischen Relais gebaut werden. Mit dieser Verbesserung wurden komplexere und zuverlässigere CPUs auf einer oder mehreren Leiterplatten aufgebaut, die diskrete (einzelne) Komponenten enthielten.

Während dieser Zeit gewann ein Verfahren zur Herstellung vieler Transistoren auf kompaktem Raum an Popularität. Das Integrierter Schaltkreis ( IC ) ermöglichte die Herstellung einer großen Anzahl von Transistoren auf einem einzigen Halbleiter -basierter Würfel oder 'Chip'. Zunächst wurden nur sehr einfache, nicht spezialisierte digitale Schaltungen wie NOR-Gatter in ICs miniaturisiert. CPUs, die auf diesen „Baustein“-ICs basieren, werden allgemein als „Kleinintegration“ bezeichnet ( SSI ) Geräte. SSI-ICs, wie sie im Apollo-Führungscomputer verwendet werden, enthielten normalerweise Transistorzahlen in Vielfachen von zehn. Um eine ganze CPU aus SSI-ICs zu bauen, waren Tausende von einzelnen Chips erforderlich, verbrauchten aber immer noch viel weniger Platz und Strom als frühere diskrete Transistordesigns. Mit fortschreitender mikroelektronischer Technologie wurde eine zunehmende Anzahl von Transistoren auf ICs platziert, wodurch die Menge an einzelnen ICs verringert wurde, die für eine vollständige CPU benötigt werden. MSI und LSI (mittlere und große Integration) ICs erhöhten die Anzahl der Transistoren auf Hunderte, dann Tausende.

1964 führte IBM seine System/360-Computerarchitektur ein, die in einer Reihe von Computern verwendet wurde, die dieselben Programme mit unterschiedlicher Geschwindigkeit und Leistung ausführen konnten. Dies war zu einer Zeit von Bedeutung, als die meisten elektronischen Computer nicht miteinander kompatibel waren, selbst wenn sie vom selben Hersteller hergestellt wurden. Um diese Verbesserung zu erleichtern, nutzte IBM das Konzept eines Mikroprogramms (häufig als „Mikrocode“ bezeichnet), das in modernen CPUs immer noch weit verbreitet ist. Die System/360-Architektur war so beliebt, dass sie den Mainframe-Computermarkt für die nächsten Jahrzehnte dominierte und ein Vermächtnis hinterließ, das immer noch von ähnlichen modernen Computern wie der IBM zSeries fortgesetzt wird. Im selben Jahr (1964) führte die Digital Equipment Corporation (DEC) einen weiteren einflussreichen Computer für den Wissenschafts- und Forschungsmarkt ein, den PDP-8. DEC führte später die äußerst beliebte PDP-11-Reihe ein, die ursprünglich mit SSI-ICs gebaut wurde, aber schließlich mit LSI-Komponenten implementiert wurde, sobald diese praktisch wurden. Im krassen Gegensatz zu seinen SSI- und MSI-Vorgängern enthielt die erste LSI-Implementierung des PDP-11 eine CPU, die nur aus vier integrierten LSI-Schaltkreisen bestand.

Computer auf Transistorbasis hatten gegenüber ihren Vorgängern mehrere deutliche Vorteile. Abgesehen von der Erhöhung der Zuverlässigkeit und dem geringeren Stromverbrauch ermöglichten Transistoren aufgrund der kurzen Schaltzeit eines Transistors im Vergleich zu einer Röhre oder einem Relais auch den Betrieb von CPUs mit viel höheren Geschwindigkeiten. Dank sowohl der erhöhten Zuverlässigkeit als auch der dramatisch erhöhten Geschwindigkeit der Schaltelemente (die zu diesem Zeitpunkt fast ausschließlich Transistoren waren) wurden in dieser Zeit CPU-Taktraten im zweistelligen Megahertz-Bereich erzielt. Während diskrete Transistor- und IC-CPUs stark ausgelastet waren, tauchten außerdem neue Hochleistungsdesigns wie SIMD-Vektorprozessoren (Single Instruction Multiple Data) auf. Diese frühen experimentellen Designs führten später zur Ära spezialisierter Supercomputer wie denen von Cray Inc.

Mikroprozessoren

  Intel 80486DX2 Mikroprozessor in einem Keramik-PGA-Gehäuse   Vergrößern Intel 80486DX2 Mikroprozessor in einem Keramik-PGA-Gehäuse

Die Einführung des Mikroprozessors in den 1970er Jahren beeinflusste das Design und die Implementierung von CPUs erheblich. Seit der Einführung des ersten Mikroprozessors (Intel 4004) im Jahr 1970 und des ersten weit verbreiteten Mikroprozessors (Intel 8080) im Jahr 1974 hat diese Klasse von CPUs alle anderen Implementierungsmethoden für Zentraleinheiten fast vollständig überholt. Mainframe- und Minicomputerhersteller der damaligen Zeit starteten proprietäre IC-Entwicklungsprogramme, um ihre älteren Computerarchitekturen aufzurüsten, und produzierten schließlich befehlssatzkompatible Mikroprozessoren, die mit ihrer älteren Hardware und Software abwärtskompatibel waren. Kombiniert mit dem Aufkommen und schließlich dem enormen Erfolg des jetzt allgegenwärtigen Personal Computers wird der Begriff 'CPU' jetzt fast ausschließlich auf Mikroprozessoren angewendet.

Frühere Generationen von CPUs wurden als diskrete Komponenten und zahlreiche kleine implementiert integrierte Schaltkreise (ICs) auf einer oder mehreren Leiterplatten. Mikroprozessoren hingegen sind CPUs, die auf einer sehr kleinen Anzahl von ICs hergestellt werden; normalerweise nur eine. Die insgesamt kleinere CPU-Größe als Ergebnis der Implementierung auf einem einzigen Die bedeutet eine schnellere Umschaltzeit aufgrund physikalischer Faktoren wie verringerter Gate-Parasitär Kapazität . Dies hat es synchronen Mikroprozessoren ermöglicht, Taktraten im Bereich von mehreren zehn Megahertz bis zu mehreren Gigahertz aufzuweisen. Da die Fähigkeit, außerordentlich kleine Transistoren auf einem IC zu konstruieren, zugenommen hat, hat außerdem die Komplexität und Anzahl von Transistoren in einer einzelnen CPU dramatisch zugenommen. Dieser weithin beobachtete Trend wird durch das Mooresche Gesetz beschrieben, das sich bis heute als ziemlich genauer Prädiktor für das Wachstum der Komplexität von CPUs (und anderen ICs) erwiesen hat.

Während sich die Komplexität, Größe, Konstruktion und allgemeine Form von CPUs in den letzten sechzig Jahren drastisch verändert haben, ist es bemerkenswert, dass sich das grundlegende Design und die Funktion überhaupt nicht wesentlich geändert haben. Fast alle heute gebräuchlichen CPUs können sehr genau als Von-Neumann-Speicherprogrammiermaschinen bezeichnet werden.

Da das zuvor erwähnte Gesetz von Moore weiterhin gilt, sind Bedenken hinsichtlich der Grenzen der Transistortechnologie für integrierte Schaltungen aufgekommen. Die extreme Miniaturisierung elektronischer Gates führt dazu, dass die Auswirkungen von Phänomenen wie Elektromigration und Lecks unter dem Schwellwert viel bedeutender werden. Diese neueren Bedenken gehören zu den vielen Faktoren, die Forscher dazu veranlassen, neue Rechenmethoden wie die zu untersuchen so viel wie ein Computer , sowie die Verwendung von Parallelität und anderen Methoden zu erweitern, die die Nützlichkeit des klassischen von Neumann-Modells erweitern.

CPU-Betrieb

Die grundlegende Funktionsweise der meisten CPUs besteht unabhängig von ihrer physischen Form darin, eine Folge gespeicherter Anweisungen, die als Programm bezeichnet werden, auszuführen. Hier werden Vorrichtungen diskutiert, die der üblichen von-Neumann-Architektur entsprechen. Das Programm wird durch eine Reihe von Zahlen dargestellt, die in einer Art Computerspeicher aufbewahrt werden. Es gibt vier Schritte, die fast alle von Neumann-CPUs in ihrem Betrieb verwenden: bringen , dekodieren , ausführen , und Schreib zurück .

  Diagramm, das zeigt, wie eine MIPS32-Anweisung decodiert wird. (MIPS-Technologien 2005)   Vergrößern Diagramm, das zeigt, wie eine MIPS32-Anweisung decodiert wird.

Der erste Schritt, bringen beinhaltet das Abrufen einer Anweisung (die durch eine Zahl oder Zahlenfolge dargestellt wird) aus dem Programmspeicher. Die Stelle im Programmspeicher wird durch einen Programmzähler (PC) bestimmt, der eine Nummer speichert, die die aktuelle Position im Programm identifiziert. Mit anderen Worten, der Programmzähler verfolgt den Platz der CPU im aktuellen Programm. Nachdem ein Befehl abgerufen wurde, wird der PC um die Länge des Befehlsworts in Speichereinheiten inkrementiert. Häufig muss der abzurufende Befehl aus einem relativ langsamen Speicher abgerufen werden, wodurch die CPU blockiert wird, während sie auf die Rückgabe des Befehls wartet. Dieses Problem wird in modernen Prozessoren weitgehend durch Caches und Pipeline-Architekturen angegangen (siehe unten).

Die Anweisung, die die CPU aus dem Speicher abruft, wird verwendet, um zu bestimmen, was die CPU tun soll. In dem dekodieren Schritt wird die Anweisung in Teile zerlegt, die für andere Teile der CPU von Bedeutung sind. Die Art und Weise, wie der numerische Befehlswert interpretiert wird, wird durch die Befehlssatzarchitektur der CPU festgelegt ( EINES ). Oft gibt eine Gruppe von Zahlen in der Anweisung, Opcode genannt, an, welche Operation auszuführen ist. Die verbleibenden Teile der Zahl liefern normalerweise Informationen, die für diese Anweisung erforderlich sind, wie z. B. Operanden für eine Additionsoperation. Solche Operanden können als konstanter Wert (als Sofortwert bezeichnet) oder als Ort zum Auffinden eines Werts angegeben werden: ein Register oder eine Speicheradresse, wie durch einen Adressierungsmodus bestimmt. In älteren Designs waren die für die Befehlsdecodierung verantwortlichen Teile der CPU unveränderliche Hardwaregeräte. In abstrakteren und komplizierteren CPUs und ISAs wird jedoch häufig ein Mikroprogramm verwendet, um beim Übersetzen von Anweisungen in verschiedene Konfigurationssignale für die CPU zu helfen. Dieses Mikroprogramm ist manchmal überschreibbar, so dass es modifiziert werden kann, um die Art und Weise zu ändern, wie die CPU Anweisungen dekodiert, selbst nachdem es hergestellt wurde.

  Blockschaltbild einer einfachen CPU   Vergrößern Blockschaltbild einer einfachen CPU

Nach den Abruf- und Dekodierungsschritten wird die ausführen Schritt durchgeführt wird. Während dieses Schritts werden verschiedene Teile der CPU verbunden, damit sie die gewünschte Operation ausführen können. Wenn beispielsweise eine Additionsoperation angefordert wurde, wird ein Rechenwerk ( GEHEN ) wird mit einer Reihe von Eingängen und einer Reihe von Ausgängen verbunden. Die Eingänge liefern die zu addierenden Zahlen, und die Ausgänge enthalten die endgültige Summe. Die ALU enthält die Schaltung, um einfache arithmetische und logische Operationen an den Eingängen durchzuführen (wie Additionen und bitweise Operationen). Wenn die Additionsoperation ein Ergebnis erzeugt, das für die Verarbeitung durch die CPU zu groß ist, kann auch ein arithmetischer Überlaufmerker in einem Merkerregister gesetzt werden (siehe die Erörterung des ganzzahligen Bereichs weiter unten).

Der letzte Schritt, Schreib zurück , 'schreibt' einfach die Ergebnisse des Ausführungsschritts in eine Art Speicher zurück. Sehr oft werden die Ergebnisse für den schnellen Zugriff durch nachfolgende Befehle in ein internes CPU-Register geschrieben. In anderen Fällen können Ergebnisse in einen langsameren, aber billigeren und größeren Hauptspeicher geschrieben werden. Einige Befehlstypen manipulieren den Programmzähler, anstatt direkt Ergebnisdaten zu erzeugen. Diese werden im Allgemeinen 'Sprünge' genannt und ermöglichen Verhalten wie Schleifen, bedingte Programmausführung (durch die Verwendung eines bedingten Sprungs) und Funktionen in Programmen. Viele Befehle ändern auch den Zustand von Ziffern in einem 'Flags'-Register. Diese Flags können verwendet werden, um das Verhalten eines Programms zu beeinflussen, da sie oft das Ergebnis verschiedener Operationen anzeigen. Zum Beispiel betrachtet ein Typ von 'Vergleichs'-Befehl zwei Werte und setzt eine Zahl in das Flags-Register, gemäß der eins größer ist. Dieses Flag könnte dann von einem späteren Sprungbefehl verwendet werden, um den Programmablauf zu bestimmen.

Nach der Ausführung des Befehls und dem Zurückschreiben der resultierenden Daten wiederholt sich der gesamte Prozess, wobei der nächste Befehlszyklus aufgrund des inkrementierten Werts im Programmzähler normalerweise den nächsten Befehl in der Reihenfolge holt. Wenn die abgeschlossene Anweisung ein Sprung war, wird der Programmzähler so modifiziert, dass er die Adresse der Anweisung enthält, zu der gesprungen wurde, und die Programmausführung wird normal fortgesetzt. In komplexeren CPUs als der hier beschriebenen können mehrere Befehle gleichzeitig abgerufen, dekodiert und ausgeführt werden. In diesem Abschnitt wird beschrieben, was allgemein als „klassische RISC-Pipeline“ bezeichnet wird, die unter den einfachen CPUs, die in vielen elektronischen Geräten (oft als Mikrocontroller bezeichnet) verwendet werden, tatsächlich ziemlich verbreitet ist.

Konzeption und Umsetzung

Voraussetzungen
Rechnerarchitektur
Digitale Schaltungen

Ganzzahliger Bereich

Die Art und Weise, wie eine CPU Zahlen darstellt, ist eine Designentscheidung, die sich auf die grundlegendsten Funktionsweisen des Geräts auswirkt. Einige frühe digitale Computer verwendeten ein elektrisches Modell des üblichen Dezimalzahlensystems (Basis zehn), um Zahlen intern darzustellen. Einige andere Computer haben exotischere Zahlensysteme 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 „hoch“ oder „niedrig“ dargestellt wird. Stromspannung .

  MOS 6502 Mikroprozessor in einem Dual-Inline-Gehäuse, ein äußerst beliebtes 8-Bit-Design.   Vergrößern MOS 6502 Mikroprozessor in einem Dual-Inline-Gehäuse, ein äußerst beliebtes 8-Bit-Design.

Im Zusammenhang mit der Zahlendarstellung steht die Größe und Genauigkeit der Zahlen, die eine CPU darstellen kann. Im Fall einer binären CPU a bisschen bezieht sich auf eine signifikante Stelle in den Zahlen, mit denen eine CPU zu tun hat. Die Anzahl der Bits (oder Ziffernstellen), die eine CPU zur Darstellung von Zahlen verwendet, wird häufig als 'Wortgröße', 'Bitbreite', 'Datenpfadbreite' oder 'ganzzahlige Genauigkeit' bezeichnet, wenn es um strenge Ganzzahlen geht (im Gegensatz zu Gleitkommazahlen). Punkt). Diese Anzahl unterscheidet sich zwischen Architekturen und oft innerhalb verschiedener Teile derselben CPU. Beispielsweise verarbeitet eine 8-Bit-CPU einen Zahlenbereich, der durch acht Binärziffern dargestellt werden kann (jede Ziffer hat zwei mögliche Werte), d. h. 2 8 oder 256 diskrete Zahlen. Tatsächlich setzt die Ganzzahlgröße eine Hardwaregrenze für den Bereich von Ganzzahlen, die die von der CPU ausgeführte Software verwenden kann.

Der ganzzahlige Bereich kann sich auch auf die Anzahl der Speicherplätze auswirken, die die CPU verwenden kann die Anschrift (Lokalisieren). Wenn beispielsweise eine binäre CPU 32 Bits verwendet, um eine Speicheradresse darzustellen, und jede Speicheradresse ein Oktett (8 Bits) darstellt, beträgt die maximale Speichermenge, die die CPU adressieren kann, 2 32 Oktette oder 4 GiB. Dies ist eine sehr einfache Ansicht des CPU-Adressraums, und viele moderne Designs verwenden viel komplexere Adressierungsmethoden wie Paging, um mehr Speicher zu finden, als ihr ganzzahliger Bereich mit einem flachen Adressraum zulassen würde.

Höhere Ebenen des ganzzahligen Bereichs erfordern mehr Strukturen, um mit den zusätzlichen Ziffern fertig zu werden, und daher mehr Komplexität, Größe, Stromverbrauch und allgemein Kosten. Es ist daher nicht ungewöhnlich, dass in modernen Anwendungen 4- oder 8-Bit-Mikrocontroller verwendet werden, obwohl CPUs mit viel höherer Bandbreite (z. B. 16, 32, 64 oder sogar 128 Bit) verfügbar sind. Die einfacheren Mikrocontroller sind normalerweise billiger, verbrauchen weniger Strom und leiten daher weniger Wärme ab, was alles wichtige Designüberlegungen für elektronische Geräte sein können. Bei High-End-Anwendungen sind die Vorteile, die der zusätzliche Bereich (meistens der zusätzliche Adressraum) bietet, jedoch bedeutender und wirken sich häufig auf Designentscheidungen aus. Um einige der Vorteile zu erzielen, die sowohl durch niedrigere als auch durch höhere Bitlängen geboten werden, sind viele CPUs mit unterschiedlichen Bitbreiten für unterschiedliche Teile des Geräts ausgelegt. Zum Beispiel verwendete das IBM System/370 eine CPU, die hauptsächlich 32 Bit hatte, aber es verwendete eine 128-Bit-Präzision innerhalb seiner Gleitkommaeinheiten, um eine größere Genauigkeit und einen größeren Bereich bei Gleitkommazahlen zu ermöglichen. 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.

Taktfrequenz

Die meisten CPUs und tatsächlich die meisten sequentiellen Logikgeräte sind von Natur aus synchron. Das heißt, sie sind entworfen und arbeiten auf Annahmen über ein Synchronisationssignal. Dieses Signal, bekannt als a Taktsignal , nimmt normalerweise die Form einer periodischen Rechteckwelle an. Durch die Berechnung der maximalen Zeit, die sich elektrische Signale in verschiedenen Zweigen der vielen Schaltungen einer CPU bewegen können, können die Entwickler eine geeignete Periode für das Taktsignal auswählen.

Dieser Zeitraum muss länger sein als die Zeit, die ein Signal benötigt, um sich im schlimmsten Fall zu bewegen oder auszubreiten. Durch Einstellen der Taktperiode auf einen Wert weit über der Ausbreitungsverzögerung im schlimmsten Fall ist es möglich, die gesamte CPU und die Art und Weise, wie sie Daten um die 'Flanken' des ansteigenden und abfallenden Taktsignals bewegt, zu entwerfen. Dies hat den Vorteil, dass die CPU erheblich vereinfacht wird, sowohl aus Sicht des Designs als auch aus Sicht der Komponentenanzahl. 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).

Architekturverbesserungen allein lösen jedoch nicht alle Nachteile von global synchronen CPUs. Beispielsweise unterliegt ein Taktsignal den Verzögerungen jedes anderen elektrischen Signals. Höhere Taktraten in immer komplexeren CPUs machen es schwieriger, das Taktsignal über die gesamte Einheit in Phase (synchronisiert) zu halten. Dies hat dazu geführt, dass viele moderne CPUs die Bereitstellung mehrerer identischer Taktsignale erfordern, um zu vermeiden, dass ein einzelnes Signal erheblich genug verzögert wird, um eine Fehlfunktion der CPU zu verursachen. Ein weiteres großes Problem bei dramatisch steigenden Taktraten ist die Wärmemenge, die von der CPU abgeführt wird. Die ständig wechselnde Uhr führt dazu, dass viele Komponenten schalten, unabhängig davon, ob sie gerade verwendet werden. Im Allgemeinen verbraucht eine schaltende Komponente mehr Energie als ein Element in einem statischen Zustand. Daher erhöht sich mit zunehmender Taktrate auch die Wärmeableitung, wodurch die CPU effektivere Kühllösungen benötigt.

Eine Methode, mit dem Umschalten nicht benötigter Komponenten umzugehen, wird Clock-Gating genannt, bei der das Taktsignal für nicht benötigte Komponenten abgeschaltet (effektiv deaktiviert) wird. Dies wird jedoch oft als schwierig zu implementieren angesehen und wird daher außerhalb von sehr stromsparenden Designs nicht allgemein verwendet. Ein weiteres Verfahren, um einige der Probleme mit einem globalen Taktsignal anzugehen, besteht darin, das Taktsignal insgesamt zu entfernen. Während das Entfernen des globalen Taktsignals den Designprozess in vielerlei Hinsicht erheblich komplexer macht, weisen asynchrone (oder taktlose) Designs im Vergleich zu ähnlichen synchronen Designs deutliche Vorteile bei Stromverbrauch und Wärmeableitung auf. Obwohl etwas ungewöhnlich, wurden ganze CPUs gebaut, ohne ein globales Taktsignal zu verwenden. Zwei bemerkenswerte Beispiele hierfür sind das ARM-kompatible AMULET und das MIPS R3000-kompatible 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 superskalarem Pipelining, um einige arithmetische Leistungssteigerungen zu erzielen. Obwohl nicht ganz klar ist, ob vollständig asynchrone Designs auf einem vergleichbaren oder besseren Niveau als ihre synchronen Gegenstücke arbeiten können, ist es offensichtlich, dass sie sich zumindest bei einfacheren mathematischen Operationen auszeichnen. Dies, kombiniert mit ihrem hervorragenden Stromverbrauch und ihren Wärmeableitungseigenschaften, macht sie sehr geeignet für eingebettete Computer.

Parallelität

  Modell einer subskalaren CPU. Beachten Sie, dass es fünfzehn Zyklen dauert, um drei Anweisungen zu vervollständigen.   Vergrößern Modell einer subskalaren CPU. Beachten Sie, dass es fünfzehn Zyklen dauert, um drei Anweisungen zu vervollständigen.

Die im vorherigen Abschnitt angebotene Beschreibung der grundlegenden Funktionsweise einer CPU beschreibt die einfachste Form, die eine CPU annehmen kann. Diese Art von CPU, die normalerweise als subskalar , bearbeitet und führt eine Anweisung auf einem oder zwei Datenstücken gleichzeitig aus.

Dieser Prozess führt zu einer inhärenten Ineffizienz in subskalaren CPUs. Da jeweils nur eine Anweisung ausgeführt wird, muss die gesamte CPU warten, bis diese Anweisung abgeschlossen ist, bevor sie mit der nächsten Anweisung fortfährt. Infolgedessen bleibt die subskalare CPU bei Befehlen 'hängen', 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 aufgelegt wird, werden nun zwei Pfade aufgelegt und die Anzahl unbenutzter Transistoren wird erhöht. Dieses Design, bei dem die Ausführungsressourcen der CPU jeweils nur an einer Anweisung arbeiten können, kann möglicherweise nur erreichen Skalar Leistung (eine Anweisung pro Uhr). Die Leistung ist jedoch fast immer subskalar (weniger als eine Anweisung pro Zyklus).

Versuche, eine skalare und bessere Leistung zu erzielen, haben zu einer Vielzahl von Entwurfsmethoden geführt, die bewirken, dass sich die CPU weniger linear und mehr parallel verhält. Wenn auf Parallelität in CPUs Bezug genommen wird, werden im Allgemeinen zwei Begriffe verwendet, um diese Entwurfstechniken zu klassifizieren. Parallelität auf Befehlsebene (ILP) zielt darauf ab, die Rate zu erhöhen, mit der Anweisungen innerhalb einer CPU ausgeführt werden (d. h. um die Auslastung von Ausführungsressourcen auf dem Chip zu erhöhen), und Parallelität auf Threadebene (TLP) dient dazu, die Anzahl der Threads zu erhöhen ( effektiv einzelne Programme), die eine CPU gleichzeitig ausführen kann. Jede Methode unterscheidet sich sowohl in der Art und Weise, wie sie implementiert wird, als auch in der relativen Effektivität, die sie bei der Steigerung der CPU-Leistung für eine Anwendung bieten.

ILP: Anweisungs-Pipelining und superskalare Architektur

  Grundlegende fünfstufige Pipeline. Im besten Fall kann diese Pipeline eine Ausführungsrate von einer Anweisung pro Zyklus aufrechterhalten.   Vergrößern Grundlegende fünfstufige Pipeline. Im besten Fall kann diese Pipeline eine Ausführungsrate von einer Anweisung pro Zyklus aufrechterhalten.

Eines der einfachsten Verfahren, das verwendet wird, um eine erhöhte Parallelität zu erreichen, besteht darin, mit den ersten Schritten des Abrufens und Decodierens von Befehlen zu beginnen, bevor der vorherige Befehl die Ausführung beendet. Dies ist die einfachste Form einer Technik, die als bekannt ist Anweisungspipeline , und wird in fast allen modernen Allzweck-CPUs verwendet. Das Pipelining ermöglicht die gleichzeitige Ausführung von mehr als einem Befehl, indem der Ausführungsweg in diskrete Stufen zerlegt wird. Diese Trennung kann mit einem Fließband verglichen werden, in dem eine Anweisung in jeder Phase vollständiger gemacht wird, bis sie die Ausführungspipeline verlässt und zurückgezogen wird.

Das Pipelining führt jedoch die Möglichkeit einer Situation ein, 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 damit fertig zu werden, muss zusätzlich darauf geachtet werden, auf diese Art von Bedingungen zu prüfen und einen Teil der Befehlspipeline zu verzögern, wenn dies auftritt. Um dies zu erreichen, sind natürlich zusätzliche Schaltkreise erforderlich, sodass Pipeline-Prozessoren komplexer sind als subskalare (wenn auch nicht sehr signifikant). Ein Pipeline-Prozessor kann fast skalar werden, nur durch Pipeline-Stalls (ein Befehl, der mehr als einen Taktzyklus in einer Stufe verbringt) gehemmt.

  Einfache superskalare Pipeline. Durch gleichzeitiges Abrufen und Versenden von zwei Befehlen können maximal zwei Befehle pro Zyklus ausgeführt werden.   Vergrößern Einfache superskalare Pipeline. Durch gleichzeitiges Abrufen und Versenden von zwei Befehlen können maximal zwei Befehle pro Zyklus ausgeführt werden.

Eine weitere Verbesserung der Idee des Befehls-Pipelining führte zur Entwicklung eines Verfahrens, das die Leerlaufzeit von CPU-Komponenten noch weiter verringert. Designs, die angeblich sind superskalar enthalten eine lange Befehlspipeline und mehrere identische Ausführungseinheiten. 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 dies der Fall ist, werden sie an verfügbare Ausführungseinheiten gesendet, was dazu führt, dass mehrere Befehle gleichzeitig ausgeführt werden können. Im Allgemeinen gilt: Je mehr Anweisungen eine superskalare CPU gleichzeitig an wartende Ausführungseinheiten senden kann, desto mehr Anweisungen werden in einem bestimmten Zyklus ausgeführt.

Die größte Schwierigkeit beim Entwurf einer superskalaren CPU-Architektur liegt in der Schaffung eines effektiven Dispatchers. Der Dispatcher muss in der Lage sein, schnell und korrekt festzustellen, ob Anweisungen parallel ausgeführt werden können, und sie so zu versenden, dass möglichst viele Ausführungseinheiten beschäftigt sind. Dies erfordert, dass die Befehlspipeline so oft wie möglich gefüllt wird, und führt zu dem Bedarf in superskalaren Architekturen für erhebliche Mengen an CPU-Cache . Es macht auch Techniken zur Vermeidung von Gefahren wie Verzweigungsvorhersage, spekulative Ausführung und Ausführung außerhalb der Reihenfolge für die Aufrechterhaltung eines hohen Leistungsniveaus entscheidend. Durch den Versuch vorherzusagen, welchen Zweig (oder Pfad) eine bedingte Anweisung nehmen wird, kann die CPU die Anzahl der Male minimieren, die die gesamte Pipeline warten muss, bis eine bedingte Anweisung abgeschlossen ist. Die spekulative Ausführung bietet oft bescheidene Leistungssteigerungen, indem Teile des Codes ausgeführt werden, die nach Abschluss einer bedingten Operation möglicherweise benötigt werden oder nicht. Die Ausführung außerhalb der Reihenfolge ordnet die Reihenfolge, in der Befehle ausgeführt werden, etwas neu an, um Verzögerungen aufgrund von Datenabhängigkeiten zu reduzieren.

In dem Fall, in dem ein Teil der CPU superskalar ist und ein Teil nicht, erleidet der Teil, der dies nicht ist, eine Leistungseinbuße aufgrund von Planungsverzögerungen. Der ursprüngliche Intel Pentium (P5) hatte zwei superskalare ALUs, die jeweils einen Befehl pro Takt akzeptieren konnten, aber seine FPU konnte keinen Befehl pro Takt akzeptieren. Somit war P5 ganzzahliger Superskalar, aber kein Gleitkomma-Superskalar. Intels Nachfolger der Pentium-Architektur, P6, fügte seinen Gleitkommafunktionen superskalare Fähigkeiten hinzu und ermöglichte daher eine signifikante Steigerung der Gleitkommabefehlsleistung.

Sowohl einfaches Pipelining als auch superskalares Design erhöhen den ILP einer CPU, indem sie es einem einzelnen Prozessor ermöglichen, die Ausführung von Anweisungen mit Raten abzuschließen, die eine Anweisung pro Zyklus übersteigen ( IPC ). Die meisten modernen CPU-Designs sind zumindest etwas superskalar, und fast alle Allzweck-CPUs, die in den letzten zehn Jahren entwickelt wurden, sind superskalar. In späteren Jahren wurde ein Teil des Schwerpunkts beim Entwerfen von Computern mit hohem ILP von der Hardware der CPU auf ihre Softwareschnittstelle oder ISA verlagert. Die Strategie des sehr langen Anweisungsworts (VLIW) bewirkt, dass ein Teil des ILP direkt von der Software impliziert wird, wodurch der Arbeitsaufwand verringert wird, den die CPU ausführen muss, um das ILP zu verstärken, und dadurch die Komplexität des Designs verringert wird.

TLP: Gleichzeitige Thread-Ausführung

Eine andere Strategie, die häufig verwendet wird, um die Parallelität von CPUs zu erhöhen, besteht darin, die Fähigkeit einzubeziehen, mehrere Threads (Programme) gleichzeitig auszuführen. Im Allgemeinen sind High-TLP-CPUs viel länger im Einsatz als High-ILP-CPUs. Viele der von Cray in den späten 1970er und 1980er Jahren entwickelten Designs konzentrierten sich auf TLP als ihre primäre Methode, um (für die damalige Zeit) enorme Rechenleistung zu ermöglichen. Tatsächlich wurde TLP in Form von Verbesserungen bei der Ausführung mehrerer Threads bereits in den 1950er Jahren verwendet. Im Kontext des Einzelprozessordesigns sind die zwei Hauptmethodologien, die verwendet werden, um TLP zu erreichen, Chip-Level-Multiprocessing (CMP) und simultanes Multithreading (SMT). Auf einer höheren Ebene ist es üblich, Computer mit mehreren völlig unabhängigen CPUs in Anordnungen wie symmetrischem Multiprocessing (SMP) und ungleichmäßigem Speicherzugriff (NUMA) zu bauen. Obwohl sehr unterschiedliche Mittel verwendet werden, erreichen alle diese Techniken das gleiche Ziel: die Erhöhung der Anzahl von Threads, die die CPU(s) parallel ausführen können.

Die CMP- und SMP-Parallelisierungsverfahren sind einander ähnlich und am einfachsten. Diese beinhalten konzeptionell kaum mehr als die Verwendung von zwei oder mehr vollständigen und unabhängigen CPUs. Im Fall von CMP sind mehrere Prozessorkerne in demselben Paket enthalten, manchmal sogar auf demselben Integrierter Schaltkreis . SMP hingegen enthält mehrere unabhängige Pakete. NUMA ist SMP etwas ähnlich, verwendet jedoch ein uneinheitliches Speicherzugriffsmodell. Dies ist wichtig für Computer mit vielen CPUs, da die Zugriffszeit jedes Prozessors auf den Speicher mit dem gemeinsam genutzten Speichermodell von SMP schnell erschöpft ist, was zu erheblichen Verzögerungen führt, da CPUs auf Speicher warten. Daher wird NUMA als ein viel skalierbareres Modell angesehen, das erfolgreich die Verwendung von viel mehr CPUs in einem Computer ermöglicht, als SMP machbar unterstützen kann. SMT unterscheidet sich etwas von anderen TLP-Verbesserungen dadurch, dass es versucht, so wenige Teile der CPU wie möglich zu duplizieren. Obwohl es als TLP-Strategie angesehen wird, ähnelt seine Implementierung eher einem superskalaren Design und wird tatsächlich häufig in superskalaren Mikroprozessoren (wie IBMs POWER5) verwendet. Anstatt die gesamte CPU zu duplizieren, entwirft SMT nur doppelte Teile, die für das Abrufen, Decodieren und Versenden von Befehlen benötigt werden, sowie Dinge wie Allzweckregister. Dies ermöglicht es einer SMT-CPU, ihre Ausführungseinheiten häufiger zu beschäftigen, indem sie ihnen Anweisungen von zwei verschiedenen Software-Threads bereitstellt. Auch dies ist dem superskalaren ILP-Verfahren sehr ähnlich, führt aber gleichzeitig Befehle aus mehrere Fäden anstatt mehrere Anweisungen von der auszuführen gleichen Faden gleichzeitig.

Vektorprozessoren und SIMD

Ein weniger verbreitetes, aber zunehmend wichtiges Paradigma von CPUs (und tatsächlich von Computern im Allgemeinen) befasst sich mit Vektoren . Die zuvor besprochenen Prozessoren werden alle als eine Art von bezeichnet Skalar Gerät. Wie der Name schon sagt, verarbeiten Vektorprozessoren mehrere Daten im Kontext einer Anweisung. Dies steht im Gegensatz zu skalaren Prozessoren, die für jede Anweisung mit einem Datenelement umgehen. Diese beiden Schemata zum Umgang mit Daten werden allgemein als SISD (Einzelbefehl, Einzeldaten) bzw. SIMD (Einzelbefehl, Mehrfachdaten) bezeichnet. Der große Nutzen beim Erstellen von CPUs, die mit Datenvektoren umgehen, liegt in der Optimierung von Aufgaben, die dazu neigen, die Ausführung derselben Operation (z. B. einer Summe oder eines Punktprodukts) an einem großen Datensatz zu erfordern. Einige klassische Beispiele für diese Art von Aufgaben sind Multimedia-Anwendungen (Bild, Video und Ton) sowie viele Arten von wissenschaftlichen und technischen Aufgaben. Während eine Skalar-CPU den gesamten Prozess des Abrufens, Decodierens und Ausführens jeder Anweisung und jedes Werts in einem Datensatz abschließen muss, kann eine Vektor-CPU eine einzelne Operation an einer vergleichsweise großen Datenmenge mit einer Anweisung ausführen. Dies ist natürlich nur möglich, wenn die Anwendung dazu neigt, viele Schritte zu erfordern, die eine Operation auf einen großen Datensatz anwenden.

Die meisten frühen Vektor-CPUs, wie der Cray-1, wurden fast ausschließlich mit wissenschaftlicher Forschung und Forschung in Verbindung gebracht Kryptographie Anwendungen. Da sich Multimedia jedoch weitgehend auf digitale Medien verlagert hat, ist der Bedarf an irgendeiner Form von SIMD in Allzweck-CPUs erheblich geworden. Kurz nachdem Gleitkomma-Ausführungseinheiten alltäglich wurden, um sie in Allzweckprozessoren aufzunehmen, begannen auch Spezifikationen für und Implementierungen von SIMD-Ausführungseinheiten für Allzweck-CPUs zu erscheinen. Einige dieser frühen SIMD-Spezifikationen wie Intels MMX waren nur Ganzzahlen. Dies erwies sich für einige Softwareentwickler als erhebliches Hindernis, da viele der Anwendungen, die von SIMD profitieren, hauptsächlich mit Gleitkommazahlen arbeiten. Nach und nach wurden diese frühen Designs verfeinert und in einige der gängigen, modernen SIMD-Spezifikationen umgestaltet, die normalerweise mit einer ISA verbunden sind. Einige bemerkenswerte moderne Beispiele sind Intels SSE und das PowerPC-bezogene AltiVec (auch bekannt als VMX).