Wenn ich viele Texturen (z. B. 5+ Karten) an dieselbe Textureinheit gebunden habe, funktioniert dies für den Cache schlechter als wenn ich nur 2 oder 3 Texturen hätte?
quelle
Wenn ich viele Texturen (z. B. 5+ Karten) an dieselbe Textureinheit gebunden habe, funktioniert dies für den Cache schlechter als wenn ich nur 2 oder 3 Texturen hätte?
Wenn man nur die Antwort von imallett hinzufügt , erhöht zwar die Anzahl der Zugriffe auf verschiedene Texturdaten in einem Shader den Druck auf die GPU-Caches, aber es gibt mehrere andere Faktoren, die den Effekt erheblich beeinflussen können. Es wird möglicherweise auch durch die Tatsache kompliziert, dass es wie bei CPU-Caches mehrere Cache-Schichten in einer GPU geben kann, d. H. Textureinheit <= L0 <= L1 <= ..Memory
Wenn Sie eine Szene haben, in der Texturdaten minimiert werden, sei es aufgrund der Perspektive oder der einfachen Skalierung, und Sie keine MIP-Zuordnung verwenden, erhalten Sie Aliasing. Dies wird nicht nur visuelle Artefakte erzeugen; Es ist sehr wahrscheinlich, dass es sich um ein Leistungsproblem handelt.
Sobald Sie ein Aliasing erhalten, werden die Adresszugriffe auf die Textur inkohärent, was nicht nur dazu führt, dass die Caches zerstört werden, sondern auch viele DRAM- "Seitenumbrüche" (genauer gesagt Zeilenumbrüche) eingeführt werden, die kostspielig sein können. MIP-Mapping hilft, die Inkohärenz zu reduzieren.
Vielleicht eine naheliegende Option, aber wenn Sie die Texturkomprimierung (z. B. DXTn | ETC * | PVRTC * | usw.) verwenden können, die von 8 bpp auf beispielsweise 2 bpp abzielt, können Sie die Effektivität der Speicherbandbreite / des Cache erheblich erhöhen Faktoren von 4x bis 16x. Jetzt kann ich sprechen nicht für alle GPUs, aber einige Texturkompressionsverfahren (zB die oben aufgeführten) sind so einfach zu dekodieren in Hardware, dass die Daten könnten in der gesamten Cache - Hierarchie komprimiert bleiben und nur in der Textureinheit dekomprimiert werden, damit effektive Multiplikation der Größe dieser Caches.
Offensichtlich können einige Daten, z. B. Renderziele, die in nachfolgenden Renderings als Texturdaten verwendet werden, keine Texturkomprimierung verwenden. Verwenden Sie, wann immer Sie können, das kleinste Pixelformat, das die Aufgabe erledigt, dh wenn 32 / 16bpp (A) RGB ausreicht, verwenden Sie keine 4x32-Float-Formate!
Dies hängt etwas mit dem obigen Aliasing-Beispiel zusammen, aber wir haben Fälle gesehen, in denen große Renderziele erstellt wurden, die dann aber nur sehr spärlich abgetastet wurden. Cache-Zeilen, sei es in CPUs oder GPUs, sind ziemlich lang. Wenn Sie also nur ein Pixel in jeder Cache-Zeile verwenden, verschwenden Sie Übertragungen.
Bei WRT-komprimierten Texturen wird eine Komprimierung erzielt, indem Daten effektiv zwischen einem lokalen Bereich von Texeln ausgetauscht werden. Wenn Sie keinen kohärenten Zugriff haben, hilft die Komprimierung wahrscheinlich nicht, abgesehen von der Reduzierung des Speicherbedarfs.
Nicht so sehr ein Cache-Problem (naja, es sei denn, die berechneten Zugriffe sind ziemlich inkohärent), aber Texturzugriffe, die nicht direkt durch die mit Scheitelpunkten gelieferten UV-Koordinaten definiert sind, sind möglicherweise langsamer als diejenigen, die direkt definiert sind.
Obwohl ich vermute, dass die meisten Texturen heutzutage entweder in einer gekachelten oder einer Morton-ähnlichen (auch bekannt als Twiddled / Swizzled) Reihenfolge (oder sogar in einer Kombination aus beiden) gespeichert werden, sind einige Texturen möglicherweise immer noch in der Reihenfolge der Scanlinien , was bedeutet, dass die Drehung von Die Textur führt wahrscheinlich zu einer erheblichen Anzahl von Cache-Fehlern / Seitenumbrüchen. Leider weiß ich nicht genau, wie ich erkennen kann, ob ein bestimmtes Format so angeordnet ist.
(Zum Lesen im Hintergrund versuchen Sie es mit Blinns The Truth About Texture Mapping . FWIW. Wenn Sie einige Schritte weiter gehen, werden Texturen in Twiddled-Order (dh Morton-Order) in mindestens einigen frühen PC-Hardware verwendet. )
Die Antwort hängt davon ab, was Sie meinen. Moderne Hardware (z. B. mit bindless Texturen) kümmert sich wirklich nicht so sehr darum, wie viele Texturen "gebunden" sind. Die eigentliche Frage ist, wie viele Sie verwenden .
Texturen speichern Daten im Allgemeinen cachefreundlich (eine Morton-Kurve, glaube ich). Wenn Sie mehr Texturen verwenden, erhalten Sie mehr Cache-Fehler, da die Texturen jetzt miteinander um Platz konkurrieren.
Dies hängt wirklich nur mit der bekannten, alten Shader-Programmierheuristik zusammen: Textur-Taps sind langsam; benutze nicht zu viele.