Datenkommunikation DRAM-Zugriff - langes Warten auf schnelle Daten?

Autor / Redakteur: Falk Höhnel* / Holger Heller

Benchmarks zum Vergleich von Prozessorsystemen werten meist die Core-Frequenz und die Bus-Frequenzen von Prozessor und DRAM-Speicher als wichtigste Parameter aus. Wer tiefer einsteigen will, muss zwischen Durchsatz und Zugriffszeit unterscheiden. Während der maximale Datendurchsatz eines Busses direkt mit der Frequenz skaliert, gilt das für die Speicher-Zugriffszeit gerade nicht.

Firmen zum Thema

( Archiv: Vogel Business Media )

Durch komplizierte Highspeed-Interfaces werden die Bausteine (Prozessor, Chipset, DRAMs) auf immer höhere Frequenzen getrimmt. Jedoch erkauft man sich dies mit Synchronisierungsschaltungen und langen Pipelines. Die Zugriffszeit benötigt mehr Takte (wenn auch kürzere), bleibt aber absolut betrachtet gleich oder verlängert sich gar. Je nach Benchmark-Software schneiden Prozessor-Systeme eines Herstellers besser oder schlechter ab.

Bild 1: Prozessor-Plattform-Architekturen im Vergleich (Archiv: Vogel Business Media)

AMD-Prozessoren haben den DRAM-Controller im gleichen Chip integriert, sind dadurch in Richtung DRAM schneller, aber insgesamt komplexer. Intel hat mit dem Umweg über den North-Bridge-Chip zwar eine längere Zugriffszeit. Aber der Prozessor hat weniger Zusatzfunktionen, benötigt darum weniger Siliziumfläche bzw. hat mehr Platz für Cache (Bild 1).

Um den Durchsatz zu erhöhen, werden durch Bursts mit einem Zugriff zu einer Adresse gleich mehrere (z.B. vier) hintereinander liegende Daten abgeholt. Die vier Datenpakete werden mit Double (DDR) oder Quad Data Rate (QDR) gemultiplext und mit hoher Frequenz übertragen. Mitlaufende Takte oder Strobes (möglichst noch differenziell) minimieren die Timing-Unsicherheit. Zur Weiterverarbeitung müssen die Daten mit FIFOs einsynchronisiert und wieder de-multiplext werden. Prozessoren fordern mit der Hoffnung auf einen Performance-Vorteil spekulativ Code und Daten an, die in langen Pipelines zwischengelagert werden.

Performance-Vorteil durch Daten-Zwischenlagerung

Sinnvoll ist dies sicherlich bei der Verarbeitung von vielen aufeinanderfolgenden Daten. Nachteilig ist das Burst/Pipeline-Verfahren für Code, bei dem ein bestimmtes Byte abgefragt wird, von dessen Bewertung der weitere Programmablauf abhängt. Dann wartet der Prozessor mit all seinen Leistungsmerkmalen, bis dieses Byte endlich vom Speicher eintrifft und alle Pipeline-Stufen durchlaufen hat. In diesem Fall kosten die Zusatztakte für Mux/Demux und Synchronisieren natürlich Zeit und erhöhen die Latenz.

In langjährig am Markt existierenden Produkten spielt häufig noch Code eine Rolle, der zu Zeiten der Speicherknappheit vor 20 Jahren geschrieben wurde. Beim Hardware-Redesign aus Performance- oder Kostengründen bzw. infolge von Bauteileabkündigungen darf diese Software nicht verändert werden, weil das eine aufwändige und teure Komplettüberarbeitung inklusive Regressionstests nach sich ziehen würde. In manchen Industriezweigen kommt es auch heute noch auf Speicherplatzoptimierung an. Solche Software wird wegen der Burst/Pipeline-Straftakte nicht von einer Frequenzerhöhung profitieren.

Tabelle 1: Vergleich von Systemgenerationen mit Auswirkung auf Durchsatz und Zugriffszeit (Archiv: Vogel Business Media)

Ein weiteres Thema ist die in hochverfügbaren Plattformen unverzichtbare ECC-Sicherung auf den Datenbussen. ECC wird über die volle Busbreite (64 Bit = 8 Byte) berechnet. Wenn weniger als 8 Bytes geschrieben werden, so muss jedes Mal ein „Read-Modify-Write“-Zyklus (RMW) stattfinden. Das bedeutet: 8 Byte lesen, gewünschte Bytes austauschen und neues ECC berechnen, modifizierte 8 Byte und ECC zurück schreiben. Mit langen Bursts und DDR-Mux/Demux wird dies natürlich noch ungünstiger. In PC-Systemen spielt das keine Rolle, weil der Prozessor zunächst nur in seinen Cache schreibt und die anderen DRAM-Nutzer den Prozessor über das Snooping-Protokoll informiert. In Embedded-Systemen wird das komplexe Snooping oft vermieden und durch uncached Zyklen ersetzt.

Tabelle 2: Vergleich von Systemgenerationen mit Auswirkung auf Durchsatz und Zugriffszeit (Archiv: Vogel Business Media)

Schließlich ist auch zu bedenken, dass die meisten Timing-Parameter am DRAM (tRCD, tRP) als absolute Zeit angegeben sind und sich über Jahre hinweg nicht wesentlich verringert haben. Eine Frequenzerhöhung bringt hier gar nichts, man muss dann eben entsprechend mehr Wartetakte zwischen zwei Kommandos schieben. Die Tabellen 1 und 2 zeigen einen Vergleich mehrerer Systemgenerationen mit den Auswirkungen auf Durchsatz und Zugriffszeit.

Optimierung in Software

Wie lässt sich trotz der gerade beschriebenen Probleme die Zugriffszeit optimieren? In fertigen Systemen (Schaltungsrealisierung mit käuflichem Prozessor, Chipset, DRAM, ohne eigene Chipentwicklung) beschränken sich die Möglichkeiten auf das Schreiben von Hardware-freundlicher Software:

  • Daten-Strukturen so anlegen, dass Variable/Daten N × 8 Byte breit sind und auf Modulo-8-Adressen beginnen (Vorteil der Vermeidung von RMW beim Schreiben, ca. 20%),
  • Code so schreiben, dass er komplett in den Cache passt (vielfach schneller als mit Code vom DRAM),
  • Daten von „uncached“-Bereichen blockweise in den Cache holen, dort bearbeiten und blockweise wieder zurück schreiben (Beispiel: Rahmen von Kommunikationsprotokollen),
  • Spezielle Prozessorbefehle für speicheroptimiertes Kopieren nutzen: MMX, Write Combining (bis 100% schneller gegenüber Einzel-Read/Write-Befehlen wie „repmovs_dword“),
  • Doppelzugriffe vermeiden: statt Einzelbyte-Bearbeitung besser komplette 8 Byte / kompletten Burst laden, zwischenspeichern und anschließend Einzel-Bytes auswerten

Optimierung in Hardware

Hat man aber die Möglichkeit oder Aufgabe, zwischen Prozessor und DRAM einen eigenen ASIC oder FPGA zu platzieren, ergeben sich mehr Möglichkeiten zur Optimierung. Jede Abtaktung im Prozessor- und Speicher-Interface und im DRAM-Controller muss auf den Prüfstand:

  • Frequenz und Busbreite von Prozessor und Speicher sollte man aufeinander abstimmen. Ungerade Taktverhältnisse (533 MBit/s am Prozessor, 667 MBit/s am DRAM) lohnen sich nicht. Selbst wenn außer dem Prozessor noch andere Schaltungsteile (PCI, Grafik-Controller) das RAM benutzen wollen – der Durchsatzvorteil am DRAM wird von der zusätzlichen Einsynchronisierung kompensiert und verkompliziert das Design. Je weniger verschiedene Taktdomänen, desto besser.
Bild 2: DDR/DDR2-RAM-Zyklen im Überblick (Archiv: Vogel Business Media)

  • Die Möglichkeit, DRAM-Bänke aktiviert zu lassen (Open Page), sollte genutzt werden. Dazu müssen alle Adressen von DRAM-Anforderungen mit der Liste von aktuell offenen DRAM-Pages verglichen werden (bei vier DIMMs mit je vier internen Bänken --> 16 Einträge). Dementsprechend startet dann ein DRAM-Zyklus mit den Kommandos oder oder (Bild 2). Vor dem nächsten Refresh-Kommando muss ein -Kommando erfolgen. Je nach Code und Speichergliederung ist eine Leistungssteigerung von 1 bis 20% möglich.
  • DRAM-Zyklen können überlappen: Da die Read-Daten (bei DDR2 auch die Write-Daten) um einige Takte zum Read/Write-Kommando versetzt ablaufen, können die folgenden Read/Write-Kommandos schon entsprechend vorlaufend abgesetzt werden. Die Daten können sich somit zu einem scheinbar zusammenhängenden Mega-Burst verketten. Precharge- und Activate-Kommando für ein anderes DIMM können auch zeitgleich mit einem laufenden Datenburst abgesendet werden. Dazu sind die vielfältigen Reglementierungen in den DRAM-Datenblättern zu beachten (Bild 2). Gegenüber jeweils abgeschlossenen Einzelzyklen kann bis 50% Zeit gespart werden.
10398710
  • Die ECC-Logik ist komplex und kaum in einer 266-MHz-Periode prüfbar. Ein Fehler-Indikator wird also erst nach der Datenweitergabe zum FIFO erzeugt. Dennoch sollten die Read-Daten nicht dem ECC zuliebe um zwei Takte verzögert werden. Wegen Daten-FIFO und -Multiplexing in den Interfaces kann der Fehler-Indikator die Zeit wieder aufholen und die Weitergabe der falschen Daten lässt sich verhindern.
  • Ein RMW-Zyklus ist ein zusammenhängender Prozess und sollte nicht im Controller in einzelne Read- und Write-Zyklen zerlegt werden. Vielmehr sollte der Weg der Daten optimiert werden und die DRAM-Kommandofolge als festgelegter Prozess passend zu den Daten ablaufen. Das spart einige Takte.
  • Bei Verwendung von RAM-Speicher mit nur vier statt acht Datenbits funktionieren bei vielen Controllern die Data-Mask-Signale DM als zusätzliches Strobe-Signal DQS. Dementsprechend entfällt die Möglichkeit, einzelne Phasen eines Bursts zu maskieren. Dann muss sogar für alle Zugriffe, die kleiner als die Burstlänge sind, ein RMW-Zyklus benutzt werden (der 20% langsamer ist).

*Falk Höhnel ist Entwicklungsingenieur bei TietoEnator Deutschland, München.

(ID:266298)