Werbung
Sowohl AMD wie auch NVIDIA setzen eine Komprimierung für Daten im Grafikspeicher ein. Diese sogenannte Delta Color Compression oder kur DCC ist ein wichtiger Bestandteil im Zusammenspiel zwischen Hardware und Codeimplementation. Bei der Delta Color Compression wird nur der Basispixelwert gespeichert und für die umliegenden Pixel in einer 8x8-Matrix nur noch der Unterschied (das Delta) gespeichert. Da das Delta ein deutlich kleinerer Wert ist, kann dieser schneller gespeichert werden und benötigt auch weniger Platz im Speicher. Es werden also weniger Daten in den VRAM geschrieben und müssen gelesen werden, sodass aus den 224 GB pro Sekunde 297 GB pro Sekunde werden sollen. NVIDIA führte Delta Color Compression mit der Maxwell-Architektur ein.
AMD hat nun einen Blogbeitrag veröffentlicht, der die Delta Color Compression noch einmal erläutert und zugeschnitten auf die Graphics-Core-Next-Architektur für Entwickler einige Empfehlungen gibt. So verbaut AMD zwar aktuell zusammen mit den Fiji-GPUs High Bandwidth Memory mit einem Speicherinterface mit einer Breite von 4.096 Bit, kommt derzeit aber dennoch "nur" auf 512 GB/s. Größere Sprünge werden erst mit HBM2 erwartet. Selbst bei 512 GB/s aber spielt es eine Rolle, wie viele (unnötige) Daten im Speicher geschrieben und gelesen werden müssen.
Speicherkomprimierung in de Maxwell-Architektur von NVIDIA
Delta Color Compression ist auf allen diskreten GPUs von AMD aktiv, die auf der GCN-1.2-Architektur oder neuer basieren. Dies trifft auf alle Grafikkarten mit Tonga- und Fiji-GPU zu. Dies wären die Radeon Radeon R9 285 sowie die Radeon R9 Fury X, Radeon R9 Fury und Radeon R9 Nano. Auch alle zukünftigen GPUs auf Basis der Polaris-Architektur werden Delta Color Compression unterstützen. Auf Seiten der APUs unterstützen dies alle APUs auf Basis der Carrizo-Plattform.
So einfach die grundsätzliche Funktionsweise der Delta Color Compression klingen mag, so kompliziert ist jedoch die Implementierung, denn hier werden weitere Optimierungen vorgenommen, damit die Daten schnellstmöglich abgerufen werden können. So wird die Blockgröße für die als Delta Color Compression gespeicherten Daten dynamisch bestimmt, je nachdem wie und auf welche Art und Weise auf die Daten im Speicher zugegriffen werden soll. Der in der GCN-Architektur implementierte Compressor arbeitet ähnlich wie der, der für die Datenkompression von Tiefen- und Matrizen-Werte im Renderingprozess verantwortlich ist.
Für die Entwickler sollen keine besonderen Vorbereitungen notwendig sein. Fallen Daten an, die komprimiert werden können, wird diese Komprimierung auch durchgeführt. Falls keine solche Daten vorliegen, wird die Rendering Pipeline nicht verändert. Die Komprimierung der Daten ist aber nur eine Seite der Optimierung. Die meisten Daten werden häufiger gelesen, als sie geschrieben werden. Daher bekommen die Shader auch die Möglichkeit direkt auf die dekomprimierten Daten zuzugreifen. Werden diese häufiger benötigt liegen sie direkt im Speicher vor. Solche Daten, die weniger häufig verwendet werden, verbleiben komprimiert. Damit lassen sich einige oftmals überflüssige Prozesse verhindern.
Ein Beispiel für die Kompression liefert AMD gleich mit. Ein vollständiges Schwarz und Wei0 wird als {1.0, 0.0, 0.0, 0.0} der {0.0, 1.0, 1.0, 1.0} im Speicher abgelegt. Aber auch hier lässt sich Speicherplatz einsparen, in dem nur 0.0 oder 1.0 als Wert für die ARGB-Oberfläche abgespeichert wird. AMD hat auch einige Tipps an Entwickler, um nicht unnötig Ressourcen zu verbrauchen. So sollten Render-Targets nur dann als solche ausgewiesen werden, wenn dies auch unbedingt notwendig ist. Damit soll verhindert werden, dass nicht andere Optimierungen (ebenfalls Kompressionsverfahren) blockiert werden. Für ein MSAA können Tiefeninformationen im Speicher extrem gut komprimiert werden. Weißt der Entwickler diese Daten den Shadern aber als Render-Targets aus, wird diese Komprimierung nicht durchgeführt.
Solche Daten sollten auch in einem bestimmten Datenformat abgelegt werden. So rät AMD dazu 32 Bit Floating Point (D32F) anstatt 16 Bit (D16) als Datenformat zu verwenden. Die D32F-Datensätze sollen sich deutlich besser komprimieren lassen und verhalten sich bei der Zuweisung im Speicher auch deutlich effektiver. Eine 24-Bit-Tiefeninformation lässt sich auch einfacher in einem 32-Bit-Datenblock speichern, als in zwei 16-Bit-Blöcken abgelegt werden zu müssen.
Die Delta Color Compression wird auch in Zukunft weiterhin eine Rolle spielen, denn es handelt sich um ein verlustloses Verfahren, dass keinerlei Daten verliert, wohl aber den Aufwand für das Speichern und Lesen von Daten deutlich reduzieren kann. Richtig implementiert entstehen so keiner Leistungsnachteile und grundsätzlich sind nur Vorteile vorhanden, die auch ausgeschöpft werden sollen.
AMD hat auch noch einige weitere Tipps parat und interessierte Entwickler können sich alle weiteren Informationen im Blogbeitrag anschauen.