Interaktive Globale Beleuchtung nach dem Antiradiance-Verfahren mittels der Open Computing Language (OpenCL) Verteidigung der Belegarbeit Andreas Stahl
Zielstellung Globales Beleuchtungsverfahren für die OpenCL umsetzen. Erfahrungen sammeln, Integration ins CGV- Framework. Ausgewähltes Verfahren: Antiradiance
Grundlagen Antiradiance-Verfahren: Implicit visibility and antiradiance for interactive global illumination. Dachsbacher et al. 2007 Link-Erzeugung auf der GPU: Data-parallel hierarchical Link Creation for Radiosity. Meyer et al., 2009
Antiradiance Analog zu Radiosity-Verfahren: Einteilung der Szene in Patch-Hierarchie Verknüpfen der Patches zum Lichttransport Globale Richtungsdiskretisierung der Hemisphären (Bins).
Antiradiance Beschleunigungsansatz: Verzicht auf Sichtbarkeitsberechnung bei Verknüpfungen. Negative Leuchtstärke wird von Patch-Rückseite abgestrahlt.
Emitter-Patch Links AR-Link
Kern des Verfahrens,*./01 2"34*4/0"3# *56)*53#!"#$"#% &'()*'+,*--!(/*'+,*-- 73#834"#%
OpenCL Programmieren verschiedener Prozessortypen, plattformunabhängig. Kernels in C-Programmiersprache. Einschränkungen: keine Rekursion, kein dynamischer Speicher innerhalb Kernels. Programme werden zur Laufzeit kompiliert. Scheduling durch die OpenCL-Runtime, Queue-basiert.
OpenCL: Potential Ablösung von CUDA, ATI-Stream, Shadern bei der Programmierung von GPUs. Vereinfachung der Programmierung parallelisierter und vektorisierter Programme, auch auf CPUs. Lese- & Schreib-Zugriff auf 2D- und 3D-OpenGL- Textur-Objekte.
Umsetzung
Kollaborationsdiagramm!3*'* 9*:&*2%; >*"0*%,&*+6%*' -"#./0*12 9*:&*2%; <6%32&'=",06%&"'!"#4*, 1%*##%;!"#$%&"';&';+*,;!:*'*;+6,!"#$%&"'( )*'+*,*, 9&*%*%;>?@;$'+; 7*,86#%*% 5'%&,6+&6'3*( 7&*8
Kollaborationsdiagramm!3*'* 9*:&*2%; >*"0*%,&*+6%*' -"#./0*12 9*:&*2%; <6%32&'=",06%&"'!"#4*, 1%*##%;!"#$%&"';&';+*,;!:*'*;+6,!"#$%&"'( )*'+*,*, 9&*%*%;>?@;$'+; 7*,86#%*% 5'%&,6+&6'3*( 7&*8
Kollaborationsdiagramm!3*'* 9*:&*2%; >*"0*%,&*+6%*' -"#./0*12 9*:&*2%; <6%32&'=",06%&"'!"#4*, 1%*##%;!"#$%&"';&';+*,;!:*'*;+6,!"#$%&"'( )*'+*,*, 9&*%*%;>?@;$'+; 7*,86#%*% 5'%&,6+&6'3*( 7&*8
Kollaborationsdiagramm!3*'* 9*:&*2%; >*"0*%,&*+6%*' -"#./0*12 9*:&*2%; <6%32&'=",06%&"'!"#4*, 1%*##%;!"#$%&"';&';+*,;!:*'*;+6,!"#$%&"'( )*'+*,*, 9&*%*%;>?@;$'+; 7*,86#%*% 5'%&,6+&6'3*( 7&*8
C++/CPU-Solver Dient als Referenz-Implementierung des Verfahrens. Benutzt rekursive Algorithmen. Single-Threaded.
OpenCL-Solver OpenCL-Setup Erzeugt und befüllt Speicherpuffer Veranlasst Kernel-Scheduling Parallelisiertes Linking und iterative Beleuchtungsrechnung
Problem Parallelisierte Beleuchtungsrechnung mittels Shooting verursacht Race-Conditions. Thread 1 T 2 T 3 Meyer et al: CUDA-Atomic- Operations. Nachteile: nur für Integer- Datentypen, langsam, wirkt sich bei jeder Iteration aus.
Lösung Parallele Gathering Radiosity! Sortiere und Zähle Verknüpfungen pro Empfänger-Patch (einmalig). T 1 T 2 Gathering: Sammle parallel pro Patch die Beleuchtungswerte der Links ein. Vorteile: einmaliger Vorgang. Volle Unterstützung von Float. Nachteil: Thread-Lebensdauer schwer abzuschätzen.
Ergebnisse
Renderer konstant bilinear blending
Renderer konstant bilinear blending
Renderer konstant bilinear blending
Renderer konstant bilinear blending
Laufzeiten - Linking Bins 64 128 256 512 4,3 ms 7,8 ms 26,8 ms 20,7 ms 76,9 ms 46,4 ms 171,9 ms 420,7 ms 961,5 ms 281,7 ms C++ OpenCL CPU OpenCL GPU 1718,7 ms 813,0 ms 1 ms 10 ms 100 ms 1000 ms Laufzeit (log)
64 3,4 ms 4,2 ms Laufzeiten - Iteration 148,7 ms C++ OpenCL CPU OpenCL GPU Bins 128 256 8,4 ms 5,2 ms 18,9 ms 8,9 ms 327,6 ms 692,4 ms 512 41,6 ms 17,3 ms 1311,7 ms 1 ms 10 ms 100 ms 1000 ms Laufzeit (log)
Bewertung Beleuchtungsrechnung unter OpenCL ist schon auf CPU bis zu 30x schneller als C++/CPU Vektorisierung, parallelisierung. GPU nur bis zu 2-3 mal schneller als CPU Speicherzugriffs-Muster z.z. wenig optimal. GPU-CL Treiber noch preview
Updateraten 1x Linking 1x Iteration 18,9 ms 8,9 ms 20,7 ms 692,4 ms 961,5 ms 281,7 ms 1 ms 10 ms 100 ms 1000 ms C++ OpenCL CPU OpenCL GPU OpenCL GPU für 7 Iterationen bei 256 Bins Nur Beleuchtung: 16 Hz Vollständig (inkl. Linking): 12 Hz
Demonstration
Diskussion OpenCL
OpenCL plattformunabhängig? Bei der Entwicklung ausschließlich OpenCL SDK von AMD/ATI benutzt, wegen CPU-Unterstützung. Erst seit Ende Dezember mehrere Plattformen auf einem System ansteuerbar (ICD - Installable Client Driver). Auf NVIDIA nicht zum Laufen gebracht (kein ICD).
OpenCL - ausgereift? Seit 21.12.: ATI Stream v2.0 with OpenCL 1.0 Support Performanceunterschiede Beta 4 zu Final: GPU: + ~10% CPU: - ~10% Stabilität, Speicherlecks wurden ausgebessert.
Aufwand Programmierung in OpenCL ist völlig anderes Paradigma als normales C++/CPU Übertragen der Algorithmen in nicht-rekursive Kernels, beschränkter Speicherzugriff. Der Host ist nur für Buchhaltung zuständig, d.h. Scheduling, Puffermanagement.
Ausblick
Erweiterungen Direkte Licht- und Schatteneffekte. Flexiblere Patch-Hierarchie-Erzeugung. Optimieren der verwendeten Kernels. Übertragen aller Verfahrensteile in die OpenCL.