Random Heightmap on GPU

Slides:



Advertisements
Ähnliche Präsentationen
Imperative Programmierung
Advertisements

Matrixmultiplikation
< CUDA implementation>
Constantin Timm Informatik 12 TU Dortmund
Qualitätssicherung von Software (SWQS)
6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
der Universität Oldenburg
Datenstrukturen Look-Up Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung.
Kollisionen erkennen Kollisions- und Schnittpunkttests auf Dreieckbasis Kollisions- und Schnittpunkttests auf Viereckbasis Einsatz von achsenausgerichteten.
Polymorphie (Vielgestaltigkeit)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Seminar parallele Programmierung SS 2003
OpenMP Präsentation im Rahmen des Seminars
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Diskrete Mathematik I Vorlesung Arrays-
Vorlesung, Wintersemester 2009/10M. Schölzel 1 Optimierungstechniken in modernen Compilern Optimierungstechniken für SMP- Architekturen.
Christian Steinle, Joachim Gläß, Reinhard Männer
GPU Architectures: GeForce 8, GeForce 9 and Future
1 Friedrich-Alexander-Universität Erlangen-Nürnberg Christoph Rager Modellbasierte Zuverlässigkeitsanalyse (Hauptseminar 1: Qualitäts- und Zuverlässigkeitsmangagement)
Matrix Multiplication on CUDA
< Best practices >
Java programmieren mit JavaKara
Duo- und Quad Prozessor-Architektur
Effiziente Algorithmen
Effiziente Algorithmen
Eine Implementierung einer effiziente externe geordnete (!) lineare Liste Operationen: Search(x) Insert(x) Delete(x)
Black Box Algorithmen Hartmut Klauck Universität Frankfurt SS
Quantum Computing Hartmut Klauck Universität Frankfurt WS 05/
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Quantum Computing Hartmut Klauck Universität Frankfurt WS 04/
GPU Computing Burim Kameri Fachhochschule Hannover (FHH)
GPU Computing Burim Kameri Fachhochschule Hannover (FHH)
Einführung in die Programmiersprache C 4
Parallel Matrix Multiplication
Technische Informatik Reihungen – Felder - Arrays.
LabView Erste Schritte.
Algorithm Engineering „GPU Algorithmen“
AES – Advanced Encryption Standard
Ein Vortrag von Simon Bayer
Grundkonzepte des Programmierens (mit ActionScript)
Optimierungstechniken in modernen Compilern
Arrays und ArrayLists In JAVA.
Systemsoftware und Betriebssysteme
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
PHP: Operatoren und Kontrollstrukturen
Variablen. var meineZahl:Number = 7; meineZahl 7 Name TypWert = Zuweisung von Variablen.
Parallelisierung für Multiprozessor-Maschinen Teil 2.
Parallele Programmierung mit Java, SS 2001 Spar/Timber - Programmiersprache und Compiler für high-performance Berechnungen Technische Universität München.
Parallelisierung für Multiprozessor-Maschinen
Arrays und ArrayLists In JAVA.
3. Beschreibung von Abläufen durch Algorithmen 3.4 Zufall
Parallele Programmierung im.NET Framework Darmstadt, Präsentation am Beispiel von C-Sharp (C#)  Wichtige Grundlagen  Generika, Delegate, Lambda,
Übersicht Nachtrag zu Ausdrücken
Directors Prof. Dr.-Ing. K.D. Müller-Glaser Prof. Dr.-Ing. J. Becker Prof. Dr. rer. nat. W. Stork Institute for Information Processing Technology.
Software Engineering SS04 Paralleles Programmieren FH Aachen, Prof. Dr.-Ing. Michael Trautwein Andrej Kühnal, Perez-Otuno Rodrigo.
Analyse und Umsetzung einer Filter-basierten Paketverarbeitungsmaschine für IP-Netzwerke Lehrstuhl für Systemarchitektur und Betriebssysteme Forschungs-
Diskrete Mathematik I Vorlesung 2 Arrays.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Minimal spannende Bäume
Zufallsprogrammierung
Konvexe Hüllen (Convex Hulls)
Institut für Informationssysteme Technische Universität Braunschweig Institut für Informationssysteme Technische Universität Braunschweig Verdrängung von.
Normale zur Gerade g durch den Punkt A. A A.
Lineare Algebra Softwareprojekt: Anwendung von Algorithmen Sebastian Kürten, Philipp Borgers SoSe 2010.
Blowfish mit CUDA Dominik Oepen Inhalt ● Blowfish Grundlagen ● Implementierungsdetails ● Performance ● Fazit.
Adiazenzmatrix des Graphen
Implementieren von Klassen
Schleifen Datenfelder (Arrays) Verzweigungen
 Präsentation transkript:

Random Heightmap on GPU Hauptseminar MAP08 Random Heightmap on GPU Hannes Stadler, Sebastian Graf HannesStadler@gmx.de, sebgr@gmx.net Betreuung: Matthias Hartl, Hritam Dutta, Frank Hannig Hardware-Software-Co-Design Universität Erlangen-Nürnberg Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Gliederung Was ist eine Heightmap? Fault Algorithmus Parallelisierung des Fault Algorithmus Umsetzung in Cuda Benchmarks Probleme Zusammenfassung Kurzen Überblick geben, was in den nächsten 20 Minuten behandelt wird Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Was ist eine Heightmap? dt. Höhenfeld Zwei-dimensionales Skalarfeld Beschreibung eines Höhenreliefs Jedem Punkt ist ein Wert zugeordnet, der dessen Höhe angibt Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Fault Algorithmus Erzeuge ein ebenes 2-dimensionales Grid Algorithmus: Wähle zwei zufällige Punkte im R² Lege Gerade durch diese zwei Punkte Erhöhe alle Punkte auf der eine Seite der Gerade, erniedrige die auf der anderen um einen konstanten Wert Wiederhole diese Schritte für eine vorher festgelegt Anzahl von Iterationen Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Fault Algorithmus Pseudo-Code: foreach(Iteration) { CreateRandomLine(); foreach( RowOfImage) foreach(PixelOfRow) processNewValue(); } Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Fault Algorithmus Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Variationen des Fault Algorithmus Multiplikation der Geraden mit Sinus/Cosinus um weiche Übergänge an den Kanten zu bekommen Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Parallelisierung Fault Algorithmus Algorithmus besteht aus drei for-Schleifen Parallelisierung der Schleifen: 1.for-Schleife durchläuft Anzahl der Iterationen  mehrere Iterationen parallel möglich, da unabhängig 2.for-Schleife führt Berechung für jede Zeile im Bild aus Parallelisierbar, da Zeilen unabhängig 3.for-Schleife arbeitet auf genau einer Zeile Pro Zeile eine Grenze ( Schnittpunkt mit der Geraden), Aufteilung in Teil der erhöht und der erniedrigt wird Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Umsetzung in CUDA Naiver Ansatz: Optimierter Ansatz: Laden des Grids in Global Memory Threads arbeiten auf Daten im Global Memory Probleme mit Nebenläufigkeit, Performance etc. Optimierter Ansatz: Aufteilung des Grids in Blöcke Block in Shared Memory laden Berechnung aller Iterationen für jeweiligen Block Danach wieder zurück in Global Memory speichern Weitere Optimierungen: Coalesced Speicherzugriff der Threads Zugriff auf Zufallzahlen über Constant Memory Oder: Zufallszahlen auf der GPU erzeugen Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Quellcode – Kernelaufruf int CreateHeightMap() { CUT_DEVICE_INIT(); dim3 threads(TPL,ZPB);// 16 x 16 dim3 grid(WIDTH/BLOCKWIDTH,HEIGHT/ZPB); // 1k x 1k -> 64 x 8, bei 2k x 2k -> 128 x 16 int rand[ITERATIONS*4]; for(i=0;i<ITERATIONS*4;i++){ // rand[ ] mit Zufallszahlen füllen } CUDA_SAFE_CALL(cudaMemcpyToSymbol(rand_d, rand ,ITERATIONS*4*sizeof(int),0) ); GLfloat* HeightMap_d; CUDA_SAFE_CALL(cudaMalloc((void**) &HeightMap_d, WIDTH*HEIGHT*sizeof(float))); splitpicture<<<grid, threads>>>(HeightMap_d); CUDA_SAFE_CALL(cudaMemcpy(HeightMap, HeightMap_d , WIDTH*HEIGHT*sizeof(float), cudaMemcpyDeviceToHost) ); Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Quellcode – Kernel extern __constant__ int rand_d[]; __global__ void splitpicture(GLfloat *HeightMap_d) { __shared__ float aRow[ZPB][SMB/ZPB]; // Init. mit default-Wert weggelassen for(int i = 0; i < ITERATIONS; i++){ // Variableninitialisierung, random-Werte, „Wendestelle“ bestimmen for(int a=0;a<((SMB/ZPB)/TPL);a++){ int rel_pos=threadIdx.x*(BLOCKWIDTH/TPL) + a; aRow[threadIdx.y][rel_pos] +=4*faktor*((float)value)*(1-__sinf(phi)/WAVEWIDTH); } for(int j = 0; j < ((SMB/ZPB)/TPL); j++){ HeightMap_d[offset+threadIdx.y*WIDTH+threadIdx.x*(BW/TPL)+j] = aRow[threadIdx.y][threadIdx.x*(BLOCKWIDTH/TPL)+j]; Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Probleme CUDA-Kernel kann unter X-Linux leider nur max. 5sek laufen, bevor er terminiert wird der Komplexität der Aufgabe ist ein Ende gesetzt ;-) Komischerweise klappts manchmal doch ab und an stürzt auch die GPU ab Bildgrößen müssen vielfache von Zweierpotenzen sein Im Idealfall: sind Zweiterpotenzen Ursprüngliche (naive) Implementierung hatte (im Vergleich zur Finalen Version) nur mäßige Performanz Man muss schon manchmal etwas genauer nachdenken Dokumentation von CUDA teilweise ungenau z.B. Shared Memory kann nicht voll ausgenutzt werden Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Benchmarks - CPU CPU-Implementierung ( P4 – 3,0GHz ) Bildgröße Iterationen Laufzeit MPixel/s 512x512 256 7,2s 9,32 1024x1024 28,7s 9,35 512 59,4s 9,04 1024 120,7s 8,90 2048 229s 9,38 4096 457,35s 9,39 2048x2048 1834s 9,37 4096x4096 ~3700s ~9,37 Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Benchmarks - CUDA CUDA-Implementierung (GF 8800 GTX ) Bildgröße Iterationen Laufzeit MPixel/s SpeedUp 512x512 256 0,015s 4473,92 480 1024x1024 0,059s 4549,75 486,44 512 0,118s 503,39 1024 0,235s 4569,11 513,62 2048 0,47s 487,23 4096 0,94s 486,54 2048x2048 0,92s 4668,44 497,83 1,84s 498,37 3,68s 4096x4096 3,60s 4772,19 509,72 7,20s 4768,21 513,46 3072x4096 7,40s 3484,76 372,55 Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Zusammenfassung Auf der CPU teilweise nicht zumutbare Ausführungszeiten Allerdings noch größere Problemgrößen lösbar als mit CUDA, da kein Timeout Primitive CUDA-Implementierung Relativ schnell lauffähig Speedup bereits zwischen 10 und 40 Endversion: Enormer Speedup von ~ 500 Bereits bei kleinen Eingabedaten Sehr gut skalierend Allerdings auch nur durch viel Arbeit erreichbar Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf

Demo Fragen? Genug geredet, jetzt wird’s gezeigt! Oder gibt’s bisher schon Fragen? Friedrich-Alexander-Universität Erlangen-Nürnberg Hannes Stadler, Sebastian Graf