Die Zentraleinheit (CPU), auch Zentralprozessor, Hauptprozessor oder einfach Prozessor genannt, fungiert als Hauptprozessor innerhalb eines Computersystems. Seine elektronischen Schaltkreise sind für die Ausführung von Anweisungen eines Computerprogramms verantwortlich und umfassen Operationen wie Arithmetik, Logik, Steuerung und Eingabe/Ausgabe (I/O). Diese Funktion unterscheidet die CPU von externen Elementen wie Hauptspeicher und E/A-Schaltkreisen sowie spezialisierten Coprozessoren wie Grafikprozessoren (GPUs).
Während sich Form, Design und Implementierung von Zentraleinheiten erheblich weiterentwickelt haben, sind ihre Kernbetriebsprinzipien weitgehend erhalten geblieben. Zu den Hauptbestandteilen einer CPU gehören die Arithmetik-Logik-Einheit (ALU), die arithmetische und logische Operationen ausführt; Prozessorregister, die der ALU Operanden bereitstellen und Operationsergebnisse speichern; und eine Steuereinheit, die das Abrufen, Dekodieren und Ausführen von Anweisungen verwaltet, indem sie die ALU, Register und andere interne Komponenten koordiniert. Heutige CPUs weisen erheblichen Halbleiterraum für Caches und Parallelität auf Befehlsebene zur Verbesserung der Leistung sowie für CPU-Modi zur Unterstützung von Betriebssystemen und Virtualisierungsfunktionen zu.
Die meisten modernen CPUs werden als Mikroprozessoren mit integrierten Schaltkreisen (IC) hergestellt, bei denen sich eine oder mehrere CPUs auf einem einzelnen IC-Chip befinden. Mikroprozessorchips mit mehreren CPUs werden als Multi-Core-Prozessoren (MCPs) bezeichnet. Diese unterschiedlichen physischen CPUs, die als Prozessorkerne bezeichnet werden, sind auch multithreadingfähig, um Multithreading auf CPU-Ebene zu ermöglichen.
Ein integrierter Schaltkreis (IC), der eine CPU beherbergt, kann zusätzlich Speicher, Peripherieschnittstellen und andere Computerkomponenten enthalten. Solche integrierten Geräte werden üblicherweise als Mikrocontroller oder System-on-Chip (SoCs) bezeichnet.
Verlauf
Frühe Rechenmaschinen, am Beispiel der ENIAC, erforderten eine physische Neuverkabelung für jede einzelne Aufgabe, was zu ihrer Klassifizierung als „Computer mit festem Programm“ führte. Die Bezeichnung „Zentraleinheit“ ist seit mindestens 1955 dokumentiert. Da „CPU“ typischerweise als Mechanismus zur Ausführung von Software (Computerprogrammen) definiert wird, entstanden die ersten Geräte, die zu Recht als CPUs bezeichnet werden, gleichzeitig mit der Entwicklung des Computers mit gespeicherten Programmen.
Das Konzept eines Computers mit gespeicherten Programmen war bereits im Entwurf für John Presper Eckert und John William Mauchlys ENIAC enthalten, wurde jedoch zunächst ausgeschlossen um die Fertigstellung zu beschleunigen. Am 30. Juni 1945, vor dem Bau des ENIAC, verteilte der Mathematiker John von Neumann ein Dokument mit dem Titel Erster Entwurf eines Berichts über das EDVAC. In diesem Artikel wurde die Architektur eines Computers mit gespeicherten Programmen detailliert beschrieben, der später im August 1949 fertiggestellt wurde. Der EDVAC wurde entwickelt, um einen vordefinierten Satz verschiedener Anweisungen oder Operationen auszuführen. Entscheidend war, dass die Programme für das EDVAC im Hochgeschwindigkeitsspeicher des Computers gespeichert werden sollten und nicht durch die physische Verkabelung der Maschine vorgegeben wurden. Diese Innovation behebt einen erheblichen Nachteil des ENIAC, nämlich den erheblichen Zeit- und Arbeitsaufwand, der für die Neukonfiguration für neue Aufgaben erforderlich ist. Von Neumanns Design ermöglichte eine Programmmodifikation für den EDVAC, indem einfach der Speicherinhalt geändert wurde. Allerdings war EDVAC nicht der bahnbrechende Computer mit gespeicherten Programmen; Der Manchester Baby, ein experimenteller kleiner Speicherprogrammcomputer, führte sein erstes Programm am 21. Juni 1948 aus, gefolgt vom Manchester Mark 1, der sein erstes Programm in der Nacht vom 16. auf den 17. Juni 1949 ausführte.
Ursprünglich waren CPUs maßgeschneiderte Komponenten, die in größere, oft einzigartige Computersysteme integriert wurden. Dennoch wurde dieser Ansatz, maßgeschneiderte CPUs für bestimmte Anwendungen zu entwickeln, weitgehend durch die Massenproduktion von Mehrzweckprozessoren abgelöst. Dieser Trend zur Standardisierung begann im Zeitalter der diskreten Transistor-Großrechner und Minicomputer und hat sich mit der weit verbreiteten Einführung integrierter Schaltkreise (IC) erheblich verstärkt. Der IC hat das Design und die Herstellung immer komplexerer CPUs mit Toleranzen im Nanometerbereich erleichtert. Die kombinierten Auswirkungen der CPU-Miniaturisierung und -Standardisierung haben die Allgegenwärtigkeit digitaler Geräte in der heutigen Gesellschaft erheblich erweitert und gehen weit über den begrenzten Bereich spezialisierter Computermaschinen hinaus. Moderne Mikroprozessoren sind heute in einem breiten Spektrum elektronischer Geräte zu finden, von Autos und Mobiltelefonen bis hin zu Freizeitartikeln wie Spielzeug.
Obwohl John von Neumann weithin für die Konzeption des Computers mit gespeicherten Programmen durch sein EDVAC-Design bekannt ist, das später als von Neumann-Architektur bekannt wurde, hatten frühere Innovatoren wie Konrad Zuse vergleichbare Konzepte vorgeschlagen und umgesetzt. Der Harvard Mark I, der vor EDVAC fertiggestellt wurde, verwendete ebenfalls eine Architektur mit gespeicherten Programmen, die als Harvard-Architektur bezeichnet wird, und nutzte Lochstreifen anstelle eines elektronischen Speichers. Ein grundlegender Unterschied zwischen diesen beiden Architekturen liegt in der Trennung von Speicher und Verarbeitung für CPU-Anweisungen und Daten in der Harvard-Architektur, im Gegensatz zur Verwendung eines einheitlichen Speicherraums für beide in der Von-Neumann-Architektur. Während die meisten modernen CPUs überwiegend dem von-Neumann-Design folgen, sind auch CPUs mit Harvard-Architektur weit verbreitet, insbesondere in eingebetteten Systemen, am Beispiel der AVR-Mikrocontroller von Atmel.
Vor dem Aufkommen des Transistors dienten Relais und Vakuumröhren (auch als thermionische Röhren bekannt) als primäre Schaltelemente in Computern, wobei funktionale Systeme Tausende oder Zehntausende solcher Geräte erforderten. Die Systemleistung korrelierte direkt mit der Betriebsgeschwindigkeit dieser Switches. Bei Vakuumröhrencomputern wie EDVAC kam es typischerweise etwa alle acht Stunden zu Ausfällen, wohingegen relaisbasierte Computer wie der langsamere, aber frühere Harvard Mark I eine deutlich höhere Zuverlässigkeit aufwiesen. Letztendlich gewannen röhrenbasierte Zentraleinheiten (CPUs) an Bedeutung, weil ihre erheblichen Geschwindigkeitsvorteile im Allgemeinen ihre inhärenten Zuverlässigkeitsprobleme übertrafen. Die meisten dieser frühen synchronen CPUs arbeiteten im Vergleich zu modernen mikroelektronischen Designs mit erheblich niedrigeren Taktraten, wobei die typischen Taktsignalfrequenzen zwischen 100 kHz und 4 MHz lagen, was hauptsächlich durch die Geschwindigkeitsbeschränkungen ihrer Schaltgeräte eingeschränkt wurde.
Transistorbasierte Zentraleinheiten
Die architektonische Komplexität von Zentraleinheiten (CPUs) nahm zunehmend zu, da der technologische Fortschritt die Entwicklung kompakterer und zuverlässigerer elektronischer Komponenten ermöglichte. Eine entscheidende Entwicklung auf diesem Weg war die Einführung des Transistors. Transistorisierte CPUs, die in den 1950er und 1960er Jahren auf den Markt kamen, machten umständliche, unzuverlässige und empfindliche Schaltelemente wie Vakuumröhren und Relais überflüssig. Diese Innovation ermöglichte den Bau komplizierterer und robusterer CPUs, die oft auf einer oder mehreren Leiterplatten unter Verwendung diskreter (einzelner) Komponenten integriert wurden.
Im Jahr 1964 stellte IBM seine System/360-Computerarchitektur vor, die einer Computerfamilie zugrunde lag, die in der Lage war, identische Programme mit unterschiedlichen Geschwindigkeiten und Leistungsstufen auszuführen. Dies stellte einen bedeutenden Durchbruch dar, da die meisten elektronischen Computer der damaligen Zeit, selbst diejenigen desselben Herstellers, weitgehend inkompatibel waren. Um diese Interoperabilität zu erreichen, implementierte IBM das Konzept eines Mikroprogramms, das häufig als „Mikrocode“ bezeichnet wird, eine Technik, die in modernen CPUs immer noch weit verbreitet ist. Die System/360-Architektur erlangte immense Popularität, dominierte jahrzehntelang den Großrechnermarkt und begründete ein bleibendes Erbe, das durch moderne Systeme wie die IBM zSeries fortgeschrieben wurde. Anschließend stellte die Digital Equipment Corporation (DEC) 1965 einen weiteren leistungsstarken Computer vor, den PDP-8, der speziell auf wissenschaftliche und Forschungsanwendungen ausgerichtet war.
Transistorbasierte Computer boten gegenüber ihren Vorgängern mehrere bemerkenswerte Vorteile. Neben der Verbesserung der Zuverlässigkeit und der Reduzierung des Stromverbrauchs ermöglichten Transistoren den CPUs aufgrund ihrer im Vergleich zu Vakuumröhren oder Relais von Natur aus kürzeren Schaltzeiten eine deutlich höhere Betriebsgeschwindigkeit. Die kombinierte Verbesserung der Zuverlässigkeit und die dramatisch erhöhte Geschwindigkeit dieser Schaltelemente, die zu diesem Zeitpunkt fast ausschließlich aus Transistoren bestanden, ermöglichten CPU-Taktraten im Bereich von mehreren zehn Megahertz. Gleichzeitig mit der weit verbreiteten Einführung von CPUs mit diskreten Transistoren und integrierten Schaltkreisen (IC) entstanden neuartige Hochleistungsarchitekturen, wie beispielsweise SIMD-Vektorprozessoren (Single Instruction, Multiple Data). Diese ersten experimentellen Entwürfe ebneten anschließend den Weg für die Entwicklung spezialisierter Supercomputer, wie beispielsweise die von Cray Inc und Fujitsu Ltd. hergestellten.
Kleine Integrations-Zentraleinheiten
In dieser Ära wurde ein Verfahren zur Herstellung zahlreicher miteinander verbundener Transistoren auf kompakter Grundfläche entwickelt. Der integrierte Schaltkreis (IC) ermöglichte die Herstellung einer beträchtlichen Anzahl von Transistoren auf einem einzelnen Halbleiterchip, der allgemein als „Chip“ bekannt ist. Zunächst wurden nur grundlegende, nicht spezialisierte digitale Schaltkreise wie NOR-Gatter in ICs miniaturisiert. Aus diesen grundlegenden „Baustein“-ICs aufgebaute Zentraleinheiten (CPUs) werden typischerweise als „Small-Scale-Integration“ (SSI)-Geräte kategorisiert. SSI-ICs, wie sie beispielsweise im Apollo Guidance Computer zum Einsatz kommen, enthielten typischerweise bis zu mehrere Dutzend Transistoren. Der Aufbau einer kompletten CPU aus SSI-ICs erforderte Tausende einzelner Chips, doch dieser Ansatz reduzierte den Platz- und Stromverbrauch im Vergleich zu früheren diskreten Transistorarchitekturen erheblich.
IBMs System/370, der Nachfolger des System/360, verwendete SSI-ICs anstelle der diskreten Transistormodule von Solid Logic Technology. In ähnlicher Weise wurden bei DECs PDP-8/I und KI10 PDP-10 die einzelnen Transistoren, die im PDP-8 und KA PDP-10 verwendet wurden, auf SSI-ICs umgestellt. Darüber hinaus wurden in der äußerst erfolgreichen PDP-11-Serie zunächst SSI-ICs eingesetzt, später jedoch auf LSI-Komponenten (Large-Scale Integration) umgestellt, als diese realisierbar wurden.
Groß angelegte Integration in CPUs
Lee Boysel ist Autor einflussreicher Veröffentlichungen, insbesondere eines „Manifests“ von 1967, in dem er den Aufbau eines 32-Bit-Großrechneräquivalents unter Verwendung einer vergleichsweise kleinen Anzahl von LSI-Schaltkreisen (Large-Scale Integration) detailliert beschreibt. Die ausschließliche Methode zur Herstellung von LSI-Chips, definiert als solche mit einhundert oder mehr Gates, umfasste die Verwendung eines Metall-Oxid-Halbleiter-(MOS)-Halbleiterherstellungsprozesses, der PMOS-, NMOS- oder CMOS-Logik umfasste. Dennoch beharrten einige Hersteller darauf, Prozessoren mit bipolaren Transistor-Transistor-Logik-Chips (TTL) zu entwickeln, da bipolare Sperrschichttransistoren bis in die 1970er Jahre eine höhere Geschwindigkeit im Vergleich zu MOS-Chips boten; Einige Unternehmen wie Datapoint setzten diese Praxis bis in die frühen 1980er Jahre fort. In den 1960er Jahren zeigten MOS-ICs eine langsamere Leistung und galten zunächst als vor allem für Anwendungen mit geringem Stromverbrauch geeignet. Nach der Entwicklung der Silizium-Gate-MOS-Technologie durch Federico Faggin bei Fairchild Semiconductor im Jahr 1968 lösten MOS-ICs in den späten 1970er Jahren überwiegend bipolares TTL als vorherrschende Chiptechnologie ab.
Mit dem Fortschritt der Mikroelektroniktechnologie wurde eine wachsende Anzahl von Transistoren in ICs integriert, wodurch die Anzahl der für eine komplette CPU erforderlichen diskreten ICs reduziert wurde. Medium-Scale-Integration- (MSI) und LSI-ICs erhöhten die Anzahl der Transistoren zunächst auf Hunderte und später auf Tausende. Bis 1968 war die erforderliche Anzahl an ICs für den Aufbau einer kompletten CPU auf 24 gesunken, bestehend aus acht verschiedenen Typen, wobei jeder IC etwa 1000 MOSFETs enthielt. Im deutlichen Gegensatz zu seinen SSI- und MSI-Vorgängern verfügte die erste LSI-Iteration des PDP-11 über eine CPU, die lediglich aus vier integrierten LSI-Schaltkreisen bestand.
Mikroprozessoren
Seit ihrer ersten Einführung haben Mikroprozessoren alle anderen Methoden zur Implementierung von Zentraleinheiten weitgehend verdrängt. Der erste kommerziell erhältliche Mikroprozessor, der 1971 eingeführt wurde, war der Intel 4004. Der Intel 4004 war eine der bahnbrechenden verbraucherorientierten CPUs, bei der die Arithmetik-Logik-Einheit, die Steuereinheit und die Registereinheit auf einem einzigen Chip integriert waren. Der erste weit verbreitete Mikroprozessor, der 1974 auf den Markt kam, war der Intel 8080. Gleichzeitig initiierten Hersteller von Großrechnern und Minicomputern proprietäre Entwicklungsprogramme für integrierte Schaltkreise, um ihre bestehenden Computerarchitekturen zu modernisieren, was letztendlich zu befehlssatzkompatiblen Mikroprozessoren führte, die die Abwärtskompatibilität mit ihrer alten Hardware und Software beibehielten. Im Zusammenhang mit dem Aufkommen und der anschließenden weiten Verbreitung des Personalcomputers ist die Bezeichnung CPU heute überwiegend Mikroprozessoren vorbehalten. Mehrere CPUs, sogenannte Kerne, können in einem einzigen Verarbeitungschip integriert werden.
Frühere Zentraleinheiten (CPUs) bestanden aus diskreten Komponenten und mehreren kleinen integrierten Schaltkreisen (ICs), die auf einer oder mehreren Leiterplatten verteilt waren. Im Gegensatz dazu stellen Mikroprozessoren CPUs dar, die auf einer minimalen Anzahl von ICs, typischerweise einem einzigen, hergestellt werden. Diese Reduzierung des CPU-Footprints, die durch die Single-Die-Implementierung erreicht wird, ermöglicht schnellere Schaltzeiten aufgrund physikalischer Eigenschaften wie einer verringerten parasitären Gate-Kapazität. Infolgedessen haben synchrone Mikroprozessoren Taktfrequenzen im Bereich von mehreren zehn Megahertz bis zu mehreren Gigahertz erreicht. Darüber hinaus hat die Fähigkeit, außergewöhnlich kleine Transistoren auf einem IC herzustellen, die Komplexität und Transistoranzahl innerhalb einer einzelnen CPU exponentiell erhöht. Dieser allgegenwärtige Trend wird durch das Mooresche Gesetz ausgedrückt, das die zunehmende Komplexität von CPUs und anderen ICs bis etwa 2016 genau vorhersagte.
Trotz erheblicher Veränderungen in der Komplexität, den physikalischen Abmessungen, den Konstruktionsmethoden und der Gesamtarchitektur von CPUs seit 1950 sind ihr grundlegendes Design und ihre Betriebsprinzipien weitgehend konsistent geblieben. Die überwiegende Mehrheit der heutigen CPUs wird genau als von Neumann-Architekturen mit gespeicherten Programmen charakterisiert. Mit dem Verlust der Vorhersagegenauigkeit des Mooreschen Gesetzes sind Befürchtungen hinsichtlich der inhärenten Grenzen der Transistortechnologie für integrierte Schaltkreise aufgekommen. Die tiefgreifende Miniaturisierung elektronischer Gatter verschärft die Auswirkungen von Phänomenen wie Elektromigration und Leckage unterhalb des Schwellenwerts. Diese aufkommenden Herausforderungen gehören zu den zahlreichen Treibern, die Forscher dazu zwingen, neuartige Rechenparadigmen, einschließlich Quantencomputing, zu erforschen und die Anwendung von Parallelität und anderen Strategien zu erweitern, die den Nutzen des klassischen von Neumann-Modells erhöhen.
Betriebsprinzipien
Unabhängig von ihrer physischen Erscheinungsform besteht die Kernfunktion der meisten Zentraleinheiten (CPUs) darin, eine vorgegebene Abfolge gespeicherter Anweisungen auszuführen, die zusammenfassend als Programm bezeichnet werden. Diese Anweisungen befinden sich in einer Art Computerspeicher. Praktisch alle CPUs folgen einer dreistufigen Betriebssequenz – Abrufen, Dekodieren und Ausführen – die zusammen den Befehlszyklus bilden.
Nach der Befehlsausführung wiederholt sich der Prozess, wobei der folgende Befehlszyklus aufgrund des inkrementierten Werts im Programmzähler normalerweise den nächsten sequenziellen Befehl abruft. Sollte ein Sprungbefehl ausgeführt werden, wird der Programmzähler neu konfiguriert, um die Adresse des Zielbefehls zu speichern, sodass die Programmausführung wie gewohnt fortgesetzt werden kann. Fortschrittliche CPUs sind in der Lage, mehrere Anweisungen gleichzeitig abzurufen, zu dekodieren und auszuführen. Diese Diskussion beschreibt die „klassische RISC-Pipeline“, eine vorherrschende Architektur in einfacheren CPUs, die häufig in zahlreichen elektronischen Geräten verwendet werden und oft als Mikrocontroller bezeichnet werden. Die kritische Funktion des CPU-Cache und damit die Zugriffsphase der Pipeline wird bewusst weggelassen.
Bestimmte Anweisungen ändern den Programmzähler direkt, anstatt Ausgabedaten zu generieren. Diese werden allgemein als „Sprünge“ bezeichnet und ermöglichen Programmierkonstrukte wie Schleifen, bedingte Ausführung (über bedingte Sprünge) und Funktionsaufrufe. Innerhalb bestimmter Prozessoren ändern andere Befehle die Bitzustände innerhalb eines „Flags“-Registers. Diese Flags dienen zur Modulation des Programmverhaltens, indem sie die Ergebnisse verschiedener Operationen signalisieren. In diesen Prozessoren bewertet beispielsweise ein „Vergleichs“-Befehl zwei Werte und setzt bzw. löscht anschließend Bits im Flag-Register, um deren relative Größe oder Gleichheit anzuzeigen; Eines dieser Flags kann dann von einem nachfolgenden Sprungbefehl verwendet werden, um den Programmablauf zu bestimmen.
Anweisungsabruf
Die Abrufphase beinhaltet das Abrufen einer Anweisung, die normalerweise als numerischer Wert oder Sequenz dargestellt wird, aus dem Programmspeicher. Die Speicheradresse des Befehls wird vom Programmzähler (PC) angegeben, der bei Intel x86-Mikroprozessoren als „Befehlszeiger“ bekannt ist und die Adresse des nachfolgenden Befehls enthält, der auf den Abruf wartet. Nach dem Befehlsabruf wird der PC um die Länge des Befehls erhöht, um auf die Adresse des nächsten Befehls in der Ausführungssequenz zu verweisen. Häufig kann das Abrufen von Anweisungen aus einem vergleichsweise langsamen Speicher zu CPU-Störungen führen, während auf den Datenabruf gewartet wird. Diese Herausforderung wird bei modernen Prozessoren überwiegend durch die Implementierung von Caches und Pipeline-Architekturen gemildert.
Anweisungsdekodierung
Die Aktionen der CPU werden durch die aus dem Speicher abgerufene Anweisung bestimmt. Während der Decodierungsphase übersetzt eine spezielle binäre Decoderschaltung, die als Befehlsdecoder bezeichnet wird, diese Anweisung in Steuersignale, die den Betrieb anderer CPU-Komponenten steuern.
Die Interpretation einer Anweisung wird durch die Befehlssatzarchitektur (ISA) der CPU gesteuert. Typischerweise bezeichnet eine bestimmte Bitgruppe oder ein „Feld“ innerhalb des Befehls, bekannt als Opcode, die auszuführende Operation. Gleichzeitig liefern andere Felder in der Regel zusätzliche für die Operation notwendige Daten, wie z. B. Operanden. Diese Operanden können entweder als Konstante (ein unmittelbarer Wert) oder als Ort definiert werden, bei dem es sich je nach angegebenem Adressierungsmodus um ein Prozessorregister oder eine Speicheradresse handeln kann.
Bestimmte CPU-Architekturen enthalten eine fest verdrahtete, unveränderliche binäre Decoderschaltung zur Befehlsdekodierung. Umgekehrt verwenden andere Designs ein Mikroprogramm, um Anweisungen in Sequenzen von CPU-Konfigurationssignalen zu übersetzen, die über aufeinanderfolgende Taktimpulse angewendet werden. In bestimmten Fällen ist der Speicher, in dem sich das Mikroprogramm befindet, wiederbeschreibbar, wodurch Änderungen an der Befehlsdecodierungsmethodik der CPU möglich sind.
Ausführungsphase
Nach den Abruf- und Dekodierungsphasen beginnt die Ausführungsphase. Diese Phase kann entweder eine einzelne Aktion oder eine Reihe von Aktionen umfassen, abhängig vom Architekturdesign der CPU. Für jede Aktion aktivieren oder deaktivieren Steuersignale bestimmte CPU-Komponenten elektronisch, sodass diese die gesamte oder einen Teil der beabsichtigten Operation ausführen können. Die Aktion endet typischerweise mit dem Empfang eines Taktimpulses. Häufig werden die Ergebnisse in einem internen CPU-Register gespeichert, um einen schnellen Abruf durch nachfolgende Anweisungen zu ermöglichen. Alternativ können die Ergebnisse in den Hauptspeicher geschrieben werden, der einen langsameren Zugriff bietet, aber wirtschaftlicher ist und über eine größere Kapazität verfügt.
Wenn beispielsweise ein Additionsbefehl ausgeführt wird, werden die Register, die die Operanden (die zu summierenden Zahlen) enthalten, zusammen mit den relevanten Abschnitten der Arithmetik-Logik-Einheit (ALU), die für die Addition verantwortlich sind, aktiviert. Bei Auftreten eines Taktimpulses werden die Operanden aus ihren Quellregistern zur ALU übertragen und an deren Ausgang die resultierende Summe erzeugt. Nachfolgende Taktimpulse erleichtern die Aktivierung und Deaktivierung anderer Komponenten, um die Ausgabe (die Summe der Operation) an einen bestimmten Speicherort, beispielsweise ein Register oder einen Speicher, zu übertragen. Sollte die berechnete Summe die Ausgabewortgröße der ALU überschreiten, wird ein arithmetisches Überlaufflag gesetzt, das sich anschließend auf die nächste Operation auswirkt.
Architektonisches Design und Implementierung
Die grundlegenden Operationen, die eine CPU ausführen kann, sind in ihren Schaltkreisen eingebettet und bilden zusammen einen Befehlssatz. Diese Operationen umfassen Aufgaben wie arithmetische Addition oder Subtraktion, numerische Vergleiche oder Programmflusskontrolle (z. B. Springen zu einem anderen Codesegment). Jede Anweisung wird durch ein bestimmtes Bitmuster, das als Maschinensprache-Opcode bezeichnet wird, eindeutig codiert. Während der Befehlsverarbeitung verwendet die CPU einen binären Decoder, um den Opcode in Steuersignale zu übersetzen, die anschließend die internen Funktionen der CPU koordinieren. Ein umfassender Befehl in Maschinensprache umfasst typischerweise einen Opcode zusammen mit zusätzlichen Bits, die die Argumente der Operation definieren (z. B. die Werte, die in einem Additionsbefehl hinzugefügt werden sollen). Auf einer höheren Abstraktionsebene stellt ein Maschinensprachenprogramm eine geordnete Folge von Maschinensprachenanweisungen dar, die von der CPU ausgeführt werden.
Die mathematischen Kernoperationen für jede Anweisung werden von einer kombinatorischen Logikschaltung ausgeführt, die sich im Prozessor der CPU befindet und als Arithmetik-Logik-Einheit (ALU) bezeichnet wird. Normalerweise verarbeitet eine CPU eine Anweisung, indem sie sie aus dem Speicher abruft, ihre ALU verwendet, um die angegebene Operation auszuführen, und anschließend das Ergebnis wieder in den Speicher zurückschreibt. Neben Anweisungen für ganzzahlige Arithmetik und logische Operationen gibt es eine Vielzahl weiterer Maschinenanweisungen, darunter solche für die Datenübertragung (Laden aus und Speichern im Speicher), bedingte Verzweigungen und Gleitkommaarithmetik, die von der Gleitkommaeinheit (FPU) der CPU verarbeitet werden.
Die Steuereinheit
Die Steuereinheit (CU) ist eine integrale CPU-Komponente, die für die Orchestrierung der Prozessorvorgänge verantwortlich ist. Es gibt Anweisungen an den Speicher, die Rechen- und Logikeinheit sowie die Eingabe-/Ausgabegeräte des Computers und weist diese an, wie sie auf die an den Prozessor übermittelten Befehle reagieren sollen.
Die Steuereinheit (CU) orchestriert den Betrieb anderer Komponenten durch die Erzeugung von Zeit- und Steuersignalen. Es verwaltet den Großteil der Computerressourcen und steuert den Datenfluss zwischen der Zentraleinheit (CPU) und Peripheriegeräten. John von Neumann integrierte die Steuereinheit als grundlegendes Element der von Neumann-Architektur. In modernen Computerdesigns ist die Steuereinheit typischerweise in die CPU integriert und behält ihre wesentlichen Funktionen und Betriebsprinzipien seit ihrer Einführung bei.
Arithmetische Logikeinheit
Die Arithmetik-Logik-Einheit (ALU) stellt eine im Prozessor eingebettete digitale Schaltung dar, die für die Ausführung ganzzahliger arithmetischer und bitweiser Logikoperationen verantwortlich ist. Zu den Eingängen der ALU gehören die zur Verarbeitung vorgesehenen Datenwörter (als Operanden bezeichnet), Statusdaten aus vorangegangenen Vorgängen und ein von der Steuereinheit bereitgestellter Betriebscode. Der Ursprung dieser Operanden variiert je nach ausgeführtem Befehl und stammt möglicherweise aus internen CPU-Registern, externem Speicher oder intern von der ALU generierten Konstanten.
Nach der Stabilisierung und Ausbreitung aller Eingangssignale durch die ALU-Schaltung wird das Ergebnis der ausgeführten Operation an den Ausgängen der ALU verfügbar. Dieses Ergebnis umfasst sowohl ein Datenwort, das anschließend in einem Register oder Speicher gespeichert werden kann, als auch Statusinformationen, die normalerweise in einem dedizierten internen CPU-Register gespeichert werden.
Moderne Zentraleinheiten (CPUs) enthalten häufig mehrere Arithmetik-Logik-Einheiten (ALUs), um die Rechenleistung zu verbessern.
Adressgenerierungseinheit
Die Adressgenerierungseinheit (AGU), auch bekannt als Adressberechnungseinheit (ACU), ist eine Ausführungskomponente innerhalb der Zentraleinheit (CPU), die für die Berechnung der Speicheradressen verantwortlich ist, die für den Zugriff auf den Hauptspeicher erforderlich sind. Das Delegieren von Adressberechnungen an dedizierte Schaltkreise, die gleichzeitig mit anderen CPU-Funktionen arbeiten, reduziert die Anzahl der CPU-Zyklen, die für die Ausführung von Maschinenanweisungen erforderlich sind, und führt so zu Leistungssteigerungen.
Während verschiedener Betriebsprozesse müssen CPUs Speicheradressen berechnen, um Daten aus dem Speicher abzurufen. Beispielsweise erfordern die Speicherorte von Array-Elementen eine Berechnung vor dem Datenabruf von ihren physischen Speicheradressen. Diese Berechnungen zur Adressgenerierung umfassen verschiedene ganzzahlige arithmetische Operationen, einschließlich Addition, Subtraktion, Modulo-Operationen und Bitverschiebungen. Häufig erfordert die Bestimmung einer Speicheradresse mehrere allgemeine Maschinenanweisungen, die möglicherweise nicht effizient dekodiert und ausgeführt werden. Die Integration einer AGU in eine CPU-Architektur ermöglicht zusammen mit speziellen Anweisungen, die die AGU nutzen, die Auslagerung zahlreicher Adressgenerierungsberechnungen von der Haupt-CPU, was häufig deren schnelle Ausführung innerhalb eines einzigen CPU-Zyklus erleichtert.
Die Funktionalitäten einer AGU hängen von der spezifischen CPU und ihrem Architekturdesign ab. Folglich implementieren und bieten bestimmte AGUs ein breiteres Spektrum an Adressberechnungsoperationen, während andere anspruchsvollere Spezialanweisungen enthalten, die mehrere Operanden gleichzeitig verarbeiten können. Einige CPU-Architekturen verfügen über mehrere AGUs, die die gleichzeitige Ausführung mehrerer Adressberechnungsvorgänge ermöglichen, wodurch zusätzliche Leistungssteigerungen erzielt werden, die auf die superskalaren Eigenschaften fortschrittlicher CPU-Designs zurückzuführen sind. Intel integriert beispielsweise mehrere AGUs in seine Mikroarchitekturen Sandy Bridge und Haswell und erhöht so die Bandbreite des CPU-Speichersubsystems, indem es die parallele Ausführung mehrerer Speicherzugriffsanweisungen erleichtert.
Memory Management Unit (MMU)
Zahlreiche Mikroprozessoren, die in Geräten wie Smartphones, Desktop-Computern, Laptops und Servern zu finden sind, verfügen über eine Speicherverwaltungseinheit (Memory Management Unit, MMU). Diese Einheit übersetzt logische Adressen in physische RAM-Adressen und bietet gleichzeitig Speicherschutz und Paging-Funktionen, die für die Implementierung des virtuellen Speichers unerlässlich sind. Obwohl die MMU typischerweise in den Prozessor integriert ist, kann sie sich gelegentlich auch in einem separaten integrierten Schaltkreis (IC) befinden. Einfachere Prozessoren, insbesondere Mikrocontroller, enthalten im Allgemeinen keine MMU.
Cache
Ein CPU-Cache ist ein Speicher, der von der Zentraleinheit (CPU) eines Computers genutzt wird, um die durchschnittliche Latenz und den Energieverbrauch beim Zugriff auf Daten aus dem Hauptspeicher zu minimieren. Ein Cache ist ein kompakter Hochgeschwindigkeitsspeicher, der sich in der Nähe eines Prozessorkerns befindet und Duplikate häufig aufgerufener Daten im Hauptspeicher speichert. Die meisten CPUs verfügen über mehrere unterschiedliche Caches, die typischerweise hierarchisch in mehrere Ebenen (L1, L2, L3, L4 usw.) strukturiert sind. Aufeinanderfolgende Cache-Ebenen in dieser Hierarchie zeichnen sich im Allgemeinen durch eine höhere Kapazität, aber eine geringere Geschwindigkeit im Vergleich zu ihren Vorgängern aus, wobei L1 die schnellste und der CPU am nächsten gelegene Ebene darstellt. Die L1-Ebene umfasst üblicherweise getrennte Caches für Anweisungen und Daten.
Moderne Hochleistungs-Zentraleinheiten (CPUs) verfügen bis auf wenige spezielle Ausnahmen über mehrere hierarchische Ebenen des Cache-Speichers. Erste CPU-Implementierungen mit Cache-Speicher nutzten eine einzelne Cache-Ebene, die im Gegensatz zu späteren L1-Caches nicht in verschiedene L1d- (Daten) und L1i- (Anweisungen) Komponenten aufgeteilt war. Praktisch alle aktuellen CPUs, die mit Caches ausgestattet sind, verwenden eine geteilte L1-Cache-Architektur. Diese Prozessoren verfügen in der Regel auch über L2-Caches, wobei größere Prozessoren zusätzlich über L3-Caches verfügen. Der L2-Cache ist im Allgemeinen einheitlich (ungeteilt) und fungiert als gemeinsames Repository für die Daten aus dem geteilten L1-Cache. Innerhalb eines Mehrkernprozessors verfügt jeder Kern über einen dedizierten L2-Cache, der normalerweise nicht von anderen Kernen gemeinsam genutzt wird. Umgekehrt werden L3-Caches und alle nachfolgenden Caches höherer Ebenen von mehreren Kernen gemeinsam genutzt und bleiben ungeteilt. Der L4-Cache ist derzeit ungewöhnlich und wird normalerweise mithilfe eines dynamischen Direktzugriffsspeichers (DRAM) anstelle eines statischen Direktzugriffsspeichers (SRAM) implementiert, der sich häufig auf einem bestimmten Chip oder Chip befindet. Historisch gesehen galt eine ähnliche externe Platzierung für L1-Caches; Fortschritte in der Chipherstellung haben jedoch die Integration von L1 und den meisten anderen Cache-Ebenen auf dem Hauptprozessor-Chip ermöglicht, möglicherweise mit Ausnahme des Caches der höchsten Ebene. Jede zusätzliche Cache-Ebene zeichnet sich im Allgemeinen durch eine erhöhte Kapazität und unterschiedliche Optimierungsstrategien aus.
Über die primäre Cache-Hierarchie hinaus gibt es andere spezialisierte Cache-Typen, die normalerweise nicht in der aggregierten „Cache-Größe“-Metrik der oben genannten Haupt-Caches enthalten sind. Ein Beispiel ist der Translation Lookaside Buffer (TLB), eine integrale Komponente der Memory Management Unit (MMU), die in den meisten CPUs zu finden ist.
Cache-Kapazitäten werden normalerweise in Zweierpotenzen dimensioniert, z. B. 2, 8 oder 16 KiB oder MiB für größere Nicht-L1-Caches. Es gibt jedoch Ausnahmen, wie zum Beispiel der IBM z13, der über einen 96 KiB großen L1-Befehlscache verfügt.
Taktrate
Die meisten Zentraleinheiten arbeiten als synchrone Schaltkreise und nutzen ein Taktsignal, um ihre sequentiellen Abläufe zu regeln. Dieses Taktsignal stammt von einer externen Oszillatorschaltung, die eine konstante Anzahl von Impulsen pro Sekunde erzeugt und sich als periodische Rechteckwelle manifestiert. Die Frequenz dieser Taktimpulse bestimmt die Befehlsausführungsrate der CPU; Folglich ermöglicht eine höhere Taktfrequenz der CPU, eine größere Anzahl von Anweisungen pro Sekunde zu verarbeiten.
Damit die CPU ordnungsgemäß funktioniert, muss die Taktperiode die maximale Dauer überschreiten, die für die Ausbreitung aller internen Signale im gesamten Gerät erforderlich ist. Durch die Festlegung einer Taktperiode, die deutlich größer ist als die Ausbreitungsverzögerung im ungünstigsten Fall, können Entwickler den gesamten CPU-Betrieb und die Datenbewegung mit den steigenden und abfallenden Flanken des Taktsignals synchronisieren. Dieser Ansatz bietet den wesentlichen Vorteil, dass er das CPU-Design vereinfacht und die Komponentenkomplexität verringert. Ein Nachteil besteht jedoch darin, dass die gesamte CPU durch ihre langsamsten Komponenten eingeschränkt wird, selbst wenn andere Abschnitte mit deutlich höheren Geschwindigkeiten arbeiten. Diese inhärente Einschränkung wurde durch die Implementierung verschiedener Techniken zur Verbesserung der CPU-Parallelität weitgehend gemildert.
Dennoch können architektonische Fortschritte allein nicht alle inhärenten Nachteile global synchroner CPUs vollständig beseitigen. Beispielsweise ist ein Taktsignal wie jedes andere elektrische Signal anfällig für Ausbreitungsverzögerungen. Erhöhte Taktraten in immer komplexeren CPUs verschärfen die Herausforderung, die Phasensynchronisation des Taktsignals in der gesamten Verarbeitungseinheit aufrechtzuerhalten. Folglich erfordern zahlreiche moderne CPUs die Bereitstellung mehrerer identischer Taktsignale, um erhebliche Verzögerungen in einem einzelnen Signal zu verhindern, die zu Fehlfunktionen der CPU führen könnten. Ein weiteres erhebliches Problem, insbesondere bei erheblichen Steigerungen der Taktraten, ist die zunehmende Wärmeableitung, die von der CPU erzeugt wird. Das kontinuierliche Umschalten des Taktsignals zwingt zahlreiche Komponenten dazu, unabhängig von ihrer aktiven Nutzung den Zustand zu wechseln. Typischerweise verbraucht eine Schaltkomponente im statischen Zustand mehr Energie als eine solche. Daher korreliert eine Erhöhung der Taktrate direkt mit einem höheren Energieverbrauch und erfordert daher robustere Wärmeableitungsmechanismen, häufig in Form spezieller CPU-Kühllösungen.
Eine Technik zur Verwaltung der Aktivierung überflüssiger Komponenten ist das Clock-Gating, bei dem das an diese Komponenten gelieferte Taktsignal deaktiviert und dadurch funktionsunfähig gemacht wird. Dennoch wird seine Implementierung häufig als schwierig angesehen, was seine weitverbreitete Anwendung auf spezielle Designs mit geringem Stromverbrauch beschränkt. Ein prominentes Beispiel für eine umfassende Clock-Gating-Anwendung ist die IBM PowerPC-basierte Xenon-CPU in der Xbox 360, die erheblich zur Reduzierung des Stromverbrauchs der Konsole beiträgt.
Taktlose CPUs
Ein alternativer Ansatz zur Minderung von Problemen im Zusammenhang mit einem globalen Taktsignal besteht darin, es vollständig zu eliminieren. Obwohl das Fehlen eines globalen Taktsignals die Designkomplexität erheblich erhöht, bieten asynchrone (oder taktlose) Architekturen im Vergleich zu ihren synchronen Gegenstücken deutliche Vorteile hinsichtlich Stromverbrauch und Wärmemanagement. Trotz ihrer relativen Seltenheit wurden vollständige asynchrone Zentraleinheiten entwickelt, die nicht auf ein globales Taktsignal angewiesen sind. Beispielhafte Beispiele hierfür sind das ARM-kompatible AMULET und das MIPS R3000-kompatible MiniMIPS.
Anstatt das Taktsignal vollständig zu eliminieren, integrieren bestimmte CPU-Architekturen asynchrone Elemente innerhalb bestimmter Geräteabschnitte. Beispielsweise kann die Integration asynchroner arithmetischer Logikeinheiten (ALUs) mit superskalarem Pipelining zu Verbesserungen der Rechenleistung führen. Während die allgemeine Leistungsgleichheit oder Überlegenheit vollständig asynchroner Designs im Vergleich zu synchronen Designs weiterhin Gegenstand laufender Untersuchungen ist, zeigen sie nachweislich Kompetenz in weniger komplexen mathematischen Berechnungen. Diese Eigenschaft, gepaart mit ihrer überlegenen Energieeffizienz und Wärmeableitung, macht sie hervorragend für Embedded-Computing-Anwendungen geeignet.
Spannungsreglermodul
Moderne Zentraleinheiten verfügen häufig über ein im Chip integriertes Energieverwaltungsmodul. Dieses Modul regelt dynamisch die Spannungsversorgung der CPU-Schaltkreise und optimiert so das Gleichgewicht zwischen Betriebsleistung und Stromverbrauch.
Ganzzahlbereich
Jede Zentraleinheit verwendet eine eigene Methodik zur Darstellung numerischer Werte. Historisch gesehen verwendeten einige frühe digitale Computersysteme bekannte dezimale (Basis 10) Zahlensystemwerte, während andere weniger konventionelle Darstellungen übernahmen, einschließlich biquinär codierter Dezimalzahlen (Basis 2–5) oder ternärer Zahlensysteme (Basis 3). Derzeit stellt die überwiegende Mehrheit moderner CPUs Zahlen im Binärformat dar, wobei jede Ziffer einem zweiwertigen physikalischen Zustand entspricht, beispielsweise einer „hohen“ oder „niedrigen“ Spannung.
Die Größe und Genauigkeit der von einer CPU darstellbaren Ganzzahlen sind untrennbar mit ihrem numerischen Darstellungsschema verknüpft. Bei einer binären CPU wird diese Eigenschaft durch die Anzahl der Bits (die die signifikanten Ziffern einer binär codierten Ganzzahl sind) quantifiziert, die die CPU innerhalb einer einzelnen Operation verarbeiten kann. Diese Metrik wird häufig als Wortgröße, Bitbreite, Datenpfadbreite, Ganzzahlgenauigkeit oder Ganzzahlgröße bezeichnet. Die ganzzahlige Größe einer CPU bestimmt das Spektrum der ganzzahligen Werte, auf denen sie Operationen direkt ausführen kann. Beispielsweise ist eine 8-Bit-CPU in der Lage, durch acht Bits dargestellte Ganzzahlen direkt zu manipulieren, was einen Bereich von 256 (2§1011§) unterschiedlichen Ganzzahlwerten umfasst.
Der Ganzzahlbereich beeinflusst auch die Anzahl der Speicherorte, die eine CPU direkt adressieren kann, wobei eine Adresse einen ganzzahligen Wert darstellt, der einen bestimmten Speicherort bezeichnet. Wenn eine binäre CPU beispielsweise 32 Bit zur Darstellung einer Speicheradresse verwendet, kann sie direkt auf 232 verschiedene Speicherorte zugreifen. Um diese inhärente Einschränkung zu überwinden, implementieren bestimmte CPUs unter anderem Mechanismen wie Speicherverwaltung oder Bankwechsel, die die Adressierung erweiterter Speicherkapazitäten erleichtern.
CPUs mit größeren Wortgrößen erfordern mehr Schaltkreise, was zu größeren physischen Abmessungen, höheren Herstellungskosten und einem höheren Stromverbrauch führt, was wiederum mehr Wärme erzeugt. Folglich werden trotz der Verfügbarkeit von CPUs mit deutlich größeren Wortgrößen (z. B. 16, 32, 64 oder sogar 128 Bit) häufig kompakte 4- oder 8-Bit-Mikrocontroller in modernen Anwendungen eingesetzt. Dennoch können in Szenarien, die eine höhere Leistung erfordern, die Vorteile einer erweiterten Wortgröße, wie beispielsweise breitere Datenbereiche und größere Adressräume, diese Nachteile überwiegen. Um Größe und Kosten zu verringern, kann eine CPU interne Datenpfade enthalten, die schmaler als ihre nominale Wortgröße sind. Obwohl beispielsweise die IBM System/360-Befehlssatzarchitektur eine 32-Bit-Architektur war, verfügten die System/360-Modelle 30 und 40 über 8-Bit-Datenpfade innerhalb ihrer arithmetischen Logikeinheiten, was vier Zyklen für eine 32-Bit-Addition erforderte, wobei jeder Zyklus 8 Bits der Operanden verarbeitete. Auch wenn der Befehlssatz der Serie Motorola 68000 32 Bit lang war, verwendeten Motorola 68000 und Motorola 68010 in ihren Arithmetik-Logik-Einheiten 16-Bit-Datenpfade, sodass für eine 32-Bit-Addition zwei Zyklen erforderlich waren.
Um die mit kürzeren und längeren Bitlängen verbundenen Vorteile zu nutzen, verwenden zahlreiche Befehlssätze unterschiedliche Bitbreiten für Ganzzahl- und Gleitkommadaten. Dieser Designansatz ermöglicht es CPUs, die solche Befehlssätze implementieren, über unterschiedliche Bitbreiten über verschiedene interne Komponenten hinweg zu verfügen. Beispielsweise umfasste der IBM System/360-Befehlssatz, obwohl überwiegend 32-Bit, Unterstützung für 64-Bit-Gleitkommawerte, um die Präzision und den Bereich numerischer Berechnungen zu verbessern. Insbesondere enthielt das System/360-Modell 65 einen 8-Bit-Addierer für Dezimal- und Festkomma-Binäroperationen sowie einen 60-Bit-Addierer für Gleitkomma-Arithmetik. Nachfolgende CPU-Architekturen übernehmen häufig ähnliche Strategien mit gemischten Bitbreiten, insbesondere bei Allzweckprozessoren, bei denen ein optimales Gleichgewicht zwischen Ganzzahl- und Gleitkomma-Verarbeitungsfunktionen unerlässlich ist.
Parallelität
Im vorherigen Abschnitt wurden die grundlegenden Funktionsprinzipien einer CPU detailliert beschrieben und ihre rudimentärste Konfiguration veranschaulicht. Diese CPU-Architektur, die allgemein als subskalar bezeichnet wird, verarbeitet und führt einen einzelnen Befehl für ein oder zwei Datenelemente gleichzeitig aus, was zu einer Leistungsmetrik von weniger als einem Befehl pro Taktzyklus führt (IPC < 1).
Dieses Betriebsparadigma führt zwangsläufig zu Ineffizienzen bei subskalaren CPUs. Da immer nur ein Befehl ausgeführt wird, muss die gesamte CPU warten, bis der aktuelle Befehl abgeschlossen ist, bevor der nächste Befehl initiiert wird. Folglich kommt es bei subskalaren CPUs zu Verzögerungen, wenn sie auf Befehle stoßen, deren Ausführung mehrere Taktzyklen erfordert. Selbst die Integration einer zusätzlichen Ausführungseinheit bringt keine wesentliche Leistungssteigerung; Anstelle eines einzelnen blockierten Pfads werden zwei Pfade blockiert, was zu einer Zunahme ungenutzter Transistoren führt. Dieses Architekturdesign, bei dem die Ausführungsressourcen der CPU auf die Verarbeitung jeweils einer Anweisung beschränkt sind, kann theoretisch eine maximale skalare Leistung erreichen, definiert als eine Anweisung pro Taktzyklus (IPC = 1). Allerdings bleibt die tatsächliche Leistung typischerweise subskalar, was bedeutet, dass weniger als ein Befehl pro Taktzyklus (IPC < 1) ausgeführt wird.
Bemühungen, skalare oder bessere Leistung zu erreichen, haben zur Entwicklung verschiedener Entwurfsmethoden geführt, die einen weniger linearen und mehr parallelen CPU-Betrieb fördern. Im Kontext der CPU-Parallelität werden üblicherweise zwei Hauptbegriffe zur Kategorisierung dieser Entwurfstechniken verwendet:
- Parallelität auf Befehlsebene (ILP) zielt darauf ab, die Geschwindigkeit der Befehlsausführung innerhalb einer CPU zu beschleunigen und dadurch die Nutzung der On-Die-Ausführungsressourcen zu maximieren.
- Parallelität auf Aufgabenebene (TLP) soll die Anzahl der Threads oder Prozesse erhöhen, die eine CPU gleichzeitig ausführen kann.
Jede Methodik weist unterschiedliche Implementierungsansätze auf und bietet unterschiedliche Wirksamkeitsgrade bei der Verbesserung der CPU-Leistung für bestimmte Anwendungen.
Parallelität auf Befehlsebene
Ein grundlegender Ansatz zur Verbesserung der Rechenparallelität besteht darin, die Anfangsphasen des Befehlsabrufs und der Befehlsdekodierung einzuleiten, bevor die Ausführung des vorherigen Befehls abgeschlossen ist. Diese als Instruktions-Pipelining bezeichnete Methode wird in nahezu allen modernen Allzweck-Zentraleinheiten (CPUs) allgegenwärtig eingesetzt. Pipelining erleichtert die gleichzeitige Ausführung mehrerer Anweisungen, indem der Ausführungspfad in verschiedene, aufeinanderfolgende Phasen segmentiert wird. Diese Architekturzerlegung ähnelt einem Fließband, bei dem jede Anweisung aufeinanderfolgende Phasen durchläuft und immer vollständiger wird, bis sie die Ausführungspipeline verlässt und außer Betrieb gesetzt wird.
Pipelining birgt jedoch grundsätzlich die Möglichkeit von Datenabhängigkeitskonflikten, einem Szenario, bei dem das Ergebnis einer vorherigen Operation für den Abschluss einer nachfolgenden Operation erforderlich ist. Folglich sind Pipeline-Prozessoren so konstruiert, dass sie solche Bedingungen erkennen und bei Bedarf Verzögerungen innerhalb bestimmter Segmente der Pipeline einführen. Ein Pipeline-Prozessor kann Leistungsniveaus erreichen, die denen eines Skalarprozessors nahekommen, wobei seine Effizienz hauptsächlich durch Pipeline-Störungen eingeschränkt wird, die auftreten, wenn ein Befehl eine Stufe länger als einen einzelnen Taktzyklus belegt.
Fortschritte beim Befehls-Pipelining haben die Leerlaufzeiten von CPU-Komponenten zunehmend verkürzt. Superskalare Architekturen zeichnen sich durch erweiterte Befehlspipelines und die Integration mehrerer identischer Ausführungseinheiten aus, darunter Komponenten wie Lade-Speicher-Einheiten, Arithmetik-Logik-Einheiten, Gleitkommaeinheiten und Adressgenerierungseinheiten. Innerhalb einer superskalaren Pipeline werden Anweisungen abgerufen und an einen Dispatcher weitergeleitet, der ihr Potenzial für die parallele (gleichzeitige) Ausführung bestimmt. Wenn eine parallele Ausführung möglich ist, werden die Anweisungen dann an die entsprechenden Ausführungseinheiten weitergeleitet, was zu ihrer gleichzeitigen Verarbeitung führt. Grundsätzlich steht der Durchsatz einer superskalaren CPU, gemessen an der Anzahl der pro Zyklus abgeschlossenen Befehle, in direktem Zusammenhang mit ihrer Fähigkeit, Befehle gleichzeitig an diese Ausführungseinheiten zu senden.
Eine wesentliche Herausforderung beim Entwurf superskalarer CPU-Architekturen liegt in der Entwicklung eines effizienten Dispatchers. Diese Komponente muss schnell die parallele Ausführbarkeit von Anweisungen ermitteln und diese anschließend versenden, um die Nutzung der verfügbaren Ausführungseinheiten zu maximieren. Um dies zu erreichen, ist ein häufiges Auffüllen der Befehlspipeline und erhebliche CPU-Cache-Ressourcen erforderlich. Darüber hinaus werden Strategien zur Gefahrenvermeidung, einschließlich Verzweigungsvorhersage, spekulativer Ausführung, Registerumbenennung, Ausführung außerhalb der Reihenfolge und Transaktionsspeicher, für die Aufrechterhaltung hoher Leistungsniveaus unverzichtbar. Durch die Vorhersage des wahrscheinlichen Verzweigungspfads für bedingte Anweisungen kann die CPU die Fälle erheblich reduzieren, in denen die gesamte Pipeline in Erwartung des Abschlusses einer bedingten Operation stehen bleiben muss. Die spekulative Ausführung führt in der Regel zu moderaten Leistungssteigerungen, indem Codesegmente ausgeführt werden, die nach einer bedingten Operation letztendlich unnötig sein könnten. Bei der Ausführung außerhalb der Reihenfolge wird die Befehlsausführung dynamisch neu angeordnet, um Verzögerungen aufgrund von Datenabhängigkeiten zu verringern. Darüber hinaus können moderne Prozessoren in Szenarien, in denen ein einzelner Befehlsstrom mehrere Datenströme bearbeitet – insbesondere bei der Verarbeitung großer Mengen homogener Daten –, Pipeline-Segmente selektiv deaktivieren. Dies ermöglicht es der CPU, die Abruf- und Dekodierungsphasen zu umgehen, wenn ein einzelner Befehl wiederholt ausgeführt wird, wodurch die Leistung in bestimmten Kontexten erheblich verbessert wird, insbesondere in stark repetitiven Rechenmaschinen wie Videoerstellungs- und Fotoverarbeitungssoftware.
Wenn nur eine Teilmenge der Komponenten einer CPU superskalare Fähigkeiten aufweist, entsteht für die nicht superskalaren Teile ein Leistungsaufwand, der auf Planungsverzögerungen zurückzuführen ist. Beispielsweise verfügte der Intel P5 Pentium über zwei superskalare Arithmetik-Logik-Einheiten (ALUs), die jeweils einen Befehl pro Taktzyklus annehmen konnten, der Gleitkommaeinheit (FPU) fehlte diese Fähigkeit jedoch. Folglich wurde der P5 als ganzzahlig-superskalar, aber nicht als Gleitkomma-superskalar charakterisiert. Intels nachfolgende P6-Architektur erweiterte die superskalare Funktionalität auf seine Gleitkommaoperationen.
Pipelining und superskalare Architekturen verbessern die Instruction-Level Parallelism (ILP) einer CPU, indem sie die Ausführung mehrerer Anweisungen pro Taktzyklus ermöglichen. Heutige CPU-Designs beinhalten häufig superskalare Fähigkeiten, wobei praktisch alle im letzten Jahrzehnt entwickelten Allzweckprozessoren über diese Architektureigenschaft verfügen. Anschließend verlagerte sich der Schwerpunkt bei der Entwicklung von Computersystemen mit hohem ILP von CPU-Hardwareimplementierungen auf die Softwareschnittstelle, insbesondere die Befehlssatzarchitektur (ISA). Der Very Long Instruction Word (VLIW)-Ansatz bettet ein gewisses Maß an ILP in die Software ein, wodurch die Belastung der CPU durch Maximierung des ILP verringert und ihr Design vereinfacht wird.
Parallelität auf Aufgabenebene
Ein alternativer Ansatz zur Verbesserung der Rechenleistung umfasst die gleichzeitige Ausführung mehrerer Threads oder Prozesse. Dieser Studienbereich wird als paralleles Rechnen bezeichnet. Innerhalb der Taxonomie von Flynn wird diese Methodik als Multiple Instruction, Multiple Data (MIMD) kategorisiert.
Multiprocessing (MP) stellt eine Schlüsseltechnologie dar, die für dieses Ziel eingesetzt wird. Die Grundform dieser Technologie ist Symmetric Multiprocessing (SMP), das durch eine begrenzte Anzahl von Zentraleinheiten (CPUs) gekennzeichnet ist, die eine einheitliche und kohärente Speicheransicht teilen. Dieses Architekturdesign beinhaltet dedizierte Hardware in jeder CPU, um eine kontinuierliche Speicherkohärenz sicherzustellen. Die Verhinderung veralteter Speicherzustände erleichtert die CPU-Zusammenarbeit bei gemeinsam genutzten Programmen und ermöglicht die Programmmigration über verschiedene CPUs hinweg. Um die Anzahl der kooperierenden CPUs über eine bescheidene Zahl hinaus zu erhöhen, wurden in den 1990er Jahren Non-Uniform Memory Access (NUMA) und verzeichnisbasierte Kohärenzprotokolle entwickelt. Während SMP-Architekturen auf eine begrenzte Anzahl von CPUs beschränkt sind, wurden NUMA-Systeme erfolgreich mit Tausenden von Prozessoren implementiert. In der Vergangenheit wurden Multiprozessorsysteme mit unterschiedlichen CPUs und separaten Leiterplatten aufgebaut, um die Konnektivität zwischen Prozessoren herzustellen. Die Integration von Prozessoren und ihrer Verbindung auf einem einzigen Siliziumchip definiert das Chip-Level-Multiprocessing (CMP), wobei der resultierende einzelne Chip als Mehrkernprozessor bezeichnet wird.
Spätere Weiterentwicklungen zeigten das Vorhandensein einer feinkörnigeren Parallelität innerhalb einzelner Programme. Ein einzelnes Programm kann mehrere Threads oder Funktionen umfassen, die unabhängig oder gleichzeitig ausgeführt werden können. Zu den frühen Erscheinungsformen dieser Technologie gehörte die Implementierung von Eingabe-/Ausgabeoperationen, wie z. B. direkter Speicherzugriff, als vom primären Rechenthread getrennte Threads. Eine breitere Anwendung dieser Technologie entstand in den 1970er Jahren mit der Entwicklung von Systemen, die in der Lage waren, mehrere Rechenthreads gleichzeitig auszuführen. Dieses technologische Paradigma wird als Multi-Threading (MT) bezeichnet. MT gilt im Allgemeinen als wirtschaftlich effizienter als Multiprocessing, da es im Gegensatz zur gesamten CPU-Duplizierung, die für MP erforderlich ist, nur die Replikation eines begrenzten Satzes von CPU-Komponenten erfordert. Innerhalb einer MT-Architektur werden Ausführungseinheiten und die Speicherhierarchie, einschließlich Caches, von mehreren Threads gemeinsam genutzt. Ein wesentlicher Nachteil von MT besteht darin, dass es im Vergleich zu MP eine bessere Hardware-Sichtbarkeit für die Software bietet, wodurch umfangreichere Änderungen an der Supervisor-Software, wie z. B. Betriebssystemen, für eine effektive Unterstützung erforderlich sind. Temporales Multithreading stellt eine implementierte Form von MT dar, bei der ein Thread ausgeführt wird, bis er auf einen Stillstand stößt und auf den Abruf von Daten aus dem externen Speicher wartet. Bei diesem Paradigma führt die CPU schnell einen Kontextwechsel zu einem anderen bereiten Thread durch und schließt den Übergang häufig innerhalb eines einzigen CPU-Taktzyklus ab, wie am Beispiel des UltraSPARC T1. Simultanes Multithreading stellt eine weitere MT-Variante dar, die durch die parallele Ausführung von Anweisungen aus mehreren Threads innerhalb eines einzigen CPU-Taktzyklus gekennzeichnet ist.
Von den 1970er bis Anfang der 2000er Jahre konzentrierte sich das Hauptziel bei der Entwicklung leistungsstarker Allzweck-CPUs auf die Maximierung der Parallelität auf Befehlsebene (Instruction-Level Parallelism, ILP) durch Techniken wie Pipelining, Caching, superskalare Ausführung und Out-of-Order-Ausführung. Dieser Entwicklungsverlauf führte zur Schaffung leistungsstarker, stromintensiver CPUs, wie zum Beispiel der Intel Pentium 4. In den frühen 2000er Jahren stießen CPU-Architekten auf erhebliche Hindernisse für weitere Leistungssteigerungen durch ILP-Methoden, vor allem aufgrund der zunehmenden Divergenz zwischen CPU- und Hauptspeicher-Betriebsfrequenzen sowie steigender CPU-Verlustleistung, die auf immer komplexere ILP-Techniken zurückzuführen ist.
Anschließend übernahmen CPU-Designer Konzepte von Kommerzielle Computerbereiche wie die Transaktionsverarbeitung, in denen die kollektive Leistung zahlreicher Programme – das sogenannte Durchsatzrechnen – eine größere Bedeutung hatte als die Leistung eines einzelnen Threads oder Prozesses.
Die Verschiebung der Designprioritäten zeigt sich in der weit verbreiteten Einführung von Multi-Core-Prozessorarchitekturen, insbesondere in den jüngsten Designs von Intel, die die weniger superskalare P6-Architektur emulieren. Zeitgenössische Prozessoren verschiedener Familien verfügen über Multiprocessing auf Chipebene, wie zum Beispiel der x86-64 Opteron und Athlon 64
Datenparallelität
Datenparallelität stellt ein weniger verbreitetes, aber zunehmend bedeutsames Verarbeitungsparadigma dar, das sich auf die gesamte Informatik erstreckt. Zuvor diskutierte Prozessoren werden als Skalargeräte kategorisiert. Im Gegensatz dazu verarbeiten Vektorprozessoren, wie ihre Bezeichnung schon sagt, mehrere Datenelemente innerhalb einer einzigen Anweisung, im Gegensatz zu Skalarprozessoren, die ein Datenelement pro Anweisung verarbeiten. Gemäß der Taxonomie von Flynn werden diese Datenverarbeitungsansätze grob in Einzelanweisungsstrom, Mehrfachdaten-Strom (SIMD) bzw. Einzelanweisungsstrom, Einzeldatenstrom (SISD) eingeteilt. Der Hauptvorteil von Vektorprozessoren ist ihre Effizienz bei der Optimierung von Vorgängen, die die Anwendung einer identischen Funktion (z. B. Summation oder Skalarprodukt) auf umfangreiche Datensätze erfordern. Anschauliche Anwendungen umfassen die Multimediaverarbeitung (Bilder, Videos und Audio) sowie zahlreiche wissenschaftliche und technische Berechnungen. Während ein Skalarprozessor die Abruf-, Dekodierungs- und Ausführungsphasen für jeden Befehl und jeden Datenwert in einem Satz nacheinander abschließen muss, kann ein Vektorprozessor mit einem einzigen Befehl eine einzelne Operation für einen erheblich größeren Datensatz ausführen. Diese Effizienz wird erreicht, wenn eine Anwendung häufig die Anwendung einer einheitlichen Operation auf eine umfangreiche Datensammlung beinhaltet.
Historisch gesehen wurden frühe Vektorprozessoren wie der Cray-1 vorwiegend in der wissenschaftlichen Forschung und bei kryptografischen Anwendungen eingesetzt. Dennoch gewann die Integration von SIMD-Funktionen in Allzweckprozessoren mit der weit verbreiteten Digitalisierung von Multimedia erheblich an Bedeutung. Nach der weit verbreiteten Einführung von Gleitkommaeinheiten in Allzweckprozessoren entstanden Mitte der 1990er Jahre Spezifikationen und Implementierungen für SIMD-Ausführungseinheiten für diese Prozessoren. Ursprüngliche SIMD-Spezifikationen, einschließlich HPs Multimedia Acceleration eXtensions (MAX) und Intels MMX, waren auf Ganzzahloperationen beschränkt. Diese Einschränkung stellte für Softwareentwickler eine erhebliche Herausforderung dar, da viele Anwendungen, die von SIMD profitieren, hauptsächlich Gleitkommaberechnungen beinhalten. Anschließend haben die Entwickler diese grundlegenden Designs iterativ verfeinert, was zu modernen SIMD-Spezifikationen führte, die typischerweise in eine spezifische Befehlssatzarchitektur (ISA) integriert sind. Zu den prominenten modernen Instanzen gehören Intels Streaming SIMD Extensions (SSE) und das PowerPC-assoziierte AltiVec (auch bekannt als VMX).
Hardware-Leistungsindikatoren
Moderne Architekturen, einschließlich eingebetteter Systeme, enthalten häufig Hardware-Leistungsindikatoren (HPC). Diese Zähler erleichtern die Datenerfassung auf niedriger Ebene, das Benchmarking, das Debuggen und die Analyse von Softwareausführungsmetriken auf Befehlsebene. HPC kann auch eingesetzt werden, um anomales oder potenziell bösartiges Softwareverhalten zu erkennen und zu untersuchen, beispielsweise Exploits im Zusammenhang mit Return-Oriented Programming (ROP) oder Sigreturn-Oriented Programming (SROP). Diese Anwendung wird üblicherweise von Software-Sicherheitsteams durchgeführt, um bösartige Binärprogramme zu bewerten und zu identifizieren.
Zahlreiche führende Anbieter, darunter IBM, Intel, AMD und Arm, bieten Softwareschnittstellen an, die typischerweise in C/C++ implementiert sind, um Leistungsmetriken aus CPU-Registern zu extrahieren. Darüber hinaus stellen Betriebssystementwickler Dienstprogramme wie perf (Linux) zur Verfügung, um CPU-Ereignisse sowohl im Kernel als auch in der Anwendungsausführung aufzuzeichnen, zu vergleichen oder zu verfolgen.
Hardwarezähler bieten einen Mechanismus mit geringem Overhead zum Erfassen umfassender Leistungsmetriken in Bezug auf die grundlegenden Komponenten einer CPU (z. B. Funktionseinheiten, Caches, Hauptspeicher), was eine deutliche Überlegenheit gegenüber Software-Profilern darstellt. Darüber hinaus machen sie es in der Regel überflüssig, den Quellcode eines Programms zu ändern. Angesichts der architektonischen Unterschiede bei den Hardware-Designs variieren die spezifischen Kategorien und Interpretationen von Hardware-Zählern folglich je nach Architektur.
Privilegierte Modi
Moderne Zentraleinheiten (CPUs) verfügen häufig über privilegierte Modi, um den Betrieb von Betriebssystemen und Virtualisierungstechnologien zu erleichtern.
In Cloud-Computing-Umgebungen ermöglicht die Virtualisierung die Bereitstellung einer virtuellen Zentraleinheit (vCPU) für verschiedene Benutzer; Es ist wichtig, eine vCPU von einem virtuellen privaten Server (VPS) zu unterscheiden.
In Virtualisierungskontexten stellt ein Host das virtuelle Gegenstück einer physischen Maschine dar und dient als Plattform für den Betrieb eines virtuellen Systems. Wenn mehrere physische Maschinen zusammenarbeiten und zusammenhängend verwaltet werden, bilden ihre kombinierten Rechen- und Speicherressourcen einen Cluster. Bestimmte Systeme ermöglichen das dynamische Hinzufügen und Entfernen von Komponenten zu einem Cluster. Ressourcen, auf die sowohl auf Host- als auch auf Clusterebene zugegriffen werden kann, können in fein granulare Ressourcenpools unterteilt werden.
Leistung
Die Leistung oder Geschwindigkeit eines Prozessors hängt von zahlreichen Variablen ab, einschließlich seiner Taktrate (normalerweise ausgedrückt in Hertz-Vielfachen) und den Anweisungen pro Takt (IPC), die zusammen die Anweisungen pro Sekunde (IPS) bestimmen, die eine CPU ausführen kann. Viele veröffentlichte IPS-Zahlen spiegeln „Spitzen“-Ausführungsraten wider, die aus synthetischen Befehlssequenzen mit minimaler Verzweigung abgeleitet werden. Im Gegensatz dazu umfassen authentische Workloads unterschiedliche Anweisungen und Anwendungen, von denen einige mehr Ausführungszeit erfordern als andere. Darüber hinaus hat die Effizienz der Speicherhierarchie erheblichen Einfluss auf die Prozessorleistung, ein Faktor, der bei IPS-Berechnungen oft unterschätzt wird. Um die effektive Leistung in typischen Anwendungen genau zu bewerten, wurden daher verschiedene standardisierte Bewertungen entwickelt, die allgemein als „Benchmarks“ (z. B. SPECint) bezeichnet werden.
Die Verarbeitungsleistung von Computern wird durch den Einsatz von Mehrkernprozessoren gesteigert, die grundsätzlich zwei oder mehr diskrete Verarbeitungseinheiten (sogenannte Kerne) in einem einzigen integrierten Schaltkreis integrieren. Theoretisch sollte ein Dual-Core-Prozessor fast die doppelte Leistung eines Single-Core-Prozessors aufweisen. Allerdings sind die praktischen Leistungsverbesserungen deutlich geringer, typischerweise etwa 50 %, was auf suboptimale Softwarealgorithmen und -implementierung zurückzuführen ist. Eine Erhöhung der Anzahl der Prozessorkerne (z. B. Dual-Core, Quad-Core) erweitert die Kapazität des Systems zur Verwaltung von Arbeitslasten. Dadurch kann der Prozessor ein größeres Volumen an asynchronen Ereignissen und Interrupts verarbeiten, die ansonsten bei Überlastung die CPU belasten können. Konzeptionell können diese Kerne mit verschiedenen Ebenen innerhalb einer Verarbeitungsanlage verglichen werden, von denen jede einer bestimmten Aufgabe gewidmet ist. In bestimmten Szenarien können benachbarte Kerne bei identischen Aufgaben zusammenarbeiten, wenn sich ein einzelner Kern für die Verarbeitung der Daten als unzureichend erweist. Multi-Core-CPUs verbessern die Fähigkeit eines Computers, mehrere Aufgaben gleichzeitig auszuführen, indem sie zusätzliche Rechenleistung bereitstellen. Dennoch ist die daraus resultierende Geschwindigkeitssteigerung nicht direkt proportional zur Anzahl der eingeführten Kerne, vor allem weil die Kommunikation zwischen Kernen, die über bestimmte Kanäle ermöglicht wird, einen Teil der verfügbaren Verarbeitungsbandbreite verbraucht.
Moderne CPUs verfügen über erweiterte Funktionen wie gleichzeitiges Multithreading und Uncore-Architekturen, die die gemeinsame Nutzung tatsächlicher CPU-Ressourcen zur Maximierung der Auslastung erfordern. Infolgedessen ist die Überwachung des Leistungsniveaus und der Hardwarenutzung zu einem komplexeren Unterfangen geworden. Als Reaktion darauf verfügen bestimmte CPUs über eine zusätzliche Hardwarelogik, die dazu dient, die Echtzeitauslastung verschiedener CPU-Komponenten zu verfolgen und per Software zugängliche Zähler bereitzustellen. Intels Performance Counter Monitor-Technologie ist ein Beispiel für diesen Ansatz.
Übertaktung
Beim Übertakten wird die Taktgeschwindigkeit einer Zentraleinheit (CPU) und anderer Komponenten über die vom Hersteller angegebenen Werte hinaus erhöht. Die Erhöhung der Taktrate einer Komponente führt zu einer höheren Anzahl ausgeführter Vorgänge pro Sekunde. Übertakten kann jedoch zu erhöhten CPU-Temperaturen und potenzieller Überhitzung führen, weshalb die Mehrheit der Benutzer von dieser Vorgehensweise absieht und die Standardtaktraten beibehält. Darüber hinaus sind bestimmte Komponentenvarianten, wie etwa Intels U-Serie-CPUs oder Nvidias OG-GPUs, darauf ausgelegt, ein Übertakten zu verhindern.
Notizen
Notizen
Referenzen
- Wie Mikroprozessoren bei HowStuffWorks funktionieren.
- 25 Mikrochips, die die Welt erschütterten – ein Artikel des Institute of Electrical and Electronics Engineers.