Zusammenarbeit von CPU und Arbeitsspeicher

Einführung

Die funktionsweise des menschlichen Gehirns ist dem des Computers viel ähnlicher, als es zunächst erscheinen mag. So wie wir über ein Langzeitgedächtnis und ein Kurzzeitgedächtnis verfügen, so gibt es im Computer Massenspeicher und Arbeitsspeicher, die die gleichen Aufgaben erfüllen. Das Gehirn verfügt ebenfalls über eine Steuereinheit, die Informationen bei Bedarf abrufen kann, was beim Computer dem Prozessor entspricht. Außerdem gibt es Adern und das Herz, die den Datenbahnen und dem Chipsatz auf dem Mainboard entsprechen. Häufig wird gesagt, dass die CPU das Herz in einem Computer ist. Wenn man aber genau hinschaut, und die Funktionsweise der Maschine betrachtet, wird klar, dass es im Eigentlichen der Chipsatz ist, der das System pulsieren lässt.

Auf dem Mainboard gibt es eine ganz besondere Ader, die Hauptschlagader. Hierbei handelt es sich um den Frontside Bus (FSB), die Datenbahn zwischen Prozessor und Arbeitsspeicher. Auf dieser Datenbahn befindet sich der Memory Controller Hub. Falls Sie den Begriff „Northbridge“ schon einmal gehört haben: Damit ist der Memory Controller Hub gemeint, also der Chip auf dem Frontside Bus. Der Memory Controller Hub enthält die Speichersteuereinheit Memory Controller. Der Memory Controller verwaltet alle Leitungen vom Hauptspeicher, die zum Prozessor oder den AGP/PCI-Schnittstellen führen. Die Leitungen zu Caches, die sich nicht in der CPU befinden, werden zwar auch vom Memory Controller angepsrochen, allerdings nicht über den Frontside Bus, sondern über den Backside Bus. Für Informationen, die der Prozessor im externen Cache lagert, braucht der Memory Controller nicht noch einmal seperat zum Arbeitsspeicher zu verbinden, sondern kann direkt die Informationen aus dem Cache verwenden.

Cache Memory

Cache Memory oder einfach nur Cache ist sozusagen die Zwischenablage für die Zwischenablage. Demnach handelt es sich um einen Grad an Perfektion bei der Speicherorganisation. Dies entspricht auch der Realität, denn der Cache ist eine relativ kleine Speicherbank, die möglichst Nahe an ihrer PU (Parent Unit) anliegt. Für den Prozessor kann es auf dem Board zwei und theoretisch auch noch mehr Caches geben. Es ist aber nicht üblich, dass mehr als ein Level auf einem Board eingebaut wird. Gleichzeitig ist es aber üblich, dass ein PC zwei Prozessor-Caches hat. Wie kann das dann sein, wenn es doch üblicherweise nur einen Cache auf dem Mainboard gibt? Der Trick liegt darin, dass direkt im Prozessor eine Speichereinheit angelegt ist, die ebefalls als Cache fungiert.

Jeder Cache, der zur CPU gehört wird über seinen Level klassifiziert. Je näher eine Cache Einheit an der CPU sitzt, desto niedriger ist der Level. Den kleinsten Level hat natürlich der Cache in der CPU selbst, nämlich 1. Dieser Cache wird dann als L1-Cache bezeichnet, wobei das L für Level steht. Gemäß dieser Konvention steht L2-Cache für Level 2 Cache, L3-Cache für Level 3 Cache. Ein Beispiel für Informationen, die im L1-Cache liegen sind z.B. die Tastaturcodes. Weil die Codes jedes mal die gleichen sind und sie häufig benötigt werden, erscheint es logisch, dass eine prozessornahe Speichereinheit für die Ablage in Betracht gezogen werden sollte.

Möglicherweise fragen Sie sich nun, warum nicht einfach der komplette Speicher möglichst nah an die CPU gebaut wird. Tatsächlich wird dies versucht, aber es gibt einen sehr bedeutsamen Unterschied zwischen dem Arbeitsspeicher und Cache. Anders als Speichermodule, die mit DRAM arbeiten, wird in Cache der sehr viel schnellere SRAM eingesetzt. SRAM benötigt deutlich mehr Platz als DRAM, was deshalb problematisch ist, weil der Cache direkt auf dem Mainboard angebracht ist. Unter Berücksichtigung des Platzes für die SRAMs, werden die Speicherbänke für die DRAM-Module so nah wie möglich an der CPU angebracht.

Bei genauer Überlegung ist es aber auch nicht sinnvoll, sämtlichen Speicher zu Cache aufzuwerten. Der Cache wurde dafür angelegt, stark frequentierte Daten zu speichern. Würde der Cache vergrößert, könnten zwar mehr Daten gehalten werden, fraglich wäre aber, ob die Frequentierung eine Speicherung im Cache überhaupt rechtfertigt. Eine Übertreibung würde nämlich dazu führen, dass der Hauptvorteil der Geschwindigkeit sich ins Gegenteil verkehrt. Der Cache profitiert nämlich genau von seiner Schlankheit, weil wegen der geringen Kapazitäten kaum Adressierungszeiten anfallen. So werden im Gegensatz zu DRAM beim Cache überhaupt keine Spalten adressiert, sondern nur ganze Pages ausgelesen. Die Pages haben im Cache einen eigenen Namen und werden als Cache Lines bezeichnet.

Auf das Beispiel mit dem Schreibtisch bezogen, könnte der Vergleich folgendermaßen aussehen: Auf dem Schreibtisch stehen Fächer, in denen Dokumente liegen, die an diesem Tag benötigt werden. Ferner existiert ein einzelnen Blatt Papier, das direkt neben der Tastatur liegt. Auf diesem Blatt stehen essentielle Informationen, die bei fast jedem Arbeitsschritt benötigt werden. Diese Darstellung ist also eine Verfeinerung des Beispiels, über das wir eingangs gesprochen haben. Die Dokumente aus den Fächern müssen für einen Arbeitsschritt jedes Mal herausgenommen werden, das Blatt Papier jedoch kann ohne jede Mühe in Augenschein genommen werden. An diesem Beispiel wird auch offensichtlich, warum der Cache klein gehalten werden sollte. Würden fünf Blätter permanent auf dem Schreibtisch liegen, wäre der Hauptvorteil schon verflogen.

System-Zyklus

Bevor der System-Zyklus zum Maßstab aller Dinge wurde, wurde die Geschwindigkeit einer Komponente über ihre Zugriffszeiten in der unabhängigen Zeiteingabe ns gemessen. Diese Zeiten als jede Komponente im Computer ihr eigenes Süppchen gekocht hat sind lange vorbei. Der Speicher hat sich mit SDRAM in den System-Zyklus eingegliedert, was später einen enormen Fortschritt mit sich brachte. So wird seitdem auch die Geschwindigkeit der Speicher in MHz und nicht mehr in ns angegeben. Das gleiche gilt für die Latenzzeiten der Module, die in der Anzahl der Taktzyklen angegeben werden, die während einer bestimmten Aktion verstreichen. Dies hat den Vorteil, dass ein Vergleich zwischen zwei Komponenten ohne Umrechnungen durchgeführt werden kann. Die ersten SDRAM-Module mit 66MHz brachten in der Praxis noch nicht das volle Potential der SDRAMs zum Vorschein, denn selbst EDO-RAMs, die ebenfalls mit 66Mhz getaktet waren, konnten mit den Modulen noch mithalten. Aber schon bei den nächstschnelleren Modulen, nämlich den PC100-Modulen zeigten sich gravierende Unterschiede. Die Zugriffszeiten von 10ns für diese Module, hätten sich ohne sinnvolle Abstimmung mit einer zentralen Steuereinheit ohnehin nicht mehr nutzen lassen.

Der Systemzyklus wird nicht – wie häufig fälschlicherweise angenommen wird – vom Prozessor, sondern vom Chipsatz vorgegeben, insbesondere vom Memory Controller. Etwa vergleichbar mit dem Pendel einer Wanduhr verlaufen die Taktzyklen, die der Chip vorgibt. Der Takt wechselt allerdings nicht von links nach rechts, sondern von oben nach unten. Die Überlegung bei der Synchronisation ist folgende: Es ist möglich, dass ein Verbindungsaufbau zum Speicher umsonst war, oder dass der Systemtakt ein bisschen zu langsam ist für die eigentliche Leistungsfähigkeit der Module. Auf der anderen Seite ist die Verschwendung an Ressourcen noch viel höher, wenn der Speicher dem Chipsatz jedes mal erst anmelden muss, dass neue Daten bereitstehen. Diese Überlegung findet sich auch häufig in der Realität wieder. Ein Zug hält beispielsweise an jedem Bahnhof, unabhängig davon, ob jemand ein- oder aussteigen möchte. Auch Mülltonnen werden regelmäßig geleert, auch wenn sie nicht komplett gefüllt sind. Sperrmüll aber wird nur auf Anfrage abgeholt, weil der Bedarf viel geringer ist. Informationen aus dem Speicher werden nunmehr permanent benötigt, weshalb die Signalisierung, dass Daten anliegen nicht mehr praktikabel ist.

Gib mir Input …

Die genaue Adressierung des Arbeitsspeichers im Modul ist nur für den Memory Controller relevant. Alle anderen Komponenten gehen lediglich von einer Kapazität aus, die genutzt werden kann. Dieser Logik zur Folge kann der Prozessor nicht einfach beliebige Speicherzellen selektieren, sondern muss diese Aufgabe dem Memory Controller überlassen. Für den Prozessor ist das im wahrsten Sinne des Wortes die reinste Spaßbremse, weil durch die unabhängige Organisation viel Zeit verloren geht. Andererseits ist diese unabhängige Organisation des FSB unabdinglich für einen reibungslosen Verteilungsablauf und ebenso wichtig, wie seine Synchronisation. Hinzu kommt, dass der Memory Controller natürlich nicht unmittelbar auf eine Speicheranfrage auch die Antwort gibt. Der Prozessor muss also warten, bis die Antwort vom Memory Controller zurückkommt. Dieser jedoch bekommt auf seine Anfrage beim Speicher auch keine unmittelbare Antwort, sondern muss eine bestimmte Latenzzeit abwarten, bis das Ergebnis eintrifft.

Die Architektur eines Speichermoduls können Sie sich vorstellen, wie eine Tabelle. Die Zeilen dieser Tabelle heißen Banks – nicht zu verwechseln mit der Steckbank auf dem Mainboard – und enthalten weitere Untertabellen, nämlich die Speicherchips, die als Arrays bezeichnet werden. In einer Tabelle kann jede Zelle über einen Index referenziert werden, der die Spalten- und die Zeilennummer enthält. Alle Module – mit Ausnahme von Rambus – arbeiten mit der Kombination aus Multiplexing-Verfahren und Fast Page Mode. Multiplexing bedeutet, dass die Adressbits nacheinander geschickt werden und nicht gleichzeitig. Weil der RAM im Fast Page Mode arbeitet, wird zunächst das RAS-Signal angelegt und eine Folge von Signalbits gesendet, die dann Bank und Zeile bestimmen. Die ersten beiden Bits des Signals definieren die Bank. Die Idee, dass Chips zu Bänken gruppiert werden könnten ist deshalb sehr sinnvoll, weil auf diese Art und Weise parallel zwei, oder noch mehr Vorgänge, innerhalb des Moduls ablaufen können. Alle folgenden Bits stehen für die Zeilennummer dieser Bank.

Die adressierte Zeile wird in die Sense Amps (Signalverstärker) geladen und steht danach zur Selektion von einzelnen Zellen bereit. Wie geht das Laden der Zeile in die Sense Amps vonstatten? Für jede Spalte existieren zwei parallele CAS-Leitungen, die zunächst zu einer definierten Ladung, dem sogenannten Referenzpegel, aufgeladen werden. Dieser Vorgang nennt sich RAS Precharge und die für den Vorgang benötigte Zeit wird mit RAS Precharge Time tituliert. Sind beide CAS-Leitungen einer Spalte vollständig aufgeladen, so wird die Speicherzelle mit einer der Leitungen verbunden. Die Aufgabe des Sense Amp dieser Spalte ist es nun, die Differenz zwischen den beiden CAS-Leitungen zu messen, den Wert zu speichern und wieder in die Zelle zurückzuschreiben. Die Zeit, die vergeht bis alle Sense Amps ihre Daten gespeichert haben, wird als RAS-to-CAS-Delay bezeichnet. Für diese Zeit gibt es eine maximale Obergrenze, die dem Controller garantiert, dass die Daten bereitstehen und die Zellen dieser Bankzeile mittels CAS referenziert werden können. Wird das CAS-Signal gesendet, so wird der entsprechende Wert von den Sense Amps in den Output-Latch verschoben, von wo sie dann durch den Memory Controller abgeholt werden können. Der Vorteil dieser Vorgehensweise liegt auf der Hand: Liegt ein Page Hit vor, muss die Adresslogik nicht mehr für alle weiteren Zellen dieser Bankzeile zum Array verbinden, sondern kann direkt auf den Index in den Sense Amps zurückgreifen. Erst bei einem Page Miss muss das RAS neu angelegt werden.

Nach dieser Erläuterung wissen Sie auch, wofür die drei Parameter der PC-Spezifikation stehen, die nach der Betriebsfrequenz notiert sind. Ein Modul vom Typ DDR mit 133MHz Betriebsfrequenz und den Timing-Settings 222 bedeutet demnach: Die CAS-Leitungen benötigen 2 Takte um vorgeladen zu werden, die Sense Amps weitere 2 um die Daten bereitzustellen. Die Angabe von 2 CL bedeutet, dass 2 Takte benötigt werden, um die Daten nach Anfrage einer Spalte auch verfügbar zu machen. Dabei wird Ihnen sicherlich aufgefallen sein, dass die Angaben nicht gleichwertig sind, da im Falle eines Page Hits nur die CL von Bedeutung ist. Jedenfalls gilt das so lange, bis ein Page Miss eintritt. Wenn aber wirklich realistisch gemessen werden soll, kann nicht von einem Page Hit ausgegangen werden, was zwar in der Realität häufig auftritt, jedoch keinesfalls immer. Trotzdem: Bei einer Betriebsfrequenz von 133 MHz bedeuten 6 Latenzzyklen und die t_AC theoretisch eine Abfragedauer von 50,4 ns pro Abfrage. Das würde einem Datendurchsatz von ca. 152MByte/s entsprechen. Wie kommen also die angeblichen Übertragungsraten von mehr als 2GByte/s für so ein Modul zustande? Bei den Angaben der Bandbreite ist nicht entscheidend, was das Modul tatsächlich verfügbar machen kann, sondern wie viele Bytes pro Sekunde theoretisch die Kontaktleiste passieren können. Trotzdem ist die Ausbeute nicht so mager, wie es auf den ersten Blick erscheint. Mit guten Einstellungen kann die Übertragung locker 15 – 30 mal so hoch ausfallen, wie in der „worst-case“-Berechnung. Allerdings ist es dafür erforderlich, dass es sich um Module von hoher Qualität handelt, die verschiedene Optimierungsfunktionen unterstützen.