Referenzlokalität nicht egal, aber Sie haben keine Sorgen zu machen , dass viel ... weil Sie nicht die absolute Kontrolle haben.
Wenn Sie OpenGL / DirectX verwenden, haben Sie normalerweise nur begrenzte Kontrolle über das Speicherlayout. Den Rest erledigt der Treiber. Sie können beispielsweise mehrere Scheitelpunktpuffer-Layouts ausprobieren, z. B. die Verwendung von verschachtelten oder nicht verschachtelten Scheitelpunktdaten, und die Leistung hängt von Ihren Daten / Treibern / GPUs ab. Profilieren Sie und wählen Sie, was am besten zu Ihrer Anwendung passt.
Beispielsweise wird bei der Optimierung der GPU Gems-Pipeline die Referenzlokalität zweimal erwähnt , die erste:
Greifen Sie relativ sequentiell auf Scheitelpunktdaten zu. Moderne GPUs speichern den Cache-Speicher beim Abrufen von Scheitelpunkten. Wie in jeder Speicherhierarchie hilft die räumliche Referenzlokalität dabei, die Treffer im Cache zu maximieren und so die Bandbreitenanforderungen zu reduzieren.
Und der zweite
Optimieren Sie für den Post-T & L-Vertex-Cache. Moderne GPUs verfügen über einen kleinen FIFO-Cache (First-In, First-Out), in dem das Ergebnis der zuletzt transformierten Scheitelpunkte gespeichert wird. Ein Treffer in diesem Cache spart alle Transformations- und Beleuchtungsarbeiten sowie alle Arbeiten, die zuvor in der Pipeline ausgeführt wurden. Um diesen Cache nutzen zu können, müssen Sie indizierte Grundelemente verwenden und Ihre Scheitelpunkte anordnen, um die Referenzlokalität über dem Netz zu maximieren. Es stehen Tools zur Verfügung, darunter D3DX und NVTriStrip (NVIDIA 2003), die Ihnen bei dieser Aufgabe helfen können.
Meiner Meinung nach folgen diese Empfehlungen dem, worüber ich gesprochen habe, und implizieren, dass Sie keine absolute Kontrolle über das Speicherlayout haben, aber was Sie kontrollieren können, beispielsweise wie die einzelnen VBO-Eckpunkte angeordnet sind, kann sich auf die Leistung auswirken.
Wenn Ihre Anwendung einen Leistungseinbruch aufweist, sollten Sie zuerst den Engpass erkennen. Dies ist möglicherweise kein Problem für die Referenzlokalität der Daten. Dies kann jedoch daran liegen, dass große Datenmengen ohne Culling vorhanden sind, z. B. wenn Sie kein Kegelstumpf-Culling durchführen. usw. Sie können meine Antwort hier zum Thema überprüfen.
Ich denke, Sie sollten sich bei der Verwendung von OpenCL / CUDA mehr Gedanken über die Lokalität der Referenz machen, wenn Sie häufig die absolute Kontrolle über das Speicherlayout haben.