Home Computer Prozessor Basics Site Map counter

Prozessor-Glossar

In jedem Sektor gibt es eine eigene Sprache, mit Abkürzungen und Begriffen, die häufig benutzt werden, aber selten erklärt. Da mir beim Schrieben meiner Artikel aufgefallen ist, das ich das auch tue habe ich für Einsteiger in die Funktionsweise von Prozessoren dieses kleine Glossar angelegt. Ich verwende primär die verbreiteten englischen Begriffe. Wie der Titel schon aussagt, geht es um den Prozessor selbst, nicht den Computer allgemein. Weiterhin möchte ich jeden Begriff erklären, nicht nur die Abkürzung ausschreiben. Sollte einer fehlen, so mailen sie mir dies bitte.

3DNow!

3Dnow! War die Antwort von AMD auf Intels MMX-Erweiterung. Es ist eine Form von SIMD. Während MMX die Fließkommaregister dadurch zweckentfremdete, dass sie mehrere Integerwerte gleichzeitig bearbeiteten, tat AMD dies mit 32 Bit langen Fließkommazahlen (einfache Genauigkeit). Die gängigen mathematischen Operationen waren mit 3DNow! möglich und wurden bis zu viermal schneller ausgeführt. Wie Intels MMX gab es aber wenig Software die 3DNow! unterstützte. Mit "3D" hat die Erweiterung eigentlich nichts zu tun, da bei 3D-Grafiken mit Ganzzahlen gerechnet wird. Es war ein Marketingbegriff, ähnlich wie MMX nichts mit Multimedia zu tun hatte. AMD gab die Technologie zugunsten von Intels SSE auf.

Adressierungsarten

Daten müssen vom Speicher in die Register des Prozessors gelangen. Dafür muss der Prozessor den Speicher adressieren, das heißt es muss mindestens eine Adressierungsart geben. Es gibt bei vielen Architekturen beliebig viele Adressierungsarten, aber einige gehören zu den Kernadressierungsarten. Welche Adressierungsarten ein Prozessor versteht, ist Teil seiner Instruction Set Architecture ISA. Jede Adressierung hat zwei Parameter, eine Quelle und ein Ziel. Dabei wird der Wert von der Quelle in das Ziel kopiert. Ziel ist fast ausschließlich ein Register im Prozessor. Man kann zudem noch unterscheiden, ob der zweite Parameter (die Quelle) auch eine Speicherstelle sein kann. Mindestens eine Adressierungsart die eine Speicheradresse als Quelle akzeptiert, benötigt der Prozessor aus naheliegenden Gründen.

Adressierungsart

Bedeutung

Beispiel

unmittelbar

Die Konstante steht im Opcode, kann als Adresse oder Wert interpretiert werden.

Mov R1,1000

Direkt

Die Adresse, wo der Wert sich befindet, steht im Opcode, ein Speicherzugriff notwendig

Mov R1,[1000]

Indirekt

Die Adresse, wo sich der Zeiger auf den Wert befindet, steht im Opcode, zwei Speicherzugriffe notwendig

Mov R1,[[1000]]

Register (Register direkt)

Der Wert befindet sich in einem Register. Kein Speicherzugriff nötig.

Move R1,R2

Register indirekt

Die Adresse des Wertes befindet sich in einem Register. Ein Speicherzugriff nötig.

Move R1,[R2]

Register indiziert

Die Adresse des Wertes ergibt sich aus Addition einer Basisadresse und einer Indexadresse.
Die Indexadresse kann ein Register oder eine Konstante sein. Ein Speicherzugriff nötig.

Move R1[R2+R3]

Move R1,[R2+100]

In einer Programmiersprache bedeuten die Adressierungsarten:

Einige Architekturen bieten eine doppelt indirekte Adressierung, die einem Zeiger auf einen Zeiger entspricht (C-Operator: **) Diese Adressierung braucht man bei dynamischen Datenstrukturen, bei denen ein Bestandteil eines Records ein Zeiger auf die nächste Datenstruktur ist, wie z. B. bei Bäumen oder verketteten Listen.

Es gibt noch weitere Möglichkeiten der Adressierung. So haben viele Architekturen die Möglichkeit von Prä- oder Postveränderungen der Register. Da bei der indizierten Adressierung normalerweise ein Feld durchlaufen wird, kann so ein Inkrement- oder Dekrementbefehl gespart werden. Solche Befehle findet man bei der VAX und sie erlauben es C-Operatoren wie ++ / -- direkt in Maschinencode umzusetzen. Andere Architekturen erlauben auch den Bezug auf interne Register, die normalerweise nicht direkt veränderbar sind wie den Stackpointer oder Programmzähler.

Addressierungsschema

Verschiedene Architekturen verwenden unterschiedliche Schema, um eine Rechnung durchzuführen. Im Maximalfall benötigt ein Prozessor drei Adressen, um folgende Rechnung durchzuführen:

C:=A+B

Was in der Mathematik Variablen sind, sind auf Prozessorebene Adressen, also bekannte Speicherplätze. Dies können interne Register sein, es können aber auch Adressen im Arbeitsspeicher sein, in denen die Variable untergebracht ist.

Wird das mathematische Schema übernommen, so spricht man von 3-Adressschema. Die Anweisung hat drei Parameter, die für die Adresse des Resultates und der beiden Operanden stehen. Das sind in der Regel Register. Dieses Schema setzen viele 32 und 64 Bit Mikroprozessoren ein, aber auch die Supercomputer von Cray. Es ist Standard bei RISC-Prozessoren. Rechner mit dem Dreiadressschema haben oft sehr viele Register. Es ist unüblich, dass ein Operand eine Speicheradresse ist.

Das 2-Adressschema verzichtet auf die Resultatadresse, das Ergebnis landet in einem der beiden Operanden, oft dem ersten. Dieses Schema ist bei vielen CISC-Rechnern verbreitet, der zweite Operand kann oft eine Speicheradresse sein.

Das 1-Adressschema hat ein besonderes Register, den Akkumulator, der immer ein Operand bei einer Rechnung ist und in dem auch das Ergebnis landet. Operand 2 kann ein anderes Register oder eine Speicheradresse sein. Dieses Schema ist bei 8 Bit Prozessoren wie der Z80 verbreitet.

Das 0-Adressschema hat überhaupt keine adressierbaren Register, vielmehr arbeitet es mit dem Stack: Operanden werden auf den Stack abgelegt, die Rechnung holt zwei Einträge vom Stack und schreibt das Ergebnis wieder zurück. Die Programmiersprache Java arbeitet intern so.

Für eine komplexe Berechnung mit mehr als einer Operation braucht man um so mehr Befehle, je niedriger die Ordnung ist. Die kleineren Ordnungen haben trotzdem ihren Sinn. 8-Bit-Rechner können nur 64 KByte RAM ansprechen. Nach Möglichkeit sollen die wichtigsten Befehle in ein Byte passen, um Zeit bei der Ausführung und Speicher zu sparen. Bei nur 4 Registern benötigt man pro Adressierungsart aber 2 Bit im Befehl, bei 2-Adressschema bleiben also nur noch 4 Bits für die Befehle übrig, das sind 16 und damit zu wenig, selbst für einen einfachen Prozessor.

Motorola Mc68K und Intel 8086 waren beide 2-Adressmaschinen. Sie waren aber auch 16 Bit Prozessoren und in 16 Bit konnte man problemlos das erste Byte für den Opcode (maximal 256 Befehle) und das zweite dann für zwei Adressen für je 16 Register reservieren.

Bei 32 Bit Architekturen passen in ein Wort nicht nur der Opcode, sondern drei Adressen für je 256 Register. Dies sind daher 3-Adressarchitekturen (MIPS, Alpha, aber auch 64 Bit Erweiterung von x86). Die große Anzahl an Registern erlaubt es auch, viele Werte intern in den Registern zu halten und so gibt es keinen Bedarf eine Speicheradresse anzugeben.

AVX

AVX Advanced Vector Extensions ist die Nachfolgetechnologie von Intel für SSE. Wie SSE ist es eine SIMD Technologie. Dazu kamen zuerst neue Befehle hinzu. Später, ab der 4ten Generation der Core Mikroarchitektur (Haswell) wurden die Register auf 256 Bit erweitert (AVX2). Die letzte Erweiterung AVX-512 hat mit 512 Bit nochmals doppelt so breite Register, die nun acht 64 Bit oder 16 32 Bit Fließkommazahlen parallel verarbeiten können. AVX wird breit von Software unterstützt, jedoch nur selten stellt sich die versprochene Geschwindigkeitssteigerung um bis zum Faktor 16 ein.

ALU

Die Arithmetrisch - Logische Einheit (ALU) ist Bestandteil des Prozessors, der Name ist sehr alt, wird aber heute noch verwendet. In der ALU finden alle Operationen mit Ganzzahlen statt wie:

Nach jeder Operation werden die Flags gesetzt, die über das Ergebnis informieren, z.b. ob es Null ist, es einen Überlauf gab es eine positive oder negative Zahl ist oder eine gerade oder ungerade. Diese Flags werden dann bei bedingten Sprüngen ausgewertet. Das Gegenstück bei Fließkommazahlen ist die FPU.

Branch Prediction

Intern arbeitet ein Prozessor bei Verzweigungen wie sie in höheren Programmiersprachen bei Befehlen wie "If … then" oder Schleifen bei Prüfung auf Schleifenende vorkommen mit bedingten Sprüngen. Eine Schleife in Pascal wie

"for i:=1 to 10"

könnte zu folgenden Befehlen führen:

Schleifenkopf: … // Schleifenbeginn

… // weitere Befehle

compare 10 // Ist das letzte Ergebnis 10?

Jump nonzero,Schleifenkopf // Springe wenn nicht zum Schleifenbeginn

Ein bedingter Sprung ist also ein Sprung, der von einer vorher geprüften Bedingung, einem Vergleich, abhängt. Das Problem ist ,dass moderne Prozessoren eine Pipeline haben, in der typisch 10 bis 20 Befehle in verschiedenen Ausführungsphasen stecken. Der Prozessor holt dafür vorausschauend schon den Code (Fetch) und führt die Befehle der Pipeline zu. Beim Sprung ist der gesamte Inhalt der Pipeline nach dem Sprungbefehl aber ungültig, da dieser Code ja nicht ausgeführt wird. Da Schleifen sehr häufig im Code vorkommen und oft sehr kurz sind, würde dies einen Prozessor stark ausbremsen. Branch prediction versucht die Sprünge vorherzusagen. Beim ersten Sprung geht das noch nicht, aber bei den folgenden. Es gibt verschiedene Verfahren für die Vorhersage. Moderne Prozessoren haben ganze Tabellen, wo sie nicht nur die aktuelle Verzweigung sich merken, sondern auch die vorherigen Durchläufe, die meist erneut im Code durchlaufen werden, sodass auch bei ihnen die falsche Vorhersage beim ersten Sprung entfällt. Auf Basis der Sprungvorhersage holt der Prozessor beim Fetch die Bytes die am wahrscheinlichsten nach dem Sprung die Befehle enthalten.

Cache, Cachelines, Cache-Controller

Ein Grundproblem, eigentlich schon seit es Computer gibt ist, das die Prozessoren erheblich schneller als der Speicher aus DRAM sind. Um dieses Manko zu bekämpfen, gibt es einige Strategien. Eines ist der Cache. Der Cache ist ein schneller Speicher aus SRAM, der aufgeteilt ist in Cachelines. Jede Cacheline buffert einen festen Bereich des Hauptspeichers ab, meist 32 oder 64 Bytes. Das heißt sie hält eine Kopie vor, auf die schnell zugegriffen werden kann. Ein Cache-Controller sorgt dafür das dies nach Möglichkeit die Stellen sind, die am häufigsten benötigt werden. Heutige Prozessoren haben mehrere Cache-Ebenen, die unterschiedlich schnell und unterschiedlich groß sind. Caches sind in Ebenen "Levels, abgekürzt "L" organisiert. Die erste Ebene (L1-Cache) ist meistens aufgeteilt in Daten- und Instruktionscache. Das liegt an den unterschiedlichen Anforderungen. Aus einem Instruktionscache wird immer nur gelesen, dafür dauernd mit hoher Datenrate. Daten werden auch geschrieben, aber nicht jeder Befehl erzeugt oder liest Daten. Zudem fluktuieren Daten mehr als der Code, weshalb oft die Datencaches größer sind. Die Ebene 2 ist dann meist ein gemeinsame Cache für Daten und Instruktionen und die Ebene 3 teilen sich oft mehrere Kerne auf einem Prozessor. Beim Schreibzusgriff kann man noch unterscheiden ob dieser sofort in den Hauptspeicher erfolgt ("Write-Through" oder zuerst nur im Cache landet und erst wenn dieser Zeit hat in den Hauptspeicher erfolgt "Write Back" - letzteres ist natürlich effektiver. Mehrere Cachebenen benötigt man auch, weil die Verwaltung des Caches Verzögerungen erzeugt. Die Daten sind in einem wenige Kilobyte großen L1-Cache schneller gefunden als in einem Megabyte großen L3-Cache.

CISC

CISC - Complex Instruction Set ist das Gegenteil zu RISC. Die meisten Großrechner früherer Zeiten waren CISC-Systeme, auch viele Minicomputer wie die VAX. Kennzeichen einer CISC-Architektur ist eine variable Befehlslänge, leistungsfähige Befehle, wenige Register, oft auch Register mit Spezialaufgaben, viele Adressierungsarten.

Obwohl das Gegenteil - RISC einfacher in Hardware umzusetzen ist, verwandten die meisten früheren Architekturen einen CISC-Befehlssatz, da dieser menschlichen Programmierer entgegenkam. Mit der immer stärkeren Verbreitung von höheren Programmiersprachen die viele Spezialbefehle von CISC nur wenig nutzen, hat sich heute der Fokus auf RISC verschoben. Die x86-Architektur ist eine CISC-Architektur. Die Befehle werden aber seit dem Pentium Pro intern in einfachere RISC Operationen umgesetzt.

DDR-RAM

DDR-RAM hat nichts mit dem ehemaligen zweiten deutschen Staat zu tun. Die Abkürzung steht für Double Data Rate RAM. Damit ist DDR-RAM schon gut beschrieben. DDR-RAM ist ein Nachfolger von SDRAM und arbeitet nach demselben Prinzip (siehe dort). Der wesentliche Unterschied ist, dass DDR-RAM bei jedem Flankenwechsel eines Taktsignals Daten überträgt. Bei SD-RAM war dies bei jedem Taktsignal. Das entspricht der doppelten Datenrate die sich auch im Namen niederschlägt. Bei einem Takt von x MHz gibt es 2x Flankenwechsel, bei denen jeweils Daten übermittelt werden. Gängig ist als Geschwindigkeitskriterium die Angabe der Datenfrequenz z. B. 3200 MHz, nicht die Bustaktrate, die halb so groß ist (hier also 1600 MHz). Alternativ wird die Datenrate angegeben, die sich aus der Datenfrequenz multipliziert mit der Anzahl der Bytes pro Transfer ergibt, das sind heute üblicherweise 8 Bytes pro Transfer. Der obige Speicher würde dann als "PC-25600" angeboten werden (3200 MHz x 8 Bytes/Hz = 25.600 Mbytes/s). Innerhalb der Generationen wurde die Taktfrequenz laufend gesteigert. Beim Schreiben des Artikels ist der höchste Standard DDR5, der in Intels 12-ter Generation der Core-Mikroarchitektur unterstützt wird (dort mit bis zu 5,2 GHz Datenrate). Für Serverprozessoren gibt es noch schnellere DDR-5 Module mit bis zu 7,2 GHz. Dagegen fing DDR1 mit 200 MHz um die Jahrtausendwende an.

Decoder

Der Decoder ist eine Einheit in einem Prozessor. Er interpretiert die Bytes, die der Fetch liefert als ausführbaren Code und stellt fest, welcher Befehl es ist und welche Operanden im Befehl kodiert sind. Bei komplexen Befehlen kann ein zweiter (dritter, vierter) Fetch nötig sein, um den zweiten Teil eines Befehls zu holen, ebenso wenn der Befehl angehängte Daten als Operanden hat, wie Konstanten oder Adressen. Erst wenn alle Teile eines Befehls vorliegen, übergibt der Decoder diesen an die Ausführungseinheit.

DMA

DMA (Direct Memory Access) ist eine Möglichkeit Speichertransfers, sowohl innerhalb des Speichers, wie auch zur Peripherie zu beschleunigen. Dazu gab es früher einen eigenen Baustein, den DMA-Controller, heute ist dies ein Bestandteil des Chipsatzes. Ein DMA-Baustein ist ein Spezialbaustein der sehr schnell Daten aus dem Speicher holen und schreiben kann. Eine zweite Quelle sind I/O-Ports, an denen dann Peripheriegeräte oder Steckkarten hängen. Während eines Transfers wird die CPU im einfachsten Fall angehalten. Bessere DMA-Controller bremsen die CPU nur aus, wenn diese auf denselben Speicherbereich zugreifen will. Eine DMA kann nicht nur ein Byte übertragen, sondern ganze Blöcke. Ohne DMA hätten Computer der 8- und 16-Bit Generation nicht die Geschwindigkeit gehabt eine Festplatte zu unterstützen, da sonst jedes Byte das gelesen oder geschrieben wird, mehrere Befehle nötig macht, jeder benötigt einige Takte, doch schon die erste Generation von Festplatten konnte Daten mit 5 Mbit/s = 625 KByte/s übertragen. Die Geschwindigkeitssteigerung ergibt sich aus der Tatsache, das ein einfacher Blocktransfer innerhalb des Speichers in etwa dieser Routine des Prozessors Z80 entspricht:

loop:   ld  a,(hL)
	  ld  (de),a
	  inc hl
	  inc de
	  dec bc
	  jp  nz, Loop

Die Verzögerung resultiert daraus, dass jedes Byte erst in ein Prozessorregister muss, dann aus diesem wieder zum Speicher zudem muss, da es ein Block ist die Adressen der Quell- (HL) und Zielregister (DE) inkrementiert werden und der Zähler der die transferierten Bytes wiedergibt dekrementiert werden. Eine DMA transferiert direkt vom Speicher zum Speicher, die Inkrement und Dekrementoperationen laufen parallel ab. Obige Schleife für den Z80 Prozessor benötigt 42 Takte. Ein Befehl (LDIR) der sie ersetzt immerhin noch 21 Takte. Eine Z80 DMA benötigt dafür aber nur 2 Takte.

DMA kann auch genutzt werden, um schnell Speicherblicke zu kopieren, verschieben und zu löschen und so z. B. Grafikoperationen (Scrollen) beschleunigen.

DRAM

Dynamisches RAM (Random Acess Memory) ist seit Beginn der Siebziger Jahre der Standardspeicher für Computer. Sein Aufbau ist relativ einfach. Intern besteht ein RAM-Chip aus mehreren Teilfeldern, die wiederum aufteilt sind in eine Matrix von Kondensatoren und Transistoren. Der Kondensator ist im Prinzip ein in der Tiefe stark dotierte Zone im Silizium. So kann sie Überschusselektronen aufnehmen. Der Transistor sperrt den Ausgang, außer für das Auslesen oder Schreiben. Um dies zu bewerkstelligen, muss an zwei Leitungen die der Zeilen- und Spaltenadresse entsprechen Strom angelegt werden. Diese sind mit Source und Gate des Transistors verbunden, so kann ein Strom zum Drain fließen, in diesem falle die Ladung des Kondensators. Schreib-/Leseverstärker verstärken dann diesen Strom und legen ihn an die Datenleitung an. Die Bezeichnung "Dynamisch" haben die Chips, weil Silizium als Halbleiter die Ladungen im Kondensator nicht sehr lange hält. Jede Zelle muss im Bereich von Millisekunden erneut ausgelesen, verstärkt und wieder geschrieben werden. Dazu dient ein Refreshsignal, dass der Prozessor übermitteln muss. SD-RAM als Erweiterung von DRAM kam Mitte der Neunziger Jahre auf und wurde zur Jahrtausendwende von dem noch schnelleren DDR-RAM abgelöst.

Fetch

Fetch ist ein Teil des Maschinenzyklus (siehe dort). Beim Fetch holt der Prozessor Anweisungen aus dem Speicher und speichert diese in einem internen Bereich, meist einem Register (Instruktionsregister).

Flash-Speicher

Flash Speicher ist ein permanenter Speicher, der auch beim Ausschalten den Inhalt nicht verliert. Flash-Speicher hat eine lange Vorgeschichte. Schon Anfang der Siebziger Jahre wurde das EPROM (Electrical Programmable ROM) auf den Markt gebracht. Sei physikalisches Prinzip verwendet auch der Flash-Speicher: ein abgelöstes Gate eines Transistors "Floating Gate" speichert dauerhaft Elektronen, wenn eine hohe Spannung angelegt wird. Durch den Feldeffekt kann die Ladung später bestimmt werden. EPROMs waren nur durch UV-Licht löschbar. Das änderte sich mit den EEPROM (Electrical Ereasable Programmable ROM), bei denen der Inhalt durch eine höhere Spannung gelöscht werden konnte. Das Löschen muss immer erfolgen, bevor etwas geschrieben wird. Flash-Speicher unterscheidet sich von EEPROM dahingehend, das die langsame Schreibgeschwindigkeit dadurch abgefedert wird, das nicht einzelne Bytes, sondern ganze Blöcke von z. B. 512 KByte Größe gelöscht und neu beschrieben werden. Die dazu nötigen Daten eines Blocks muss der Controller zwischenspeichern.

Es werden immer mehr Bits pro Zelle gespeichert: Bei einem Bit pro Zelle spricht man von Single Level Cell (SLV), bei zwei Bits von MLC (Multi Level Cell - man ahnte damals wohl noch nicht das es mal noch mehr Bits pro Zelle geben würde), beide Technologen findet man heute nicht mehr. Standard ist heute der QLC Speicher (Quad Level Cell) mit vier Bits pro Zelle, der TLC Speicher (Triple Level Cell) mit drei Bits pro Zelle ist schon am Aussterben. Leider nimmt die Anzahl der Schreibvorgänge mit den Bits pro Zelle ab. SLC war noch 100.000-mal beschreibbar, TLC ist nur noch einige 100 bis 1.000 mal beschreibbar. So puffern kleine Caches aus SLC bei vielen Flash-Speichern die Schreibzugriffe erst mal ab.

Flash Speicher findet man in SSD, Speicherkarten (SD-Karte, Compact-Flashkarte), USB-Sticks und intern als Speicher für das Betriebssystem und Anwendungen in vielen Geräten wie Smartphones.

FPU

Die Floating-Point-Unit ist das Gegenstück zur ALU bei Fließkommazahlen. Fließkommazahlen bestehen aus zwei Teilen, einer Mantisse die den Wert normiert auf einen Bruchteil von 1 also alle Nachkommastellen) und den Exponenten. Die Zahl Pi würde intern also so davorstellt: 31415927 (Mantisse) und 0 (100). Die Berechnung von Fließkommazahlen ist deutlich aufwendiger als Ganzzahlen. Viele CPUs hatten keine FPU, also eine eigene Berechnungseinheit für Fließkommazahlen. Diese konnte man als Coprozessor (Intel: x87 Serie, Motorola MC 68882) nachrüsten. Dies erhöhte dann die Geschwindigkeit um den Faktor 10, und bot zudem mehr Genauigkeit. Heute verfügen alle Prozessoren nicht nur über eine FPU, sondern mehrere, teilweise spezialisiert z.B. auf Vektoroperationen (SSE und AVX). Die Geschwindigkeit bei Fließkommaoperationen wird in FLOPS (Fließkommaoperationen pro Sekunde) gemessen. Ein alter Benchmark dafür ist der Whetstone Benchmark.

Hyperthreading

Hyperthreading ist die Intel Bezeichnung für symmetrisches Multithreading (#SMT).

Interrupt

Über einen Interrupt unterbricht ein externes Gerät die Abarbeitung des Programms eines Mikroprozessors. Dafür gibt es mindestens einen Pin, an dem ein angelegtes Signal einen Interrupt generiert. Der Prozessor verzweigt dann an eine Interruptserviceroutine, in der auf das Ereignis reagiert wird. Meist verfügen Prozessoren über mehrere Interrupts. Dann kann über eine Maske festgestellt werden welcher Interrupt ausgelöst wurde, daneben gibt es auch Softwareinterrupts mit denen residente Programme zyklisch aktiviert werden können. Bei den ersten PC musste man die Interrupts von Geräten (Druckerschnittstelle, serielle Schnittstelle, Soundkarte) noch über DIL-Schalter festlegen, später geschah dies per Software. Benötigt ein System mehr Interrupts für seine Peripheriegeräte als es Interruptsignale gibt, so bündelt diese ein eigenes IC, der Interruptcontroller. Heute ist dieser Bestandteil des Chipsatzes.

IPC

IPC steht für Instructions per Cycle. Gemeint ist wie viele Befehle ein Prozessor in einem Takt ausführen kann. Er ist ein Maß für die Effizienz einer Architektur. Prozessoren die nicht superskalar sind haben einen IPC von unter 1. Beim Intel 8086 betrug dieser Wert 0,13. Bei den nachfolgenden Generationen steig er durch die Pipeline von 0,31 (80286) auf 0,51 beim 80486. Erst mit dem Pentium wurde die Architektur superskalar. 2022 erreicht die 12-te Generation der Core-Mikroarchitektur im Mittel 3,4 IPC bei den P-Kernen und 2,2 bei den E-Kernen.

Berechnet kann der IPC Wert über die MIPS:

IPC = MIPS / MHz Takt.

Beispiel: Die Motorola Mc68000 CPU leistete bei 8 MHz 1 MIPS, Sie hat daher einen IPC von

IPC = 1 / 8 = 0,125

Der IPC Wert sagt allerdings nichts darüber aus, wie schnell der Rechner ist, denn obwohl nach dem IPC Wert MC68000 und I8086 gleichauf liegen, war in der Praxis die Motorola CPU etwas schneller, da ihre Befehle "mächtiger" waren und sie mehr interne Register hatte, somit wenige Befehle auf Transfers zu und von den Registern entfielen.

Maschinenzyklus (Machine Cycle)

Für die Abarbeitung von Befehlen hat sich seit Erfindung der ersten Computer ein Schema etabliert, dass bis heute Bestand hat. Grundlage ist ein von außen angelegter Takt z. B. durch einen schwingenden Kristall erzeugt. Bei jedem Taktimpuls macht der Prozessor etwas und alle Aktionen müssen in der Zeit zwischen zwei Taktimpulsen erledigt sein. Es sind für die Verarbeitung eines Befehls die drei Phasen Fetch - Decode - Execute.

Beim Fetch holt der Prozessor Daten aus dem Speicher, früher war dies ein Byte oder ein Wort, heute ein kleiner Block von 16 oder 32 Bytes.

Beim nächsten Takt dekodiert der Prozessor die geholten Bytes. Jeder Maschinenbefehl hat ein festes Format, ein bestimmtes Binärmuster, in dem oft auch weitere Parameter integriert sind, wie z. B. die Nummer eines Registers oder die Bedingung eines Sprungs. Bei einfachen Prozessoren wird das Bitmuster an Schaltungen angelegt und Leitungen, die Strom führen öffnen, Wege zu weiteren Stationen, bei den heutigen Prozessoren ist das Bitmuster ein Index in einem Microcode ROM, dass dann noch einfachere Instruktionen enthält, die nacheinander ausgeführt werden. Dies ist etwas langsamer, aber der Schaltungsaufwand ist erheblich kleiner.

Beim Execute erfolgt dann die eigentliche Ausführung des Befehls. Dafür gibt es eigene Subeinheiten im Prozessor wie die ALU oder das Steuerwerk.

Ein Befehl kann durchaus mehrere dieser Teilzyklen haben. So kann nach dem ersten dekodierten Byte noch nicht feststehen, welcher Befehl gemeint ist, da wenn ein Prozessor viele Befehle hat, sie nicht alle in die 256 Bitmuster eines Bytes passen. Dann schließt sich erneut ein Fetch und Decode an. Ein Befehl kann angehängte Daten haben die z.B. in ein Register gelesen werden müssen, dann kommt es zu einem weiteren Fetch und zuletzt benötigen komplexe Operationen wie Blöcke kopieren, Division und Multiplikation mehrere Taktzyklen für die Ausführung.

Microcode

Nachdem ein Befehl dekodiert ist, muss er ausgeführt werden. Dazu müssen getaktet jeweils Eingänge an die Register, die Ausführungseinheiten etc. freigegeben oder geschlossen werden. Dies wird bei einfachen Prozessoren durch direkte Verdrahtung gelöst. Je komplexer ein Prozessor ist, je mehr Befehle er versteht, desto größer wird aber der Aufwand dafür. Das gilt besonders für Befehle, die intern ein ganzes Programm umfassen wie eine Multiplikation oder Division, die ein Prozessor (wie auch ein Mensch) nicht in einem Schritt durchführen kann.

Bei Microcode sind Bitmuster, die den Strömen zu den Einheiten entsprechen, in einem ROM abgelegt. Der Opcode wird dann als Index für einen Eintrag in diesem ROM interpretiert. Einige Einträge können auch keine prozessinterne Aktion auslösen, sondern genutzt werden um Schleifen oder Verzweigungen auszulösen. Microcode ist durch den zusätzlichen Zugriff auf das ROM langsamer, aber die Vorteile überwiegen - es ist leichter wartbar und Fehler sind schneller korrigiert, als bei einer Hardwareverdrahtung. Der technische Aufwand ist kleiner und schon in den Siebzigern war das ROM veränderbar, der Microcode also anpassbar. Heute sind Updates des Microcodes über das Internet die Regel. Eingeführt wurde Microcode Anfang de Sechziger Jahre. Die IBM 360 Serie war ein populäres frühes System, das Microcode einsetzte. Nur wo es auf höchste Geschwindigkeit ankam, wurde weiterhin auf Hardwareverdrahtung gesetzt.

MIPS

MIPS, Millionen Instruktionen pro Sekunde sind ein alter Wert für die Geschwindigkeit eines Computers. In Zeiten in denen nur wenige Rechner mindestens eine MIPS schafften, konnte man damit werben, doch spätestens Mitte der Achtziger Jahre als die meisten Mikroprozessoren mehrere MIPS schafften, verlor die Angabe an Bedeutung. Die Messung ist nicht trivial, weil die meisten Prozessoren keinen integrierten Zähler haben, den man einfach abfragen kann. Zwar kann man ein Codestück entwerfen, das ist dann meist eine Schleife die oft durchlaufen wird und die Zeit stoppen, doch dann stellt sich die Frage, ob dieser Code für alle ausgeführte Programme repräsentativ ist.

Lange Zeit populär war der Dhrystone MIPS Angabe. Bei diesem alten Benchmark wurde die Geschwindigkeit relativ zu einer VAX 11/780 angegeben, einem 32 Bit Minicomputer der 1977 erschien und anfangs 500.000 DM kostete. Deren Geschwindigkeit wurde fix zu 1 MIPS gesetzt (in Wirklichkeit war es eher 0,5 MIPS). Der Benchmark verlor seine Bedeutung, als aktuelle Mikroprozessoren Tausende von Dhrystone MIPS erreichten. In einer Liste ist der jüngste Intel-Prozessor ein I5-4820K, der 23.707 MIPS erreicht, selbst ein (langsamer) Spielzeugcomputer wie ein Raspberry Pi 3 kommt auf 3.56 Dhrystone MIPS, alle vier Kerne des i5-4690 des Autors, der beim Schreiben des Artikels auch schon fast acht Jahre alt ist, 119.000 MIPS.

MMU

Eine Memory Management Unit (MMU) hat zwei Funktionen. Sie kann zum einen den adressierbaren Arbeitsspeicher erweitern und sie kann bei der virtuellen Speicherverwaltung die Umrechnung von logischem (virtuellen) Speicher in physikalischen Speicher durchführen.

Die erste Funktion kam auf, als der adressierbare Speicher nicht ausreichte. So enthielten verbesserte Versionen der 8-Bit Prozessoren wie der HD64180 eine integrierte MMU, die es erlaubte, die physikalisch adressierbaren 64 KByte in drei Fenstern in einem 16 MB großen Adressbereich zu verschieben.

Die zweite Funktion wird bis heute eingesetzt und die MMU ist in die CPU integriert. Bei der MMU findet die Umsetzung von virtuellem Speicher in physikalischen Speicher statt. Sie hat aber auch andere Funktionen. So kann man den Speicher in Segmente aufteilen und diese schützen, sodass nur das Betriebssystem oder nur das Programm, das das Segment angelegt hat auf sie zugreifen können. Bei der Intel 8086 war eine MMU schon integriert, denn diese CPU arbeitete schon von sich aus mit Segmenten von 64 KByte Größe die in einen 1 MByte großen physikalischen Adressraum abgebildet werden müssen. Die MMU macht die Umsetzung typischerweise mit Übersetzungstabellen.

MMX

MMX - Multimedia Extensions war eine 1997 bei den letzten Versionen des Pentiums eingeführte Befehlserweiterung. In ihr wurden die Fließkommaregister der FPU alternativ genutzt. Neben dem schon existierenden Format mit 64 Bit Ganzzahlen konnten in den Registern auch 2 x 32 Bit, 4 x 16 Bit oder 8 x 8 Bit Ganzzahlen verarbeitet werden. Den Namen bekam die Erweiterung, weil die zur Verfügung stehenden Operationen auf Bildbearbeitung ausgerichtet waren wie das VerUnden und VerOdern von einzelnen Bildpunkten. Weiterhin gab es einen Sättigungsmodus - addiert man zu einem Bild mehr Helligkeit so erhält man die maximale Helligkeit, während ein "normaler" 8 Bit Wert einen Überlauf erleiden kann, sodass die Pixel plötzlich dunkel werden.

MMX wurde relativ selten eingesetzt, weil AMD kurz darauf die eigene Erweiterung 3DNow! Herausbrachte die noch leistungsfähiger war und Intel nach drei Jahren MMX durch SSE ersetzte.

MRAM

Magnetoresistive Random Access Memory - MRAM ist eine Technologie die im Idealfall die Vorteile von Flash-Speichern (behält die Information ohne Stromversorgung) mit der von DRAM (schneller Schreibzugriff, beliebig oft wiederbeschreibbar) verbindet. Es gibt mehrere Technologien der Umsetzung. Allen gemein ist das die Fertigung sehr aufwendig ist und schon kleine Abweichungen in den Speicherzellen zu einer hohen Ausfallrate führen. MRAM sind daher im Jahre 2022 relativ teuer - 50-mal teurer als Flash-Speicher. MRAM wird dort eingesetzt, wo die Sicherung von Daten bei Ausfällen sehr wichtig ist wie Steuerungen aber auch Experimenten von Raumsonden.

Out-of-Order Execution

Moderne Prozessoren haben jede Ausführungseinheit mehrfach. Es gibt also mehrere Decoder, mehrere ALU etc. Damit können sie mehr als einen Befehl pro Takt ausführen, das ist das Maximum das man alleine durch eine Pipeline erreicht. Doch es gibt Abhängigkeiten. In der folgenden Berechnung:

D:=A+B*C

muss zuerst das Produkt von B*C berechnet werden, bevor dieses zu A addiert werden kann. Die Anweisung "Addiere B*C zu A" ist also abhängig von der Anweisung "Berechne B*C". Dies hält den Programmfluss auf, denn so kann nicht die eine Anweisung von ALU1 und die andere von ALU2 berechnet werden. Bei einer Out-Of-Order (OOO) Architektur zieht der Prozessor daher Befehle vor, die dann natürlich nicht von den vorhergehenden abhängig sein dürfen. Ohne dieses Feature sind Prozessoren viel langsamer. Intel setzt die OOO-Architektur z. B. nicht in den Atoms ein, die bei gleichem Takt nicht mal halb so schnell wie die nächst höhere Klasse sind.

PIO

Vor Einführung des Chipsatzes war die PIO (Paralell Input/Output) ein eigener Baustein. Über ihn wurden Peripheriegeräte mit der CPU verbunden die über mehrere Datenleitungen verfügten. Das waren z. B. die Tastatur, Druckerport oder Joystickport. Eine PIO definierte mehrere Ports, über die die Geräte angeschlossen werden konnten, die populäre 8255 von Intel hatte z. B. zwei 8 Bit und zwei 4 Bit Ports. Sie speicherte ein Datenwort zwischen und unterrichtete die CPU von einem Ereignis durch ein Interruptsignal. So konnte die CPU ein Programm ausführen, ohne dauernd ihre Ein-/Ausgabepins abzufragen, ob neue Signale anliegen. Heute ist eine PIO im Chipsatz integriert.

Pipeline

Jeder Befehl durchläuft einen Maschinenzyklus und damit mindestens drei Phasen, die mindestens einen Takt benötigen. Die Ausführungszeit eines Befehls beträgt dann mehrere Takte. Bei den Prozessoren Z80, 8086 und 68000 im Mittel zwischen 6 und 8 Takten. Um die Geschwindigkeit zu steigern, wurde die Pipeline eingeführt. Sie nutzt aus, das bei jeder Phase des Maschinenzyklus ein anderer Teil des Prozessors aktiv ist. Bei einer Pipeline holt der Prozessor bei jedem Takt Daten vom Speicher, gibt sie im nächsten Takt an den Decoder weiter und holt neue Daten. Der Decoder bekommt bei jedem Takt neue Daten, dekodiert sie und leitet sie Befehle beim nächsten Takt an die Ausführungseinheit(en) weiter, die sie ausführt. Im Optimalfall kann mit einer Pipeline so die Zahl der Takte pro Befehl auf 1 reduzieren. In der Praxis wird dies aber nicht erreicht, weil ein Befehl eine Ausführungseinheit blockieren kann, bis er ausgeführt ist und dies dauert nach wie vor mehrere Takte. Um dieses Problem zu lösen muss eine OOO-Architektur eingeführt werden. Pipelines wurden recht schnell als Mittel für die Beschleunigung des Ablaufs entdeckt und schon Anfang der Sechziger Jahre eingesetzt. In der x86-Linie wurde die Pipeline beim 80286 eingeführt, was neben anderen Verbesserungen zum größten Geschwindigkeitssprung in der x86 Linie (Faktor 2,4) führte. Die Länge einer Pipeline wird in Pipelinestufen gemessen. Sie liegt heute bei 10 bis 20, je komplexer die Befehle und je höher der Takt, um so mehr Stufen sind es, weil pro Stufe weniger Zeit zur Ausführung bleibt. Den Rekord hält der Pentium 4, dessen Architektur auf einen hohen Takt ausgelegt war. Einige Versionen hatten eine Pipeline mit 30 Stufen.

Ports

Ein Port hängt am Scheduler eines Prozessors und leitet Befehle zu den eigentlichen Ausführungseinheiten weiter. An jedem Port hängt mindestens eine, meistens aber mehrere Ausführungseinheiten. Das liegt daran, dass eine Einheit hochspezialisiert sein kann, z. B. nur Vektoroperationen oder nur Shiftoperationen durchführt. Es liegt aber auch daran, dass eine Einheit durch einen Befehl längere Zeit blockiert sein kann, sodass man mit einer weiteren Einheit eine Blockade vermeidet. In der Core Mikroarchitektur wurde die Zahl der Ports von sechs bei der ersten auf bis zu 17 bei den E-Kernen der 12-ten Generation erhöht. Je mehr Ports eine Architektur hat, desto mehr Befehle können gleichzeitig bearbeitet werden.

Core MikroarchitekturProzessoraufbau

Das linke Diagramm zeigt den Aufbau der Core-Mikroarchitektur. Sie zeigt die Elemente, die in diesem Artikel besprochen werden. Es beginnt mit dem Fetch, der einen Bitstrom zum Decoder liefert. Eine Queue puffert den Bitstrom ab. Der Decoder nutzt zum Dekodieren ein Microcode-ROM. Die "Rename Alloc Unit" und der "Retirement Buffer" sind Elemente der OOP-Eingine. Sie sind eine Besonderheit der x86-Architektur, da sie intern nicht mit dem x86 Befehlssatz, sondern einem einfacheren RISC-Befehlssatz, den MikroOps arbeitet. Dazu muss die x86-Architektur mit ihren wenigen Registern auf die interne Architektur gemappt werden. Die OOP-Engine ordnet die Befehle neu an, sodass sie parallel ausgeführt werden können und generiert MikroOps. Diese MikroOps leitet sie an den Scheduler weiter. Dieser verfügt als Ausgänge hier fünf Ports an denen jeweils eine oder mehrere Ausführungseinheiten hängen. Sie führen die Befehle aus. Neben Berechnungen gibt es auch Lade- und Speicherbefehle. Sie werden weiter an den Datencache geliefert der dann mit dem Level 2 Cache verbunden ist (der Instruktionscache und die Branch Pediction Unit fehlen auf diesem Diagramm, sie sind vor dem Fetch einzusortieren).

Queue

In einem Prozessor gibt es zwischen den einzelnen Subeinheiten oder als Bestandteil dieser Queues, also Warteschlangen. In einer Queue werden neue Befehle hinten eingespeist und vorne Befehle entnommen, sie funktionieren also nach dem FIFO-Prinzip (First In - First Out). Daher auch der deutsche Begriff Warteschlange, da sie genau einer Warteschlange an einer Supermarktkasse entsprechen. Der Zweck von Queues ist eine Entkopplung der Einheiten. Jede kann mit voller Leistung arbeiten. Sie muss nicht warten, bis eine nachfolgende Einheit Befehle abnimmt. Queues dienen als Puffer und sind im Laufe der Entwicklung immer größer geworden.

Register

Die internen Speicherplätze in einem Prozessor nennt man Register. Für eigene Speicherplätze im Prozessor gibt es eine Reihe von Gründen:

Die Zahl der Register ist von Architektur zu Architektur unterschiedlich. Im Allgemeinen steigt die Registerzahl aber mit der Bitbreite des Prozessors, das heißt 32 Bit Prozessoren haben mehr Register als 16 oder 8 Bit Prozessoren. Bei sehr vielen Registern ist auch die Benutzung eines Registerfiles üblich. Dies ist ein guter Kompromiss zwischen Codelänge (je mehr Register es gibt, desto mehr Bits benötigt man, um sie zu adressieren) und dem Nachteil weniger Register das man nur wenige Werte in den Registern halten kann und viele Lade- und Speicheranweisungen hat, die dann viel Zeit verschlingen. Bei einem Registerfile sind nur eine bestimmte Zahl an Registern sichtbar, man wählt jeweils ein Fenster aus dem Satz, z. B. 32 Register aus 512 Register. Ein weiterer Vorteil ist, dass Unterprogramme für Parameter und lokale Variablen so eigene Fenster haben können, die man schnell auswechseln kann.

Auch unterscheidet kann man nach Art der Register. Es gibt allgemein verwendbare Register, der häufigste Ansatz. CISC Architekturen haben oft Spezialregister. Bestimmte Befehle nutzen dann nur ein Register. So spart man sich die Dekodierung des Registers im Opcode. Beispiele sind das CX Register für Zähler in der 8086 oder das HL Register für Speicheroperationen in der 8080/Z80. Einige Architekturen haben aber auch zwei Registersätze. Ein Registersatz für Berechnungen und einer für Adressen. Werte in die Rechenregister kann man dann nur über die Adressregister laden. Diese Architektur eignet sich vor allem dann, wenn sehr viele sequentielle Daten verarbeitet werden und wurde von Seymour Cray in seinen Supercomputern verwendet.

RISC

RISC steht für Reduced Instruction Set. De Bezeichnung stammt aus den Achtzigern, als viele neue Architekturen als RISC-Architekturen entwickelt wurden, wie MIPS, ARM und SPARC. Architekturen nach diesem Ansatz gab es aber schon immer. RISC versucht die Komplexität einer CPU gering zu halten, indem sie nur elementare befehle unterstützt. Dazu gehört auch eine Beschränkung auf die wichtigsten Adressierungsarten. Den Nachteil das ein komplexer Befehl einer CISC-Architektur mehr RISC Befehle nötig macht, gleicht man aus, indem diese Befehle schnell ausgeführt werden kann, auch weil das Befehlsformat einheitlich ist, was ein vorausschauendes Lesen in die Pipeline ermöglicht. Weiterhin haben RISC Architekturen typischerweise viele interne Register um langwierige Lade- und Speicheranweisungen zu vermeiden. Ein Beispiel für RISC sind aber auch die Cray Supercomputer die alle typischen RISC Elemente haben: nur 128 Befehle, 128 interne Register, nur zwei Befehlsformate. Gemessen an ihrer Rechenleistung kamen sie mit erstaunlich wenig Transistorfunktionen aus - 220.000 Gatter was in etwa 1-2 Millionen Transistoren entspricht, das ist die Transistorzahl des 32 Bitters 80486, nur war die Cray 1 ein 64 Bitter mit Vektoroperationen und rund 80-mal schneller als ein 80486.

Scheduler

Der Scheduler ist Bestandteil eines super-skalaren Prozessors. Dieser hat mehrere Ausführungseinheiten. Die Aufgabe des Scheduler ist es Befehle an die jeweils passenden und freien Ausführungseinheiten zu verteilen. Er überwacht welche Einheiten belegt sind und welche nicht. Dazu hat er mehrere Ports und eine Warteschlange, da auch keine der benötigten Funktionseinheiten frei sein können. Scheduler ist die Bezeichnung für diese Einheit bei Intel und AMD, je nach Prozessorhersteller kann sie auch andere Namen haben. Beim ersten superhelikalen Computer der CDC 6600 heiß sie z.B. ScoreBoard.

SD-RAM

Synchronous Dynamic Random Access Memory ist der Vorläufer von DDR-RAM. Seit Mitte der Achtziger Jahre waren bezahlbare DRAM Bausteine zu langsam für moderne Prozessoren. Es wurden Lösungen entwickel,t um das Manko zu beheben. Zuerst gab es Caches. Doch das alleine reichte nicht. Die in SD-RAM verwendete Lösung ist, dass alle Daten sowieso erst einmal in einem Cache landen. Ein Cache holt sich aber vom Speicher nicht einzelne Bytes, sondern einen kleinen zusammenhängenden Block, eine Cacheline, die typisch 32 oder 64 Bytes groß ist. SD-RAM überträgt nach der Anfrage von sich aus diesen Block im Systemtakt des Busses (der nicht unbedingt der Takt des Prozessors sein muss). Dies geht, weil schon beim ersten Lesezugriff der Speicher intern die folgenden Zellen auf das Auslesen vorbereitet und die Daten in internen Puffern vorhält. Mit einher geht, dass bei SD-RAM mehrere RAM-Chips zusammenarbeiten müssen, damit sie synchron die Daten übertragen. Sie sitzen daher auf kleinen Modulen mit Controllerchips, den DIMM Modulen anstatt wie vorher in Sockeln im Mainboard. SD-RAM hat dieselbe Zugriffszeit wie die Bausteine, aber der vorher übliche Handshake, für die abfrage weiterer Bytes entfällt, und die Datenrate ist so erheblich höher.

SIMD

SIMD steht für Single instruction, multiple data. Die meisten Prozessoren verarbeiten pro Befehl einen Wert oder machen eine Rechnung, wenn die Daten schon in Registern stehen. Unter SIMD versteht man, das ein Prozessor mehrere Daten auf einmal verarbeitet. Dies kann in zwei Arten geschehen:

Es kann sein, das ein normales Datenwort nicht als ein Wort, sondern mehrere kleine Subworte mit kleinerem Wertebereich angesehen wird. Zum Beispiel ist der Bildschirmspeicher so organisiert, das jedes Pixel drei Bytes mit den Helligkeiten der Primärfarben Rot-Grün-Blau enthält. Ein Viertes Byte informiert über die Transparenz: das ist wichtig, wenn etwas über den Hintergrund gelegt wird, z. B. ein Fenster verschoben wird. Bei SIMD könnte ein Prozessor ein 32 Bit Wort als vier dieser acht Bit Werte interpretieren. Das ist nicht das gleiche, wie wenn er dieselbe Berechnung mit dem 32 Bit Wort durchführt, da jeder Teilwert überlaufen kann: würde man z. B. zu der Helligkeit von 200 noch 100 addieren so würde bei einer normalen Addition nicht 300, sondern 44 herauskommen, da der Wertebereich von Bytes bei 256 endet. Intel setzte dies zuerst bei MMX (Multimedia-Extensions) ein. Dort noch begrenzt auf ganze Zahlen. Mit SSE als Nachfolgetechnologie konnten auch mehrere Fließkommazahlen parallel bearbeitet werden z. B. anstatt einer doppelt genauen zwei einfach genaue Zahlen.

Die zweite Variante kombiniert SIMD mit VLIW. Das Datenwort ist also überlang und enthält mehrere Werte. Dies setzt Intel bei AVX ein, wo ein Datenwort bis zu 512 Bit lang sein kann und bis zu acht Werte enthalten kann.

SMT

Symmetrisches Multithreading ist eine Technologie, welche die Funktionseinheiten eines Prozessors besser ausnutzt. Je mehr Funktionseinheiten ein Prozessor hat, desto wahrscheinlicher sind einige davon unbenutzt. Bei SMT wird die Architektur soweit erweitert, dass es einen zweiten Registersatz gibt. Dem Betriebssystem werden dann pro physikalischem Kern zwei logische Kerne gemeldet. Der dahinter steckende Ansatz ist das ein zweiter, vom ersten unabhängiger Thread die Einheiten besser auslastet.

SMT wurde von Intel als "Hypterthreading" bei den Pentium 4 eingeführt, brachte bei dieser Generation aber nur eine bescheidene Mehrleistung von 10 bis 15 Prozent. Danach erschienen die nächsten Generationen ohne Hyperthreading. Seit der fünftem Generation gab es SMT bei den leistungsfähigeren Exemplaren. Seit der 10-ten Generation haben alle Prozessoren der "Core ix" Bezeichnung Hyperthreading, nach der persönlichen Meinung des Autors auch eine Reaktion Intels, da inzwischen die Zen Architektur von AMD Intel in der Performance überholt hat. Da die Prozessoren inzwischen viel mehr Funktionseinheiten als der Pentium 4 haben, bringt SMT einen deutlichen Mehrgewinn von etwa 30 Prozent.

SIO

Das Gegenstück zur PIO ist die Serial Input/Output Einheit. Früher war dies ein eigener Baustein, heute Bestandteil des Chipsatzes. Andere Bezeichnungen sind UART (Universal asynchronous receiver-transmitter) oder DART (Direct asynchronous receiver-transmitter). Eine SIO bedient Schnittstellen, bei denen die Bits eines Bytes seriell nacheinander übermittelt werden. Dies sind z. B. die RS-232 Schnittstelle für Modems und IEC-485 Schnittstelle für Messgeräte. Bei diesen Schnittstellen wird eine feste Datenrate zwischen zwei Geräten ausgemacht und die SIO muss die Bits präzise mit einer festen Dauer übermitteln. Typisch werden dann noch Stop/Startbits definiert. Auch heute ist serielle Kommunikation wichtig. Jedoch nicht für Modems, sondern die USB Schnittstelle ist eine serielle Schnittstelle und mit einfachen Adaptern kann man an einen USB-Port ein Gerät mit RS-232 Schnittstelle anschließen.

Skalar

Skalar bedeutet in der Computersprache das die Daten aus einfachen Werten bestehen. Dies sind Ganzzahlen oder Fließkommazahlen. Das ist der Normalfall. Die Ergänzung dazu sind Vektoren, das sind Daten aus Feldern (Arrays). Jede skalare Architektur kann auch -vektoren verarbeiten, aber nur elementweise.

SRAM

SRAM ist die Abkürzung für Static RAM oder Static Random Acess Memory. Der Begriff ist irreführend, weil SRAM nicht dahingehend "statisch" ist, dass er die Information behält. Das leisten andere Technologien wie das EPROM/EEPROM, der Flash-Speicher oder als neueste Technologie MRAM. Wie DRAM verliert SRAM seine Daten, wenn der Strom abgeschaltet wird. Statisch ist dahingehend gemeint, dass die Daten aber erhalten bleiben, solange er Strom bekommt, während der Speicherinhalt bei DRAM dauernd aufgefrischt werden muss. Technisch besteht SRAM Speicher aus Flip-Flops. Elemente die dauernd ihren Zustand wechseln, wenn ein Bit mit der Bedeutung "1" eingespeist wird, oder eben nicht, wenn das Bit Null ist. Je nach Geschwindigkeit besteht ein SRAM Flip-Flop aus vier bis sieben Transistoren pro Bit. Er ist damit erheblich komplexer und teurer als DRAM, erreicht aber die Geschwindigkeit die auch Prozessoren haben und wird daher für die Register und Caches eingesetzt.

SSE

SSE (Streaming SIMD Extensions) wurde als Nachfolgetechnologe 1999 beim Pentium III eingeführt. Es ist eine SIMD-Erweiterung. Gegenüber MMX wurde vieles verbessert. Es gab nun auch die Unterstützung für 32 Bit Fließkommazahlen anstatt nur Ganzzahlen. Weiterhin hatte SSE nun eigene Register, während MMX die FPU-Register nutzte, sodass beide Modi sich gegenseitig ausschlossen. Die Register waren nun auch 128 Bit lang, was die gleichzeitige Bearbeitung von vier 32 Bit Werten ermöglichte. SSE2 führte dann auch das gleichzeitige Bearbeiten von zwei 64 Bit Werten ein. Die weiteren Versionen SSE3 und SSE4 erweiterten den Befehlssatz, die neuen Befehle wurden aber nur für spezielle Probleme wie AES oder Bitzählung benötigt.

SSE wurde schließlich durch die noch weitergehende Erweiterung AVX abgelöst.

Superskalar

Mit einer Pipeline kann der Durchsatz eines Prozessors auf einen Befehl pro Takt gesteigert werden, da bei jedem Takt ein Fetch die Pipeline füllt. Will man mehr Anweisungen pro Takt bearbeiten, so muss die Architektur superskalar sein. In der Computersprache spricht man von "skalar" wenn einzelne Daten, also eine ganze Zahl oder ein Zeichen auf einmal bearbeitet wird. Superskalar bedeutet, dass die Ausführungseinheiten mehrfach vorhanden sind. Damit kann ein Prozessor mehrere Befehle während eines Taktzyklus ausführen, da jeder Befehl eine Ausführungseinheit für die Ausführungszeit blockiert. Der erste superskalare Computer war die CDC 6600, die Mitte der sechziger Jahre zehn Funktionseinheiten hatte. Intels letzte, 12-te Generation "Alder Lake" hat bis zu 37 Funktionseinheiten.

Taktfrequenz

Schon seit Anfang der Computer führte man den Takt als Antriebsfeder der Verarbeitung ein. Dies lehnt sich an die Fließbandarbeit ein, die auch getaktet ist. Der Prozessor erhält seinen Takt von einem externen Quarzkristall, der mit einer festen Frequenz, aufgrund des piezoelektrischen Effekts, schwingt. Heute ist der Taktgeber im Prozessor selbst integriert. Bei jedem Takt führt der Prozessor eine Teiloperation aus. Es werden also Gatter geschaltet, wobei ein Signal für eine Operation üblicherweise mehrere Gatter durchlaufen muss. Der Takt muss sich nach der maximalen Durchlaufzeit einer Teiloperation richten. Jedes Gatter verzögert um eine bestimmte Zeit. Einen höheren Takt erhält man durch schneller schaltende Gatter. Wird der Takt höher, so ist auch die Ausbreitungsgeschwindigkeit des Signals selbst zu berücksichtigen. In elektrischen Leitungen können Elektronen die das Signal verbreiten, mit 2/3 der Lichtgeschwindigkeit, rund 200.000 m/s weitergeben. Das ist viel, bei 1 GHz werden pro Takt aber nur 20 cm zurückgelegt. Bei Großrechnern, bei denen die CPU aus einem ganzen Schrank mit etlichen Boards und zwischen ihnen einer Verdrahtung bestehen, spielte die Geschwindigkeit in den Leitungen daher schon Ende der Siebziger Jahre eine Rolle, bei Crays Supercomputern kann man sehen, wie diese mit steigendem Takt immer kleiner wurden.

Bei mehreren Gigahertz Takt rückt die Leitungs- / Streckengeschwindigkeit eines Signals auch bei Mikroprozessoren in einen Bereich vor, der von Bedeutung ist. Zwar sind diese nur 1 - 2 cm groß, aber die Leitungen sind dort nicht aus Kupfer, sondern schlechter leitendem Aluminium und der Weg ist nicht gerade, es gibt Kurven und Verzweigungen und es werden zusätzlich noch auf dem Weg Gatter passiert. Seit Beginn der Mikroprozessoren wurde der Takt bedeutend gesteigert: von 0,74 MHz beim 4004 (1971) auf 3,8 GHz beim Pentium 4 extreme Edition (2005). Danach gab es nur noch leichte Steigerungen. Nur wenige Prozessoren sind heute (2022) schneller als 5 GHz, keiner hat 6 GHz erreicht.

TLB

Translation Lookaside Buffer (TLB) sind ein Werkzeug der virtuellen Speicherverwaltung. In ihnen merkt sich der Prozessor, welche logischen Adressen in welche physikalischen Adressen umgesetzt werden müssen. Die logischen/virtuellen Adressen sind die im Programmcode eines Threads verwendeten. Die physikalischen die tatsächlichen Adressen im Arbeitsspeicher. Dieser Mechanismus ist relativ aufwendig, die entsprechenden Umsetzungstabellen liegen zum größten Teil im RAM. Um die Suche in den Tabellen zu verkürzen, hat jeder Prozessor eine kleine Anzahl an Tabelleneinträgen intern als Cache. TLB sind ein Bestandteil der Adressierung des Prozessors, genauer gesagt der Memory Management Unit.

Vektoren

Vektoren sind das Gegenteil von Skalaren. Sie stehen in der Computersprache für ein Feld oder Array von Werten, also Werten vom denselben Datentyp, hintereinander angeordnet und meist durch einen Index angesprochen. Vektoren sind die Lösung die Geschwindigkeit zu erhöhen, wenn man mit der Superskalarität nicht mehr weiter kommt. Der grundlegende Mechanismus ist: man weiß bei einem Array, dass eine Operation sich nicht auf einen Wert bezieht, sondern alle Werte des Arrays und kann daher schon vorausschauend die nächsten Daten laden und den Recheneinheiten zuführen.

Es gab verschiedene Konzepte. Beim TI-ASC basierte die Architektur auf Vektoren, die aus dem Speicher gelesen wurden. Das setzte sich nicht durch, weil der Speicher so viel langsamer war, das erst nach rund 100 Werten eine gleichmäßig hohe Geschwindigkeit erreicht wurde. Die zeitgleich erschienene Cray 1 hatte Vektorregister die jeweils 64 Werte aufnahmen. Ein Befehl las also gleich 64 Werte auf einmal ein und bei jedem Takt konnte eine Operation durchgeführt werden. Da es getrennte Funktionseinheiten für Addition und Multiplikation gab, konnten diese parallel durchgeführt werden was dann 2 FLOPs pro Takt ergab. Diese Architektur setzte Cray über zwei Jahrzehnte ein. Intel verwendet bei AVX ein modifiziertes SIMD-Konzept. Ein Befehl arbeitet nicht mit einem Fließkommawert, sondern je nach AVX Version einem 256 oder 512 Bit langen Datenbündel, das dann mehrere einfach-genaue (32 Bit Größe) oder doppelt genaue (64 Bit Größe) Zahlen erhält. Bei einer Operation wird bei AVX-512 und 64 Bit langen Zahlen also eine Rechnung mit gleich acht Zahlen durchgeführt. Dafür gibt es eigene Rechenwerke und Register die auch 256 oder 512 Bit lang sind. Ähnliche Vektorerweiterungen gibt es auch bei anderen Architekturen wie Altivec beim Alpha Mikroprozessor.

In der Praxis hängt die reale Geschwindigkeit davon ab, wie gut der Compiler diese Architekturen unterstützt. Bei den Cray Supercomputern ging dies recht gut, ein Test der Computerzeitschrift ct' bei einem trivialen Beispiel zeigte aber, das Compiler wie sie Programmierer nutzen, von Intel und Microsoft, hier oft nur einen Bruchteil der theoretischen Leistung herausholen.

Virtueller Speicherverwaltung

Bei einem Prozessor der mehr als ein Programm gleichzeitig ausführen kann, also einem Multi-Tasking oder sogar Multi-User fähigem Prozessor (ab der 32 Bit Generation) ist die Speicherverwaltung aufwendig. Wenn ein Programm nach der Beendigung geschlossen wird, hinterlässt es eine Lücke im Speicher. Diese Lücken werden immer mehr und es wird für das Betriebssystem immer schwieriger ein Programm zu finden, das in eine Lücke passt. Die Lösung für das Problem ist virtueller Speicher. Bei einem virtuellen Speicher kann der Prozessor mehr Speicher adressieren als er tatsächlich physikalisch ansprechen kann. Bei den ersten 32 Bit Prozessoren standen z. B. 40 anstatt 32 Bit für die Adressierung zur Verfügung. Innerhalb dieses viel größeren Adressraums kann nun jedes Programm seinen eigenen logischen Speicher haben, der im Extremfall genauso groß sein kann wie der physikalische Adressbereich. Über die MMU und ihre Übersetzungstabellen wird jede Adresse in die korrekte physikalische Adresse übersetzt. Ein zweiter Einsatz von virtuellem Speicher ist es, nicht existierenden Speicher zu ersetzen. Der Intel 80386 Prozessor erschien z. B. 1985, die ersten Rechner, die ihn einsetzten, hatten 4 MB RAM, der Prozessor konnte aber 4 GByte Adressieren. Es sollte 20 Jahre dauern, bis PC diese Speicherausstattung auch tatsächlich hatten. In diesem Falle meldet die virtuelle Speicherverwaltung eine Exception (Ausnahme), wenn der Speicher nicht zur Verfügung steht und das Betriebssystem kann selten genutzte Speicherbereiche auf die Festplatte auslagern und den freien Speicher zur Verfügung stellen. Bis heute findet sich eine solche Auslagerungsdatei namens "pagefile.sys" bei Windows im Stammverzeichnis.

VLIW

VLIW steht für Very Long Instruction Word. Das bedeutet ein Wort, das kann ein Datenwort oder Befehlswort sein, ist länger als die Architektur des Prozessors es zulässt. Es gibt davon zwei Spielarten. Bei der einen sind es überlange Datenworte. Bei Datenworten kommt dann immer auch SIMD ins Spiel, weil natürlich der Prozessor maximal so lange Daten verarbeiten kann, wie seine Architektur es zulässt. Diese Variante findet man in Signalprozessoren von Texas Instruments, die ausnutzen, dass der Prozessor einen getrennten Bus für Daten und Code hat und so mehr Daten transferieren kann. Ebenso nutzt die AVX Erweiterung von Intel VLIW.

Die zweite Anwendung ist ein überlanges Codewort. Bislang wurde dies nur bei dem Intel Itanium Prozessor eingesetzt. Drei Einzelbefehle ergaben ein 128 Bit langes Wort. Der Prozessor selbst war ein 64 Bit Prozessor. Der Sinn dahinter war, dass der Compiler so Befehle besser kombinieren kann, dass sie parallel ausführbar sind, selbst wenn Teile des Befehlsworts dann leer sind. Das Konzept ging aber nicht auf: der Itanium erreichte nie die in ihn gesetzten Erwartungen.

Wort

Unter einem Wort versteht man die Anzahl der Bits, die der Architektur eines Prozessors entspricht, also 16, 32 oder 64 bei heutigen Prozessoren (historisch gab es auch andere Wortgrößen wie 12, 18, 24, 30 oder 36 Bit). Der Datenbus transferiert im Normalfell immer ein Wort. Intern kann dieses Wort dann in kleinere Teile aufgeteilt werden wie Bytes. Bei RISC Prozessoren sind die Befehlsformate so ausgerichtet das sie immer ein Vielfaches eines Worts belegen. Bei CISC Prozessoren dominiert dagegen die variable Länge.

Bei Großrechnern dominierte bis in die achtziger Jahre auch die wortweise Adressierung und nicht die byteweise Adressierung. Der einzige dem Autor bekannte Mikroprozessor, der eine Wortweise Adressierung hatte, war der TMS 9900/9995. Aufgrund der Wichtigkeit von Textverarbeitung bei frühen Mikroprozessoren (im Kontrast zur Zahlenverarbeitung bei größeren Plattformen) adressieren aber fast alle heutigen Mikroprozessoren den Speicher byteweise.

Links

Die folgenden Links verweisen auf weiterführende Artikel im Bereich Prozessorarchitektur:

Speicherarchitektur und Caches

Vertiefend: Caches: Ihr Aufbau und ihre Organisation

Paralleles Rechnen: Technologien wie man die Geschwindigkeit steigert

SIMD und VLIW: Erklärung der Technologien

RISC und CISC: Erklärung der Gegensätze (allgemein)

CISC/RISC- historische Entwicklung

Adressierung: Eine genauere Erklärung der Adressierungsarten und -schema

Abläufe im Prozessor: Wie die einzelnen Einheiten zusammenarbeiten.

Pipelines und Sprungvorhersage: Wie eine Pipeline funktioniert



© des Textes: Bernd Leitenberger. Jede Veröffentlichung dieses Textes im Ganzen oder in Auszügen darf nur mit Zustimmung des Urhebers erfolgen.

Zum Thema Computer ist auch von mir ein Buch erschienen. "Computergeschichte(n)" beinhaltet, das was der Titel aussagt: einzelne Episoden aus der Frühzeit des PC. Es sind Episoden aus den Lebensläufen von Ed Roberts, Bill Gates, Steve Jobs, Stephen Wozniak, Gary Kildall, Adam Osborne, Jack Tramiel und Chuck Peddle und wie sie den PC schufen.

Das Buch wird abgerundet durch eine kurze Erklärung der Computertechnik vor dem PC, sowie einer Zusammenfassung was danach geschah, als die Claims abgesteckt waren. Ich habe versucht ein Buch zu schreiben, dass sie dahingehend von anderen Büchern abhebt, dass es nicht nur Geschichte erzählt sondern auch erklärt warum bestimmte Produkte erfolgreich waren, also auf die Technik eingeht.

Die 2014 erschienene zweite Auflage wurde aktualisiert und leicht erweitert. Die umfangreichste Änderung ist ein 60 Seiten starkes Kapitel über Seymour Cray und die von ihm entworfenen Supercomputer. Bedingt durch Preissenkungen bei Neuauflagen ist es mit 19,90 Euro trotz gestiegenem Umfang um 5 Euro billiger als die erste Auflage. Es ist auch als e-Book für 10,99 Euro erschienen.

Mehr über das Buch auf dieser eigenen Seite.

Hier geht's zur Gesamtübersicht meiner Bücher mit direkten Links zum BOD-Buchshop. Die Bücher sind aber auch direkt im Buchhandel bestellbar (da ich über sehr spezielle Themen schreibe, wird man sie wohl kaum in der Auslage finden) und sie sind natürlich in den gängigen Online-Plattformen wie Amazon, Libri, Buecher.de erhältlich.

Sitemap Kontakt Impressum / Datenschutz Neues Hier werben / advertisment here Buchshop Bücher vom Autor Top 99