Multi Threading & Resource Caching

In diesem Kapitel ändert sich inhaltlich nichts an unserer Simulation. Es wird die gleiche Szene geladen und die gleiche Funktionalität für den Benutzer bereitgestellt. Es ändern sich allerdings die grundlegenden Abläufe wie die Engine ihre Modelle und Texturen lädt.

Zum einen führen wir einen thread pool ein mit dessen Hilfe wir bestimmte Abläufe auf mehrere Threads verteilen und damit im Idealfall parallelisieren können.

Außerdem verwenden wir einen resource cache, der dafür sorgt, dass jedes Mesh und jede Textur nur einmal von der Platte geladen wird. Weitere Aufrufe zum Laden der gleichen Ressource bedienen diese Anfragen aus dem Cache. Dies reduziert die Ladezeit beim Programmstart und spart außerdem Speicher auf der GPU.

Wiederholung: Amdahlsches Gesetz

Das amdahlsche Gesetz ist ein grundlegendes Konzept in der Informatik, das sich mit dem Geschwindigkeitszuwachs befasst, der in parallelen Computersystemen erreicht werden kann. Es besagt, dass der maximale theoretische Geschwindigkeitszuwachs durch die Parallellisierung eines Programms, durch den Anteil des Programms begrenzt wird, der nicht parallelisiert werden kann.

Mit anderen Worten: Wenn ein Teil des Programms sequentiell ausgeführt werden muss und nicht parallelisiert werden kann, dann wird die Gesamtleistung des Programms durch die Laufzeit dieses sequentiellen Teils begrenzt. Das Hinzufügen weiterer Threads führt nicht unbedingt zu einer Beschleunigung des Programms, da diese Threads nicht für die Ausführung des sequentiellen Abschnitts verwendet werden können.

Es gilt: T = ts + tp

Wobei T die Gesamtlaufzeit des Programms angibt, ts die Laufzeit des seriellen Programmanschnitts und tp die Laufzeit des parallelen Programmabschnitts.

Der mögliche Geschwindigkeitszuwachs wird wie folgt angegeben:

S = T / (ts + tp / np)

Wobei np die Anzahl der Threads angibt.

Die Formel zeigt, dass das Hinzufügen weiterer Threads jeweils nur den parallelen Programmabschnitt beeinflusst. Der zu erwartende Geschwindigkeitszuwachs wird daher mit jedem zusätzlichen Thread etwas kleiner.

In der Praxis verdeutlicht das amdahlsche Gesetz, wie wichtig es ist, bei der Entwicklung paralleler Rechensysteme die sequenziellen Teile eines Programms zu identifizieren und zu minimieren. Durch die Verringerung der Menge an sequentiellem Code können Entwickler die Vorteile der Parallelisierung maximieren und eine schnellere Gesamtleistung erzielen.

Resource Caching

Das Zwischenspeichern von Ressourcen ist eine Technik, die bei der Entwicklung von 3D-Engines eingesetzt wird, um die Laufzeitleistung zu erhöhen und den Verbrauch von Systemressourcen zu verringern.

Wenn eine 3D-Engine Modelle, Texturen oder andere Ressourcen lädt, benötigt sie dafür Zeit und Systemressourcen wie Speicher und Verarbeitungsleistung. In dynamischen Szenen mit vielen Objekten kann das Laden von Ressourcen zu einem großen Engpass werden, der zu Verlangsamungen führt und die Gesamtleistung verringert.

Resource Caching behebt dieses Problem, indem Ressourcen nur einmal geladen und dann für zukünftige Verwendungen im Speicher bereitgehalten werden. Das bedeutet, dass eine Ressource, wenn sie benötigt wird, schnell aus dem Speicher abgerufen werden kann, anstatt erneut von der Festplatte geladen zu werden.

Durch die Zwischenspeicherung können sich auch mehrere Modelle die gleichen VertexBuffer oder Texturen teilen. Dies reduziert den Speicherbedarf auf der GPU.

Insgesamt wird durch die Zwischenspeicherung von Ressourcen der Zeitaufwand und der Bedarf an Systemressourcen für das Laden von Ressourcen drastisch reduziert, was zu einer reibungsloseren und schnelleren Leistung in 3D-Engines führt.

Aufgaben

1. Resource Caching steuerbar machen

1.1: Verschaffen Sie sich einen Überblick über die beiden verwendeten Technologien. Verstehen Sie genau an welchen Stellen diese in den Programmablauf eingreifen und in wie weit die beiden Verfahren voneinander unabhängig sind.

1.2: Erweitern Sie die settings.h um ein weiteres flag mit dem Sie das Zwischenspeichern von Ressourcen aktivieren oder deaktivieren können und implementieren Sie die nötigen Änderungen um dieses Feature ein- und ausschaltbar zu machen. Für die nachfolgenden Aufgaben müssen Sie es deaktivieren.

struct Settings { ... bool enableResourceCaching = true; ... };

2. Laufzeitverhalten analysieren

2.1: Untersuchen Sie die Klasse Timer und verstehen sie deren Funktionsweise. Was tut steady_clock::now() und was tut glfwGetTime()? Platzieren Sie Timer an allen Stellen, die Sie für die folgenden Aufgaben benötigen. Das beinhaltet auch Kapitel 3.

2.2: Erstellen Sie eine Auswertung der Ladezeit der Hauptszene bei deaktiviertem Resource Caching. Führen Sie dazu mindesten 5 Versuche durch, bestimmen Sie jeweils Laufzeit und Standardabweichung. Wie genau das funktioniert und aussehen soll, zeige ich Ihnen in der ersten Hälfte der Veranstaltung.

  • Alles was passiert bevor die Hauptszene main.scene geladen wird, fassen wir zu einem Event Engine Start zusammen.
  • Das Laden der Hauptszene ist das zweite Event.
  • Das Laden jedes Modells, jedes Meshes, jeder Textur und jedes Shaders die mit der Hauptszene geladen werden, betrachten wir als eigene Events.
  • Parallelisierte Abläufe sollen als solche zu erkennen sein.
  • Jedes Event erhält eine Kachel in der folgenden Form:

n = Anzahl der Versuche, avg = Mittelwert der Laufzeit, sd = Standardabweichung. Zur Erklärung der Begriffe siehe hier.

2.3: Stellen Sie den erreichten Geschwindigkeitszuwachs durch MultiThreading anschaulich Prozentual dar. Berücksichtigen Sie dafür die folgenden Punkte:

  • Wieviel Prozent der Ladezeit kann auf Ihrem System gespart werden?
  • Welchen Anteil an dieser Ersparnis haben Meshes, Shader, Texturen, etc.?
  • Wie ändern sich diese werte wenn man Resource Caching aktiviert?

Vergleichen Sie diesen Wert mit dem Ergebnis bei zusätzlich aktiviertem Resource Caching.

3. Fazit und Transferleistung (Hausaufgabe)

3.1: Welche Vorteile ergeben sich aus den verwendeten Maßnahmen und sind diese sinnvoll?

3.2: Erkennen Sie weitere Programmteile die durch Multi Threading oder Resource Caching optimiert werden könnten? Wie hoch wäre der Geschwindigkeitszuwachs?

3.3: Sehen Sie Optimierungsmöglichkeiten an den Verfahren selbst? (Gemeint sind hier konzeptionelle Änderungen wie z.B. die Verwendung von Futures statt Threads.) Belegen Sie diese durch Zahlen.

Diese Seite speichern:
Redvery Journal
Computergrafik-Effiziente-Algorithmen-4.trj
Seite speichern
Computergrafik-Effiziente-Algorithmen-4.trj
Redvery Journal ist ein modernes Dateiformat mit dem diese Seite incl. aller Bilder und Anhänge gespeichert und offline verwendet werden kann.

Die passende App dazu gibt es kostenlos unter www.redvery.com/journal
Speichern
Abbrechen