Vortragsfolien
Transcrição
Vortragsfolien
Raytracing mit CUDA Dorian Weber Gliederung • kurze Einführung in CUDA • Funktionsweise einer traditionellen Grafikengine (z.B. OpenGL, Direct3D) • Design- und Architekturentscheidungen • Implementation • Demonstration 2 CUDA • „Compute Unified Device Architecture“ von NVIDIA • nutzt die Grafikkarte als parallelen CoProzessor • Architektur ist stark auf grafische Berechnungen optimiert 3 !"#$ *+%, -(./("$0&1&2 98":8;66 *+%,3452$(6& >&82&/ %&'()& *+%,378&(.&8 <8(= >&82&/ <8(= !"#$% !"#$% Architektur 4 CUDA Schnittstellen • Application Programming Interface kommt in zwei Geschmacksrichtungen • Drivers API (low level) • Runtime API (high level) • APIs schließen sich gegenseitig aus 5 Drivers API Vorteile • Null Overhead • Host-Code unabhängig vom NVCC • dynamische Kernelverwaltung • keine CUDA Runtime Library nötig Nachteile • low level, imperativ • kein Emulationsmodus • Compilierung von Host- und Devicecode getrennt • explizite Modulverwaltung 6 Runtime API Vorteile • high level, imperativ • automatisches Laden benötigter Module • Funktionssetup und implizites Typecasting • Emulationsbibliothek • Compilerintegration Nachteile • Vorhalten aller potentiell benötigten Module • Abhängigkeit des Devicecodes vom Hostcompiler • linkt CUDA Runtime 7 !'+8 ;"#,: Speicherhierarchie „All programming can be viewed as an exercise in caching.“ (Terje Mathisen) ;"#,: !&2&+"2&'()*&+,-&' !&2&+"2&'()*&+,-&' .$'#%8,%523 .$'#%8,%523 <&1+52&' <&1+52&' <&1+52&' <&1+52&' 6-'&%8 6-'&%8 6-'&%8 6-'&%8 9#:%"&' )*&+,-&' 9#:%"&' )*&+,-&' 9#:%"&' )*&+,-&' 9#:%"&' )*&+,-&' !"#$%"&'()*&+,-&'(./01&,%,-23 4#052%02&'()*&+,-&'(.1&,%,-23 6&72/'5*&+,-&'(.1&,%,-23 8 Klassische 3D Engines • Rendervorgang mittels Matrizen umgesetzt • elegante und einheitliche Beschreibung aller Transformationen • Bewegung, Rotation, Skalierung, Projektion, Clipping • jede beliebige Kombination (Matrixmultiplikation) 9 ! ! !"# !"# $#$% !"# #$% !"# !"#! "# & & & & & & ' & !"#$#%"&'($#)%* !"# !(& ! # $#$% !(& ! # #$% !(& ! # !"# !(& !# & & & & & & ' & & & & ' # # !# !# & ' & & % & & ' & & & ' ' ' +,-#%.-%/$#%"&0(%#01%&1(021/#") Beispiel: Rotation 10 !"#$%&'$()* Rendervorbereitung 78/"0$"%4.2)$).1)"("1% 916%6(":"1 +)",%&'$()* ;<=>..(6)1'$"1%("#'$)?% @9(%>'3"('%8"("A:1"1 -(./"0$).123'$()* '9B%6)"%C)#62A:)(3"8"1"% 4(./)@)"("1 +)",4.($%&'$()* D8"(B#D22)E"%-910$"% ,"E2A:1")6"1 5"16"(1 11 Matrizen für Raytracer? Vorteile • einheitliche Beschreibung • leicht parallelisierbar • etabliert (also viel Hilfe verfügbar) • intuitive Mathematik Nachteile • sehr groß - 4 GPURegister pro Matrix • viele Multiplikationen • Gimbal Lock 12 (Einheits-)quaternionen • leben auf einer 4D Hyperkugel • ein Realteil, drei Imaginärteile • Drehungen im Raum sehr elegant zu beschreiben • passen in ein GPU Register 13 ! !"# !"# $$%!%" !"# !"# $$%#% $ !"#! "#$$%%%& %&! !"# $$ $ !"#$%"&'()*&%+#",# ! $!$! $!$ !"# !'( '$%)%" * '!"# !'( '$%)%" ) !"# !'( '$%)% $ & ) & '!"# ! '(' $%)% $ ( * !"# ! '(' $%*%& ) '!"# ! '(' $%*%& ) %&! ! '(' $ ) %&!! '( ' $ ) -).&"/."0*&",# Rotation von vorhin 14 Designentscheidungen • Drivers API • Quaternionen • OpenGL Subsystem • Phongs Lichtmodell 15 Implementation (I) !"#$%&'#(!"#$"%)* ++(,-.-/0#-(1-&#-(2'3&%&'#(4"5(1-6(7&813/0&.6 !"#$%9:(;(&"'()*+)* !"#$%9<(;(&"'()*,)* ++(,-.-/0#-(1-#(2.&6=.3%.408>(1-.(1"./0(1-#(2&:-8(?-0% !&"'(&)*&+,%9@'3&%&'#(;(-+'$&+9@'3&%&'# !&"'(&)*&+,%9.&/0%"#?(;(&"'(%-./%0!/0)-+'$&+>(!"#$%* ++(-.6&%%8-(1&-(!4.,-(1-3(2&:-83 !"#$%954.,-(;(&"'(-1"23)2)%)!&"'(&)*&+,%>(-+'$&+* %"'4%# 16 Implementation (II) !"#$%&'#(!"#$%&"'()')*)!"#$%&*('$()#$+ *+&+#(,(-&#%./0/"#123/4. 55(4.6%&77.(1.#($8.%.#(946%3#1 ,-!"./+01)'"(,(!"#+%,-%.#)!"#$%&+ /",,(+01)'"("#08.&:-(;<==(&6% *+&+#(,(0##",10#"()')*)*+&+#*(+01)'">23/4.+ 55(6:-&.?.(@&81(7&%(@.&%./.#(A%/3-8.#("7(1&:2*%$"")3!"#$%&(,(!"#2304)5607)!"#$%&*/+01)'"+ *+&+#(,(0##",10#"()')*)*+&+#*(!"#$%&"'()')*)2*%$"")3!"#$%&./'$()#$+ 4)5&)'"-+3!!"#$%&(,(!"#6"8'"9#%),607)!"#$%&*/+01)'"+ *+&+#(,(0##",10#"()')*)*+&+#*(!"#$%&"'()')*)4)5&)'"-+3!!"#$%&./'$()#$+ 6#)*%738!!"#$%&(,(!"#6"8*09#%),607)!"#$%&*/+01)'"+ *+&+#(,(0##",10#"()')*)*+&+#*(!"#$%&"'()')*)6#)*%738!!"#$%&./'$()#$+ 55().%:*(>>>+ *"#1*,(*+&+# 17 Implementation (III) !"#$%&'#(!"#$%&'%(#)!"#$%&* ++(,-%.-(/-#($0-&#,%-#(12,%3#/(3"4("#-#/0&56 '()*(!"(7(89!898:; +,-./"(7(9<== ++(%-,%-(4>?(@-/-,(A2@-$%B('2(-,(C'#(/&-,-D(E%?360(F-,56#&%%-#(G"?/4>?(@-/-,(A2@-$%(0H )"&&(0(C'D(3$%"-00-#(E%?360(F-,56#&%%-#(G"?/*&+(/&-,-?(12,%3#/(1(!"($0-&#-?(&,%(30,('()*(!"B +,&& +,-./"(7(0 '()*(!"(7(1(!" -"#*-&2'()*(!"32+,-./" 18 Details • Objekte und Lichtquellen im Texturspeicher • Renderstruktur im konstanten Speicher • Rekursionsbehandlung mittels lokalem Stack (a priori beschränkt) • Ausnutzung der Asynchronität zwischen GPU und CPU 19 Was ist getan? • Framework zur komfortablen Bedienung der Drivers API - Template-basiert • Toolset für die Steuerung des Tracers (insbesondere mathematische Werkzeuge) • Werkzeuge für das Gerät 20 Was ist getan? • Raytracer: • Phong Lichtmodell • Reflexion & Brechung (allgemein gelöst, physikalisch korrekt) • beliebig viele Objekte und Reflektionen • Echtzeit 21 Was fehlt? • Objekte sitzen nicht im Texturspeicher • nur eine (frei positionierbare) Lichtquelle • ausschließlich Kugeln, allerdings Vorbereitung für weitere Objekttypen • kein Schatten • Stack für Rekursion unnatürlich langsam 22 Demo 23 Vielen Dank für eure Aufmerksamkeit! 24