Die leistungsstärkste Methode zum Organisieren von Scheitelpunktdaten auf modernen GPUs


9

Sagen , ich habe ein Modell von Eckpunkten aus, die jeweils mit position, normal, tangent, und texcoordAttribute, wobei Dreiecke durch den Index Tripel angegeben sind.

Wenn wir uns nur auf die Scheitelpunktattribute konzentrieren, sind mir zwei allgemeine Strategien bekannt: die Struktur von Arrays und das Array von Strukturen. Ich habe auch gehört, dass das Array von Strukturen bevorzugt wird, weil es die Speicherlokalität (und damit die Cache-Lokalität) der Attribute für einen bestimmten Scheitelpunkt erhöht.

Ist es wirklich so, dass dies die Leistung verbessert? Ich könnte mir vorstellen, dass dies hauptsächlich durch Scheitelpunktindizes geschehen würde, bei denen der Rasterizer Scheitelpunktdaten erfassen muss, die längst aus dem Cache entfernt wurden. Wenn der Zugriff auf Scheitelpunktdaten so zufällig ist, würde das Beibehalten aller Attribute für einen Scheitelpunkt in derselben Cache-Zeile die Dinge sicherlich beschleunigen. Ist dies jedoch kein Problem, das durch die Optimierung der Reihenfolge der Dreiecksspezifikation größtenteils gemildert werden könnte?

Ich verstehe außerdem, dass moderne GPUs lange Vektoren desselben Typs besser entpacken können als Vektoren von Strukturen vieler Typen. Wäre es dann möglich, dass ein Array-Struktur-Layout ein Array-Struktur-Layout mit denselben Scheitelpunktdaten konsistent übertrifft, wenn die Indexreihenfolge optimiert wird?


4
Könnten Sie es nicht einfach ausprobieren und herausfinden, welches für Ihren Fall am schnellsten ist?
user1118321

Ich hätte für indizierte Netze gedacht, dass ein Array von Strukturen effizienter wäre, da dem Vertex-Shader alle Vertex-Attribute zugeführt werden, sodass eine Gruppierung im Speicher cachefreundlicher ist.
PaulHK

Abhängig von den Datentypen in der Struktur packen vec4s und floats gut zusammen, andere Typen nicht so gut
PaulHK

2
@ user1118321 Während einzelne Benchmarking-Experimente eine lobenswerte Praxis sind, ist eine breitere theoretische Diskussion und möglicherweise die daraus resultierende Etablierung allgemeiner Praktiken auf der Grundlage der Funktionsweise von Vertex-Pulling-Hardware sicherlich langfristiger.
Chris sagt Reinstate Monica

Antworten:


2

Entschuldigung, ich wollte Ihrem Fragethread einen Kommentar hinzufügen, habe aber festgestellt, dass ich zu viel ausgearbeitet habe. Meine Entwicklungserfahrung ist aus einer DX 11-Perspektive, daher kann ein Teil davon in OpenGL nicht zutreffen

Die Speicherlokalität der Daten spielt sicherlich eine große Rolle. Aber es gibt noch ein paar andere Elemente, die dazu beitragen, die Breite der Daten, wie Sie wissen. Ich hatte ein paar GPUs und hatte aufgrund einiger Wendepunkte einen starken Leistungseinbruch bei einigen. Wenn ich mich recht erinnere, könnten Sie auf meinem alten AMD r290 im Grunde genommen bis zu 4 float4s ohne zusätzliche Kosten über 1 an den Vertex-Puffer weiterleiten. Sobald ich jedoch> 4 gepostet habe, gab es einen messbaren Abfall (im Frame) Bewertung). Dies ist nur aus meiner Erinnerung und so anekdotisch wie am besten. Die GPU-Architektur ändert sich jedoch ständig, und welche Nischentechniken, die Ihnen heute einen Leistungsvorteil verschaffen, sind möglicherweise der Fluch Ihrer Leistung von morgen. ICH'

Trotzdem haben Sie die Frage nach der Reihenfolge der Eckpunkte gestellt, und das wird sicherlich nur geringfügig helfen. Der Leistungsgewinn ergibt sich aus der Kombination mit Indexpuffern, mit denen die Hardware bereits berechnete Scheitelpunkte optimieren und zwischenspeichern kann. Sie können sicherlich noch mehr Gewinne aus Dreiecksstreifen usw. erzielen, die speziell nach Ihren Gedanken bestellt wurden. Das meiste Modell-Rendering, das ich mache, sind indizier- / vertexbasierte optimierte Modelle mit Instanzen. Ich verwende eine kleine Anzahl von Suchvorgängen für zyklische Bewegungseffekte (z. B. Äste). In diesen Fällen sucht der gesamte Ast des Baums nach demselben Wert. So kann auch hier das Caching genutzt werden.

Alles, was ich zusammenfassend von mir selbst sagen kann, ist:

  • Versuchen Sie, die Optimierung zu Beginn nicht zu überdenken, während Sie Ihr Spiel / Ihre Anwendung noch entwickeln, und versuchen Sie nicht, sie vorzeitig zu optimieren. Wenn Sie zurückkehren und neue Funktionen hinzufügen müssen, verlieren Sie möglicherweise den gesamten Aufwand. Sie haben meine Gewohnheit vielleicht> <, lieben es zu versuchen, die beste Leistung und Techniken zu bekommen
  • Die GPU-Architekturen sind unterschiedlich und die Stärken der einen können Schwächen der anderen widerspiegeln. AMD und Nvidia sind dafür bekannt, Entwickler dazu zu bringen, Spiele an ihre Architektur anzupassen. Aus einem Grund hat jeder Vor- / Nachteile. Wenn Sie den Mittelweg für die Entwicklung einschlagen, ist dies möglicherweise der beste Ort. Verwenden Sie keine auf Hardwareherstellern basierenden Funktionen (Meinung hier). (Hinzu kommt, dass einige gepackte Formate nur in AMD existieren).

Dies sind nur einige Gedanken und Erfahrungen, die ich gemacht habe. Es gibt viele Bücher, die Sie genau zu diesen Themen in die Hände bekommen sollten. Ich habe nicht gesehen, dass viele vorschreiben, was Sie vorschlagen, aber das bedeutet nicht, dass es falsch ist. Viel Glück.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.