Wie funktioniert der Textur-Cache unter Berücksichtigung mehrerer Shader-Einheiten?

11

Moderne GPUs haben viele parallele Schattierungseinheiten. Ich möchte wissen, wie der Textur-Cache in diesem Szenario verwaltet wird.

Felipe Lira
quelle

Antworten:

14

Auf der obersten Ebene ist eine GPU in mehrere Shader-Kerne unterteilt. Eine kleine GPU in einem Notebook oder Tablet verfügt möglicherweise nur über wenige Kerne, während eine High-End-Desktop-GPU möglicherweise über Dutzende verfügt.

Neben den Shader-Kernen gibt es auch Textureinheiten. Sie können je nach GPU zusammen mit einer Textureinheit pro Shader-Kern oder einer Textureinheit gruppiert werden, die von zwei oder drei Shader-Kernen gemeinsam genutzt wird.

Der gesamte Chip teilt sich einen einzelnen L2-Cache, aber die verschiedenen Einheiten haben einzelne L1-Caches. Textureinheiten haben Textur-Caches, und Shader-Einheiten haben Caches für Anweisungen und Konstanten / Uniformen und möglicherweise einen separaten Cache für Pufferdaten, abhängig davon, ob Pufferladungen ein separater Pfad von Texturladungen sind oder nicht (variiert je nach GPU-Architektur).

Textureinheiten arbeiten unabhängig und asynchron von Shader-Kernen. Wenn ein Shader einen Texturlesevorgang durchführt, sendet er eine Anforderung an die Textureinheit über einen kleinen Bus zwischen ihnen. Der Shader kann dann nach Möglichkeit weiter ausgeführt werden, oder er wird angehalten und lässt andere Shader-Threads laufen, während er darauf wartet, dass die gelesene Textur beendet wird.

Die Textureinheit stapelt eine Reihe von Anforderungen und führt die Adressierungsberechnung für sie durch. Sie wählt Mip-Ebenen und Anisotropie aus, konvertiert UVs in Texel-Koordinaten, wendet Clamp / Wrap-Modi an usw. Sobald sie weiß, welche Texel sie benötigt, liest sie diese durch Cache-Hierarchie, genauso wie Speicherlesevorgänge auf einer CPU funktionieren (schauen Sie zuerst in L1, wenn nicht dort, dann in L2, dann in DRAM). Wenn viele ausstehende Texturanforderungen alle dieselben oder nahe gelegene Texel möchten (wie dies häufig der Fall ist), erhalten Sie hier eine hohe Effizienz, da Sie viele ausstehende Anforderungen mit nur wenigen Speichertransaktionen erfüllen können. Alle diese Operationen sind Pipeline-fähig. Während die Textureinheit auf den Speicher eines Stapels wartet, kann sie die Adressierungsberechnung für einen anderen Stapel von Anforderungen durchführen und so weiter.

Sobald die Daten zurückkommen, dekodiert die Textureinheit komprimierte Formate, führt die sRGB-Konvertierung und Filterung nach Bedarf durch und gibt die Ergebnisse an den Shader-Kern zurück.

Nathan Reed
quelle
1
Vielen Dank! Das war sehr hilfreich. Regading der Konstanten / Uniform Cache. Gibt es neben der Präzision (Mediump, Lowp) auch Tipps, mit denen ich die Cache-Trefferquote von Uniformen verbessern könnte? Macht die Reihenfolge, in der ich Uniformen deklariere, einen Unterschied (was das engere Verpacken betrifft)?
Felipe Lira
2
@PhilLira Verpackung kann einen Unterschied machen, ja. Der Compiler fügt Auffüllungen ein, um zu verhindern, dass Vektoren über 16-Byte-Grenzen aufgeteilt werden. Versuchen Sie daher, dies zu vermeiden. Ich glaube nicht, dass Mediump / Lowp tatsächlich etwas mit Uniformen macht, zumindest nicht mit Desktop-GPUs (vielleicht auch mit Mobilgeräten). Ich würde mir allerdings keine allzu großen Sorgen um eine einheitliche Cache-Trefferquote machen. Das ist äußerst selten, wenn überhaupt, ein Engpass.
Nathan Reed