Warum haben Grafikkarten Spezial-RAM?

Loading

Auf den heutigen Blog bin ich gekommen, weil ich an einem seit langem angefangenen Aufsatz über den „idealen CP/M Rechner“ weitermache, den wohl niemand außer mir interessiert. Das Hautproblem ist dabei die RAM Ausstattung, genauer gesagt der Bildschirmspeicher und der Zugriff auf ihn.

Damit man die Materie etwas besser versteht hier mal eine Erklärung der Problematik. Bei den damals üblichen Monitoren mit Röhren war es so, das der Computer parallel zur Bewegung des Elektronenstrahls die Bits an den Monitor übergeben musste, meist über eine serielle Leitung. Bei typisch 100.000 bis 300.000 Pixeln pro Bild zur damaligen Zeit und Bildwiederholraten von 50 bis 70 Hz kommt man so leicht in den zweistelligen Megabit Bereich. Es gab schon Bausteine, die auf schnelle Transfers spezialisiert waren. Viele Rechner setzten dafür eigene ASIC Bausteine wie Video Gate Arrays ein, die sequenziell den Speicher auslasen und dann die Bits in ein Schieberegister ablegten wo sie getaktet bitweise übertrugen wurden. War mehr als Schwarz-Weiß bzw. Schwarz-Grün oder Schwarz-Bernstein nötig, so gab es mehrere Leitungen, meist eine pro RGB Komponente (Rot, Grün., Blau), zusammen mit einem Signal für die Helligkeit kam man so auf 16 Farben, die bei vielen Rechnern Standard waren (8 Farben als Mischung der RGB Signale in zwei Helligkeiten). Farbe erhöhte natürlich noch die Problematik der Bandbreite bzw. des schnellen Auslesens von Speicherbausteinen, weil so aus acht Schwarz-Weiß Pixeln zwei Pixeln in 16 Farben wurden.

Eine zweite Besonderheit des Monitors ist noch wichtig. Es gab durch die niemals ganz plane Glasröhre Bereiche oben und unten, die nicht beschrieben wurden und bei vielen Rechnern auch als Rand zu sehen waren. Unter optimalen Umständen machte der Rand ein Viertel der Gesamtfläche aus, bei einigen Heimcomputern konnten es aber auch 40 Prozent sein. Da der Rand zur Fläche mitzählt erhöht er die Anforderungen an die Bandbreite weiter, allerdings muss die Elektronik während der Rand von dem Elektronenstrahl abgestrichen wird, keine Bildinformationen übertragen und das Video Gate Array greift dann nicht auf das RAM zu. Die Synchronisation des Gate Arrays und des Bildschirms erfolgt durch generierte Synchronisationsimpulse am Ende jeder Zeile und jedes Bildes.

Als wäre das nicht schon genug an Anforderungen, muss die Information nicht nur gelesen werden, sondern auch geschrieben. Das geschieht durch die CPU, die Zeichen im RAM rendert oder Linien zeichnet. Sie greift daher auch auf das RAM zu, die ganze theoretische Bandbreite des RAM steht so für das Gate Array nicht zur Verfügung.

Die folgende Tabelle informiert über die Anforderungen an den Bildschirmspeicher die ich für verschiedene Auflösungen ermittelt haben. Angenommen wird ein Rand von 25 Prozent der Gesamtfläche.

Auflösung Bildpunkte + Rand Bildwiederholfrequenz Bandbreite Zykluszeit RAM
640 × 400 341.333 50 Hz 17,07 MHz 468 ns
720 × 448 430.080 50 Hz 21,51 MHz 371 ns
640 × 480 409.600 50 Hz 20,48 MHz 390 ns
640 × 400 341.333 60 Hz 20,48 MHz 390 ns
720 × 448 430.080 60 Hz 25,85 MHz 309 ns
640 × 480 409.600 60 Hz 24,58 MHz 325 ns

Zur Erklärung: Natürlich können auch Monitore nicht unbegrenzt schnell die Information darstellen. Dies wurde damals in MHz Bandbreite angegeben. 1983 hatten die bezahlbaren Monitore eine Bandbreite von 14,5 bis 18 MHz, 1986 lag sie bei 20 bis 22 MHz. Es gab immer Monitore mit höherer Bandbreite, nur waren sie auch deutlich teurer und mein Rechner sollte ja erschwinglich sein.

Die Zykluszeit des RAM ist berechnet für einen Zugriff auf acht RAM Bausteine gleichzeitig (8 Bit pro Zugriff), da 8 Bit Rechner meistens RAM Bausteine mit einer Datenleitung nahmen (Organisation z.B. 64 Kbit × 1, dann benötigt man 8 Bausteine um ein Byte zu speichern.

Für das Auslesen ist wichtig das vor dem nächsten Zzugriff das RAM einen vollständigen Zyklus durchlaufen hat – nach dem Auslesen von Information muss sie bei dynamischen RAM wieder aufgefrischt werden. Statische RAM benötigen dies nicht und bei ihnen entspricht dann die Zykluszeit der Zugriffszeit. Nimmt man nur den Zugriff des Video Arrays auf das RAM so ist die Zykluszeit der Kehrwert der Bandbreite.

Und wo bleibt die CPU?

Wer damalige Zykluszeiten von RAM noch im Kopf hat wird sich nun sagen „Und wo ist das Problem?“. Das Problem ist, dass die CPU auch auf das RAM zugreift. Zum einen dürfen sich Video-RAM und CPU nicht ins Gehege kommen, zum anderen erhöht dies die Anforderungen an das RAM drastisch. Bei den damaligen CPU ohne Pipeline war es so, das sie feste Befehlszyjlen hatten. In der ersten Hälfte des Zyklus griffen sie auf das RAM zu, in der zweiten Hälfte erfolgten interne Operationen. Das nutzten viele Systeme aus. Das Video Gate Array griff dann immer im zweiten Zyklus auf das RAM zu. Dann verdoppelte sich aber die Anforderung an die Zykluszeit, da man nur halb so viel Zeit dafür hatte Aus dem niedrigsten Wert der obigen Tabelle 309 ns, wurden dann 154 ns und eine so kurze Zykluszeit hatte damals kein RAM.

Die Methode war zudem nicht ohne Nachteile. Der letzte Zyklus einer Instruktion konnte keinen RAM Zugriff erfordern und benötigte so weniger Takte. Damit nun die CPU nicht mit dem Videozugriff kollidierte, legte das Gate Array meist ein Signal an den Wait Eingang der CPU der sie zum Warten brachte bis das Signal wieder verschwand. Das bremste die CPU aus. Die Z80 um die es in meinem Beispiel geht ist hier sehr empfindlich. Diese Methode wurde bei dem Amstrad CPC und MSX Rechnern eingesetzt und sie verlangsamte den Rechner um 20 %, ein 4 MHz Rechner war also nur 3,2 MHz netto schnell. Je nach Befehl wurden 1 bis 7 Wartetakte eingeschoben. Das betraf, sofern es keinen separaten Videospeicher gibt, jeden Zugriff, also nicht nur auf den Bildschirm sondern auch bei normalen Operationen.

Weiterhin begrenzte dies den CPU Takt, den im ersten Zyklus musste nun nicht nur der Zugriff erfolgen, sondern auch der Komplette Zyklus mit Wiederauffrischen der Information. Ohne Video-Array hätte man die zweite Zyklus für das Wiederauffrischen der Information,

Hier nun die obige Tabelle nochmal, bei Einsatz dieser einfachen Methode, nur diesmal mit den dann benötigten Zykluszeiten und der maximal möglichen Tatfrequenz einer Z80 CPU:

 

Auflösung Bildwiederholfrequenz Max. Z80 Frequenz Zyskluszeit RAM
640 × 400 50 Hz 4 MHz 234 ns
720 × 448 50 Hz 5 MHz 185 ns
640 × 480 50 Hz 4,8 MHz 195 ns
640 × 400 60 Hz 4,8 MHz 195 ns
720 × 448 60 Hz 6 MHz 155 ns
640 × 480 60 Hz 5,1 MHz 183 ns

Das sind nun mal nicht berauschende Geschwindigkeiten. Die Z80 ist sehr anspruchsvoll beim RAM Timing, eine Z80 CPU braucht schon im Normalbetrieb genauso schnelle RAM wie eine 5 MHz 8086 CPU.

Mögliche Lösungen, nur mit RAMs

Die einfachste Lösung ist es mehr Speicherbausteine zu verwenden. Wenn man den Speicher nicht aus 8 Bausteinen, sondern 16 aufbaut, dann würde jeder zweite Zugriff andere Bausteine ansprechen. Diese Technik ist bei Großrechnern gängig, Ein 64 K Systeme wurde dann nicht acht Bausteine mit je 64 Kbit, sondern 16 mit je 32 Kbit einsetzen. Die Lösung ist aber teurer und braucht mehr Platz. Zudem braucht man eine weitere Schaltung, wenn es einen Sprung im Programm gibt oder aus anderen Gründen man zweimal auf dieselbe Bank zugreift, die dann erneut die CPU anhält. Immerhin könnte man in diesem Falle auf das generelle Anhalten beim Videozugriff verzichten wenn das Video Array immer gerade auf andere Bank zugreift.

Die zweite Lösung sind RAMs die anders organisiert sind. Auch so kommt man auf mehr Bänke, aber ohne mehr Chips einzusetzen. Verwendet man anstatt 64 K × 1 Bit ein RAM mit 16 K × 4 Bit so speichern beide Bausteine 64 Kbit, aber vom zweiten benötigt man nur zwei für das Speichern eines Bytes anstatt acht. Damit würde bei acht Bausteinen im Mittel erst nach vier Zugriffen wieder die ersten beiden an die Reihe kommen. IBM PC kompatible Rechner setzten dieses Konzept um.

Die letzte Möglichkeit sind statische RAM. Bei ihnen ist die Zykluszeit gleich der Zugriffszeit, bei normalen RAM ist die Zykluszeit meist 70 bis 80 % länger als die Zugriffszeit. Ich habe mal mit den Einzelhandelspreisen vom Januar 1986 hier eine kleine Liste erstellt:

Bezeichnung Organisation Zugriffszeit Zykluszeit Kosten für 64 KByte Kosten für 256 KByte
4116 16K × 1 DRAM 150 ns 320 ns 136 DM
4164 64K × 1 DRAM 150 ns 280 ns 22,40 DM
41256 256K × 1 DRAM 150 ns 260 ns 72,80 DM
4416 16K × 4 DRAM 150 ns 260 ns 136 DM
6116 LP-3 2K × 8 SRAM 150 ns 150 ns 176 DM
6264 LP-15 8K × 8 SRAM 150 ns 150 ns 82,40 DM

Man sieht die Lösung mit mehr Bausteinen dafür niedriger Dichte (4116) ist teuer. Zu dem Zeitpunkt kostete ein 4116 RAM schon mehr als das viermal größere 4164!. Die Sonderform 4416 mit 4 Datenleitungen ist ebenso überproportional teuer. Wenn die Kosten keine Rolle spielen, würde ich am besten den Speicher komplett aus 6264 statischem RAM aufbauen. Bei 150 ns Zykluszeit erlaubt das sogar eine 6,7 MHz CPU. Es ist aber fast viermal so teuer wie die kostengünstigste Lösung und teurer als 256 KByte mit 256 Kbit DRAM Bausteinen.

Andere Lösungen

Viele Rechner hatten ein separates Videoram, das mussten nicht mal Rechner mit Grafikmodus sein, denn auch bei Rechnern die nur einen Textmodus beherrschten ergaben sich dieselben Probleme. Dieses Video RAM wurde dann exklusiv von einem Videoprozessor verwaltet. Populär waren der TMS 9928/9929 im Ti 99/4A und den MSX Geräten. Die Commodore Rechner hatten den VIC. IBM PC kompatible Rechner hatten die Grafik- und Textdarstellung sowieso auf eine Steckkarte ausgelagert und setzten bei CGA (Gafikkarte) und MDA (Textkarte) den 6845 von Motorola ein. Wenn die CPU in den Videospeicher schreiben wollte musste sie warten. Im Normalfall war dies so gelöst, dass der CPU-Zugriff dann erlaubt war, wenn die nicht sichtbaren Bereiche vom Elektronenstrahl passiert wurden also nach Ende jeder Zeile. Da bei selbst 400 Zeilen und 50 Hz eine Zeile in weniger als 50 µs gezeichnet ist, bemerkt man davon keine Verlangsamunmg. Operationen bei denen die CPU nur auf den Grafikspeicher zugreift laufen aber langsamer ab, doch das ist selten.

Die zweite Lösung wurde schon 1983 erfunden, es waren Multiport-RAM die dann zum Standard bei Grafikkarten wurden. Eines der ersten war das TMS4161 RAM. Es hatte zwei Ports. Im einen Port war es kompatibel zum 4164 RAM. Der zweite Port hatte ein 256 Bit breites Stiftregister und eine Daten und eine Steuerleitung. Legte man an die Steuerleitung ein Signal an, so stand an der Datenleitung das nächste Bit an. So konnten bis zu 256 Bit sequentiell mit hoher Datenrate (25 MHz) ausgelesen werden. Dieses RAM kopiert im Prinzip eine ganze Zeile bei einem Zugriff in ein Stiftregister anstatt nur einem Bit. Es machte Gebrauch von der Tatsache das der Bildschirminhalt immer sequentiell innerhalb einer Zeile ausgelesen wurde (die Zeilen mussten aber nicht sequentiell im Speicher angeordnet sein). Die Wartezyklen für eine 8086 CPU sanken so von 20 auf 1 Prozent ab. Daneben hätte man bei 8 Bausteinen (wegen der 1 Bit Organisation) eine Videobandbreite von bis zu 200 MHz unterstützen können.

Solche RAM wurden dann unter verschiedenen Bezeichnungen wie GRAM oder VRAM zum Standard-RAM der Grafikkarten ab der VGA Generation, also man weil die RAMs nur langsamer schneller wurden und es immer mehr Farben gab, zum Standard. Daneben etablierte sich das Grafikkarten auch mehr Bits auf einmal zugriffen, das ist bis heute so geblieben.

Heute gibt es noch immer einen Unterschied zwischen DDR-RAM im Computer und auf der Grafikkarte. Das GDDR-RAM ist immer noch eine Klasse besser als das im Computer. Daneben greifen die GPU mit breiteren Bussen auf das RAM zu und transferieren mehr Daten pro Zeiteinheit, zusätzlich ist das RAM fest verlötet: spart einige Zentimeter Weg, die bei Taktfrequenzen von mehreren Gigahertz aber durchaus eine Rolle spielen. Schon längst resultiert die Geschwindigkeitsanforderung nicht mehr aus der für die Darstellung benötigten Bandbreite. Vielmehr berechnet heute die Grafikkarte selbst die Szene und muss dafür viele Daten aus dem RAM holen, das daher auch um ein vielfaches größer als das nur für die Darstellung benötigte RAM ist – selbst für 8K Auflösung benötigt man nur 128 MByte RAM für den Bildschirminhalt selbst, während selbst preiswerte Grafikkarten über 1 bis 2 GByte RAM haben.

3 thoughts on “Warum haben Grafikkarten Spezial-RAM?

  1. Die Consumer Grafikkarten wie ET4000 haben such nur schnelles DRAM benutzt, nur die sündhaft teuren TIGA znd einige ATI Karten hatten VRAM

  2. Leider etwas unvollständig.

    Dual Port RAM wurde nicht besonders lange/häufig eingesetzt. Nach kurzer Zeit war der Grafikspeicher so schnell, dass der Graphikprozessor per multiplextem Zugriff Bildschirmzeilen in einen Zeilenpuffer lesen konnte, von dem diese dann gewandelt und an den Monitor ausgegeben wurden. Man muss hier nur RAM Bandbreite und benötigte Bandbreite für die Ausgabe gegenüberstellen.

    Der einzige tatsächlich „spezielle“ RAM-Entwurf für Grafikkarten hingegen fehlt in der Auflistung : SG-RAM (ein abgewandelter SD-RAM)

    SG-RAM erlaubt es gewisse Pixeloperationen direkt im RAM durchzuführen. Einen Nutzen hatte das z.B. für Blit-Operationen mit Transparenzmaske (sichtbar/nicht sichtbar). Normalerweise wird hier für jedes Pixel ein Read-modify-write benötigt, mit SG-RAM reduziert sich das auf einen Schreibzugriff da der RAM intern die Auswahl zwischen vorherigem und neuem Pixelwert übernimmt.
    Wenn ich mich richtig erinnere konnte SG-RAM eine ganze Palette an logischen Operationen, alle auf Blit-Operationen abgestimmt.

    Mit dem Übergang von 2D zu 3D Beschleunigern verschwand der SG-RAM dann wieder, weil nur für 2D sinnvoll und auch dort wird nur einfache Transparenz (1bit) sinnvoll unterstützt. (Es gab eine Zeit da waren Grafikkarten mit der flüssigen Darstellung der Fensterelemente des Betriebssystems gut beschäftigt.)

  3. Ich sehe für einen CP/M Rechner in der damaligen Technik drei sinnvolle Lösungsmöglichkeiten:
    a) 16 St. 4164: entweder zwei Bänke à 64k, oder interleaved.
    b) Da man für 80×25 Text 2000 Bytes benötigt: einen Videospeicher von 2k bestehend aus 1 St. 6116 LP-3. Für ein high end Model dann zwei solche 6116 LP-3 oder einen größere um Blockgrafik und/oder verschiedene Farben zu ermöglichen.
    c) einen zusätzlichen 6502 mit minimaler RAM Ausstattung als Terminal Controller. (vermutlich zu teuer.)

    MfG

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.