Ist die GPU-Referenzlokalität besorgniserregend?

9

Hat die Referenzlokalität einen ebenso großen Einfluss auf die GPU-Leistung wie auf die CPU-Leistung?

Wenn ich beispielsweise 200 Zeichenbefehle an die GPU sende, sehe ich dann einen (möglicherweise) spürbaren Unterschied, wenn die Daten für jeden Befehl im Speicher zusammenhängend sind, anstatt über die Puffer / Texturabbildungen zu springen?

Nebenfrage: Ich gehe davon aus, dass die GPU gegen falsche Freigabeprobleme schützt, indem die meisten Ressourcen unveränderlich sind. Aber wenn dies nicht der Fall ist, erledigen Threads deshalb immer die Arbeit von vier Fragmenten?

Xenoprimate
quelle

Antworten:

10

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.

concept3d
quelle
3

Ursprünglich wurden GPUs nur für Multimedia-Anwendungen verwendet, bei denen nur wenig Daten wiederverwendet werden. Da GPUs zunehmend für Allzweckanwendungen verwendet werden (daher der Begriff GPGPU), verfügen sie jetzt über große, hardwareverwaltete Caches. Beispielsweise verfügt die Fermi-GPU über 768 KB Cache der letzten Ebene, die Kepler-GPU über 1536 KB Cache der letzten Ebene, und die Maxwell-GPU verfügt über 2048 KB Cache der letzten Ebene. Dies zeigt zusammen mit einer Vielzahl von Untersuchungen zu GPU-Caches, dass die Datenlokalität für GPUs definitiv wichtig ist. Einzelheiten und Referenzen finden Sie in meinem Umfragepapier .

user984260
quelle