05.05.2009Marcus Schaber 1 /33 Seminar - Paralleles Rechnen auf Grafikkarten Seminarvortrag: Übersicht über die Programmierung von Grafikkarten Marcus.

Slides:



Advertisements
Ähnliche Präsentationen
Computer Graphics Shader
Advertisements

Übersicht Anzeigegeräte Framebuffer Grundlagen 3D Computergrafik
Imperative Programmierung
Datenparallele Algorithmische Skelette in Muesli
Constantin Timm Informatik 12 TU Dortmund
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.
Java: Objektorientierte Programmierung
FH-Hof Indirekte Adressierung Richard Göbel. FH-Hof Einfache Speicherung von Daten Eine "einfache" Deklaration definiert direkt eine Speicherplatz für.
Java: Grundlagen der Sprache
FH-Hof Texturen Richard Göbel. FH-Hof Anwendungen von Texturen Darstellung von 2D-Bildern Gestaltung von Oberflächen Simulation komplexer Geometrien...
Strukturen. In einer Struktur kann eine beliebige Anzahl von Komponenten (Daten) mit unterschiedlichen Datentypen (im Gegensatz zu Feldern) zusammengefaßt.
Shaderprogrammierung T. Goeschel + F. Theilacker
OpenMP Präsentation im Rahmen des Seminars
Praktikum Entwicklung und Einsatz von Geosoftware I - Sitzung 3 Klassen, Objekte, Arrays und Kontrollstrukturen Sommersemester 2003 Lars Bernard.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Java3d „Licht und Material“
Diskrete Mathematik I Vorlesung Arrays-
Zusammenfassung Vorwoche
OpenGL mit Delphi Allgemeines OpenGL-Funktionsbezeichnungen
Arrays,Strings&Pointer in C/C++
Displacement Mapping Dynamische Generierung detaillierter Geometrien
Weiteres Programm Studium des Breitendurchlaufs Hierzu
GPU Architectures: GeForce 8, GeForce 9 and Future
Random Heightmap on GPU
Matrix Multiplication on CUDA
< Best practices >
Leitfaden Motivation Was ist CUDA ? NVIDIA Grafikkarte Programmierung
Java programmieren mit JavaKara
FHP - Fachbereich Bauingenieurwesen
Informatik 1 Übung 8. NACHBESPRECHUNG Übung 8 Rekursion Existiert Weg von A nach B?
Clustering mittels Grafikprozessor
Einführung in die Programmiersprache C 3.Tag Institut für Mathematische Optimierung - Technische Universität Braunschweig.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Von der Planung bis zum Hauptmenü Seminar: Softwaretechnologie II Dozent: Prof. Manfred Thaller Referent: Jan Bigalke.
GPU Computing Burim Kameri Fachhochschule Hannover (FHH)
GPU Computing Burim Kameri Fachhochschule Hannover (FHH)
Shader.
Einführung in die Programmiersprache C 4
Informatik 1 Letzte Übung.
Ein Vortrag von Simon Bayer
Arrays / Felder Themen: Arrays / Felder / Vektoren Was soll das eigentlich? Erstellen von Arrays Arrays auslesen. Wie sie verwaltet werden.
Diplomarbeit: Echtzeitdarstellung komplexer Landschaften in illustrativer Weise Echtzeitdarstellung komplexer Landschaften in illustrativer Weise Bearbeiter:
Die Welt der Shader Universität zu Köln WS 14/15 Softwaretechnologie II (Teil 1) Prof. Dr. Manfred Thaller Referent: Lukas Kley Fortgeschrittene Techniken.
Autor: Timo Pagel Nutzung: Diese Lernkarten sind für die Nutzung mit OpenCards gedacht Siehe dazu
Diskrete Mathematik I Vorlesung 2 Arrays.
2 Datenabstraktion Geheimnisprinzip:
Proseminar – Computer Graphics Nikolaos Tsanakas computer graphics & visualization OpenGL Shading Language.
Pointer, Arrays und verkettete Listen. Mehrdimensionale Arrays  Pointer auf ein Array von Pointern  int32 **matrix = new int32*[3];  matrix: Zeiger.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Strukturen (Eigenschaften) Strukturen dienen zur Zusammenfassung mehrerer Komponenten verschiedener Typen zu einer Einheit, die dann mit gemeinsamen Namen.
Pointer. * und &  Bei der Definition int var1; ○ // „normale“ Variable int *var2; ○ // Zeiger auf einen Integer int *var2 = NULL; ○ // … incl. Initialisierung.
Paralleleles Rechnen auf Grafikkarten Einführung Christian Schwarz.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
Lineare Algebra Softwareprojekt: Anwendung von Algorithmen Sebastian Kürten, Philipp Borgers SoSe 2010.
Aufbau und Funktion von 3D- Grafikkarten von Christian Reis.
Blowfish mit CUDA Dominik Oepen Inhalt ● Blowfish Grundlagen ● Implementierungsdetails ● Performance ● Fazit.
Einführung in AspectJ ● Inhalt: 1)Überblick 2)Elemente des crosscuttings in AspectJ 3)„Hello World“ in AspectJ 4)Wie Aspekte in Java verwoben werden 5)Join.
Tobias Sammet 8DY1 Programmieren Tobias Sammet 8DY2 Programmierung ● = das Schreiben eines Computerprogramms ● Dient zur Lösung eines.
Das IT - Informationssystem
Programmieren und Problemlösen
Programmieren in C Wie speichert C
Programmieren und Problemlösen
Einführung in die Programmierung
Arrays in C Ein Array ist eine Variable, die aus einer Anzahl von Elementen des gleichen Datentyps besteht, die aufeinanderfolgend im Speicher liegen.
Implementieren von Klassen
Shared Memory Programmierung: Grundlagen
 Präsentation transkript:

Marcus Schaber 1 /33 Seminar - Paralleles Rechnen auf Grafikkarten Seminarvortrag: Übersicht über die Programmierung von Grafikkarten Marcus Schaber Betreuer: J. Kunkel, O. Mordvinova

Marcus Schaber 2 /33 Gliederung ● Allgemeine Programmierung Parallelität, Einschränkungen, Vorteile ● Grafikpipeline Programmierbare Einheiten, Hardwarefunktionalität ● Programmiersprachen Übersicht und Vergleich, Datenstrukturen, Programmieransätze ● Shader Shader Standards ● Beispiele Aus Bereich Grafik

Marcus Schaber 3 /33 Programmierung Einschränkungen ● Anpassung an Hardware Kernels und Streams müssen erstellt werden. Daten als „Vertizes“, Erstellung geeigneter Fragmente notwendig. ● Rahmenprogramm Programme können nicht direkt von der GPU ausgeführt werden. Stream und Kernel werden von der CPU erstellt und auf die Grafikkarte gebracht

Marcus Schaber 4 /33 Programmierung Parallelität ● „Sequentielle“ Sprachen Keine spezielle Syntax für parallele Programmierung. Einzelne shader sind sequentielle Programme. ● Parallelität wird durch gleichzeitiges ausführen eines Shaders auf unterschiedlichen Daten erreicht ● Hardwareunterstützung Verwaltung der Threads wird von Hardware unterstützt

Marcus Schaber 5 /33 Programmierung Typische Aufgaben ● Geeignet: Datenparallele Probleme Gleiche/ähnliche Operationen auf vielen Daten ausführen, wenig Kommunikation zwischen Elementen notwendig ● Arithmetische Dichte: Anzahl Rechenoperationen / Lese- und Schreibzugiffe ● Klassisch: Grafik Viele unabhängige Daten: Vertizes, Fragmente/Pixel Operationen: gleicher shader für jedes Vertex/Fragment Z.B. Auflösung 800x600 = Pixel, keine Kommunikation untereinander → maximale Arithmetische Dichte

Marcus Schaber 6 /33 Programmierung Typische Aufgaben GPGPU ● GPGPU: Z.B. Gleichungssystem lösen Bearbeiten einer Zeile kann parallel ausgeführt werden, dann ist Schreibzugriff notwendig ● Allgemein Gitter-Methoden (aus der Numerik) Repräsentation des Gitters durch Textur ● Nutzung von Texturen generell praktisch Lesen/Schreiben in Textur wird von Grafikkarte unterstützt. Das Ausgabeziel des Renderers kann auch eine Textur sein.

Marcus Schaber 7 /33 Die Grafikpipeline ● Schwierig passende Grafik zu finden „Unified Shader“ machen die Aufteilung der programmierbaren Stufen überflüssig

Marcus Schaber 8 /33 Die Grafikpipeline

Marcus Schaber 9 /33 Grafikpipeline Programmierbare Einheiten 3 Programmierbare Pipelinestufen: ● Vertex processing Operiert auf Vertizes im Stream ● Primitive processing Erstellt für jedes eingehende Primitiv weitere neue ● Fragment processing Operiert auf Fragmenten aus dem Rasterizer

Marcus Schaber 10 /33 Grafikpipeline Programmierbare Einheiten Für die Programmierung ist diese Sichtweise nützlich

Marcus Schaber 11 /33 Programmiersprachen Übersicht ● High-Level für Grafik: CG (NIVIDIA), HLSL (DirectX), GLSL (OpenGL), RenderMan (Pixar) ● High-Level für GPGPU: CUDA (NVIDIA), Brook

Marcus Schaber 12 /33 Programmiersprachen Entwicklung

Marcus Schaber 13 /33 Programmiersprachen Datentypen ● Datentypen Skalare, Vektoren, Matrizen und arrays. Meist float, int, bool. Sampler für Texturen. Erstellung eigener Typen möglich. („struct“) float4 vec = {0,0,0,0}; float4x4 matrix; Sampler2D texSampler; struct VS_in { float4 Pos : POSITION; float4 normal : NORMAL; float4 texCoord : TEXCOORD0; }

Marcus Schaber 14 /33 Programmiersprachen Funktionen und Kontrollstrukturen // eine Funktion im GPU Programm float4 calcColor(float3 normal, float3 direction, float4 color) { float4 res = dot(direction, normal) * color; return res; } float3 directions[numLights];// werden vor Ausführung... float4 colors[numLights];//...des shaders gesetzt // fragment shader float4 PS { float4 color = {0,0,0,0}; for (int i = 0; i<numLights; i++) { color += calcColor(normal, directions[i], colors[i]); } return color; }

Marcus Schaber 15 /33 Programmiersprachen Einbindung in Hochsprachen ● Spracherweiterung: Erweiterung einer vorhandenen Sprache, wie C. Spezieller Compiler notwendig. ● Eigenständige Sprache: Kompilieren unabhängig möglich. Aufruf durch CPU-Programm. Einbindung meist in der Form (vereinfacht): Programm kompilieren Programm laden Programm verwenden

Marcus Schaber 16 /33 Programmiersprachen Brook ● Erweiterung von C ● Stream und Kernel als Sprachelemente ● Sprachunterstützung für Reduktionen mit Schlüsselwort „reduce“ ● Restriktionen bei Standard C. Bestimmte Schlüsselwörter, Bibliotheksaufrufe eingeschränkt, Pointer eingeschränkt, keine Rekursion

Marcus Schaber 17 /33 Programmiersprachen Brook Beispiel ● Stream: float a<> [3] [2];// stream aus 3x2 float arrays float b ;// legt Anzahl der Elemente im stream fest ● Kernel: void kernel foo (float a<>,out float b<>,float p) { b = a + p; } // a ist input-stream, b output-stream, p konstanter Parameter. Der Kernel wird für jedes Element im Stream ausgeführt. Kernelaufruf wie bei einer normalen C Funktion.

Marcus Schaber 18 /33 Programmiersprachen Brook Beispiel ● Reduktion: Summenbildung float a<> [3] [2]; void kernel sum (float a<>,reduce float result) { result += a; } ● Restriktionen beim Kernel Keine Pointer und Adressoperatoren keine Funktionspointer Keine Bibliotheksaufrufe (malloc, printf,...) Keine Zugriffe auf globalen Speicher

Marcus Schaber 19 /33 Programmiersprachen CG ● „C for Graphics“ ● Eigenständige Sprache ● Vertex, Fragment und „Geometrie“ Programme ● Syntax sehr ähnlich wie C ● Unabhängig von Graphik-API ● Compiler erstellt shader für DirectX oder OpenGL

Marcus Schaber 20 /33 Programmiersprachen CG Beispiel ● Einbindung: CGprogram program = cgCreateProgramFromFile( context, CG_SOURCE, filename, profile, "main", NULL); cgGLLoadProgram(program); cgGLBindProgram(myVertexProgram); cgGLEnableProfile(CGProfile profile); //Programm wird jetzt beim Rendern benutzt cgGLDisableProfile(CGProfile profile);

Marcus Schaber 21 /33 Programmiersprachen CUDA ● „Compute Unified Device Architecture“ ● Erweiterung von C++ ● Nutzbar ab NVIDIA Grafikkarten der GeForce 8 Serie und Quadro FX 5600 ● Für Wissenschaftliche Berechnungen gedacht

Marcus Schaber 22 /33 Programmiersprachen CUDA ● Grafikkarte kann allgemeiner genutzt werden ● Speicherzugriff: cudaMalloc( (void **)&host_data, DATA_SZ ) cudaMemcpy(device_data, host_data, DATA_SZ, cudaMemcpyHostToDevice ● Syntax für parallele Programmierung vorhanden ● Kernelaufruf: scalarProdGPU >>(d_C, d_A, d_B, VECTOR_N, ELEMENT_N);

Marcus Schaber 23 /33 Programmiersprachen CUDA

Marcus Schaber 24 /33 Programmiersprachen GLSL ● „OpenGL Shading Language“ ● Eigenständige Sprache ● Für Vertex und Fragment Programme ● Teil des OpenGL Standards

Marcus Schaber 25 /33 Programmiersprachen HLSL ● „High Level Shader Language“ ● Eigenständige Sprache ● Teil von DirectX ● Vertex, Fragment und „Geometrie“ Programme ● Syntax sehr ähnlich wie C

Marcus Schaber 26 /33 Programmiersprachen HLSL Effect-System Eine gemeinsame Umgebung für Shader, Variablen, Konstanten, Funktionen und Datentypen. Einstellungen des Renderes können in techniques beschrieben werden. technique10 Render { pass P0 { SetVertexShader( CompileShader( vs_4_0, VS() ) ); SetGeometryShader( CompileShader( gs_4_0, GS() ) ); SetPixelShader( CompileShader( ps_4_0, PS() ) ); SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); SetDepthStencilState( EnableDepth, 0 ); } }

Marcus Schaber 27 /33 Shader ● Standard wird durch DirectX vorgegeben ATI und NVIDIA arbeiten mit Microsoft zusammen. Mit jeder neuen Shader-Version werden neue Anforderungen an die Hardware gestellt.

Marcus Schaber 28 /33 Shader Shader Standards

Marcus Schaber 29 /33 Shader Vertex shader Beispiel // Eingabe Vetex-Stream struct VS_INPUT { float3 Pos : POSITION; float3 Norm : NORMAL; float2 Tex : TEXCOORD0; }; // Vertex-shader PS_INPUT VS( VS_INPUT input ) { PS_INPUT output = (PS_INPUT)0; output.Pos = mul( float4(input.Pos,1), World ); // Objekt-Koordinaten zu Welt-Koodrinaten // Vertizes verschieben output.Pos.x += sin( output.Pos.y*0.1f + Time ) * Waviness; output.Pos = mul( output.Pos, View );// Kameraperspektive output.Pos = mul( output.Pos, Projection );// Projektion auf Ebene output.Norm = mul( input.Norm, World );// Vertex-Normale zu Weltkoordinaten output.Tex = input.Tex;// Texturkoordinaten durchreichen return output; }

Marcus Schaber 30 /33 Shader Pixel shader Beispiel struct PS_INPUT { float4 Pos : SV_POSITION; float3 Norm : TEXCOORD0; float2 Tex : TEXCOORD1; float3 ViewR : TEXCOORD2; }; float4 PS( PS_INPUT input) : SV_Target { float fLighting = saturate( dot( input.Norm, vLightDir ) ); // environment map Texturwert lesen float4 cReflect = g_txEnvMap.Sample( samLinearClamp, input.ViewR ); // Texturwert lesen float4 cDiffuse = g_txDiffuse.Sample( samLinear, input.Tex ) * fLighting; // beide Texturwerte addieren float4 cTotal = cDiffuse + cReflect; return cTotal; }

Marcus Schaber 31 /33 Shader Geometrie shader Beispiel float Explode; // wird vom Hauptprogramm gegeben // Eingabestream in den Geometrie-shader struct GSPS_INPUT { float4 Pos : SV_POSITION; float3 Norm : TEXCOORD0; float2 Tex : TEXCOORD1; }; // Geometrie-shader void GS( triangle GSPS_INPUT input[3], inout TriangleStream TriStream ) { GSPS_INPUT output; for( int i=0; i<3; i++ ) { // Werte für neues Vertex festlegen output.Pos = input[i].Pos + float4(Explode, 0.0, 0.0, 0.0) * 10; output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Norm = input[i].Norm; output.Tex = input[i].Tex; TriStream.Append( output ); // neues Vertex in den Stream einfügen } }

Marcus Schaber 32 /33 Abschluss Fragen?

Marcus Schaber 33 /33 Quellen ● Artikel von Julian ● Wikipedia (Artikel GPGPU) ● GPU Gems 2 ● Microsoft DirectX SDK ● Brook Spec v0.2; Ian Buck; October 31, 2003 ● NVIDIA CUDA SDK Samples