Computergrafik Universität Osnabrück, Henning Wenke,

Ähnliche Dokumente
Computergrafik Universität Osnabrück, Henning Wenke,

OpenCL. Programmiersprachen im Multicore-Zeitalter. Tim Wiersdörfer

Computergrafik SS 2012 Probeklausur Universität Osnabrück Henning Wenke, M. Sc. Sascha Kolodzey, B. Sc., Nico Marniok, B. Sc.

Parallele Algorithmen mit OpenCL. Universität Osnabrück, Henning Wenke,

Parallele Algorithmen mit OpenCL. Universität Osnabrück, Henning Wenke,

GPGPU-Programmierung

OpenCL. OpenCL. Boris Totev, Cornelius Knap

GPU-Programmierung: OpenCL

GPGPU-Programmierung

Rheinisch-Westfälische Technische Hochschule Aachen. Seminararbeit

Physikalische Berechnungen mit General Purpose Graphics Processing Units (GPGPUs)

CUDA. Moritz Wild, Jan-Hugo Lupp. Seminar Multi-Core Architectures and Programming. Friedrich-Alexander-Universität Erlangen-Nürnberg

Parallele Algorithmen mit OpenCL. Universität Osnabrück, Henning Wenke,

Computergrafik Universität Osnabrück, Henning Wenke,

Computer Graphics Shader

Wiederholung. Vorlesung GPU Programmierung Thorsten Grosch

Computergrafik SS 2010 Henning Wenke. Kapitel 21: OpenGL 3.1 (Fortsetzung)

OpenCL Implementierung von OpenCV Funktionen

Computergrafik Universität Osnabrück, Henning Wenke,

OpenCL. Multi-Core Architectures and Programming (Seminar) Apelt, Nicolas / Zöllner, Christian

Parallele Algorithmen mit OpenCL. Universität Osnabrück, Henning Wenke,

Einführung. GPU-Versuch. Andreas Schäfer Friedrich-Alexander-Universität Erlangen-Nürnberg

Compute Unified Device Architecture CUDA

GPGPU Basiskonzepte. von Marc Kirchhoff GPGPU Basiskonzepte 1

OpenCL. Seminar Programmiersprachen im Multicore-Zeitalter Universität Siegen Tim Wiersdörfer

Numerik und Rechnen. Martin Heide & Dominik Holler. 12. Juni 2006

Interaktive Globale Beleuchtung nach dem Antiradiance-Verfahren mittels der Open Computing Language (OpenCL)

Stream Processing und High- Level GPGPU Sprachen

General Purpose Computation on GPUs

> High-Level Programmierung heterogener paralleler Systeme

PRIP-Preis. Effizientes Object Tracking durch Programmierung von Mehrkernprozessoren und Grafikkarten

Yilmaz, Tolga MatNr: Mesaud, Elias MatNr:

3D Programmierpraktikum: OpenGL Shading Language (GLSL)

Computergrafik Universität Osnabrück, Henning Wenke,

GPU Architektur CUDA - OpenCL

RST-Labor WS06/07 GPGPU. General Purpose Computation On Graphics Processing Units. (Grafikkarten-Programmierung) Von: Marc Blunck

Grafikkarten-Architektur

Hochleistungsrechnen auf dem PC

GPGPU-Programming. Constantin Timm Informatik 12 TU Dortmund 2012/04/09. technische universität dortmund. fakultät für informatik informatik 12

Eine Einführung Computergrafik SS14 Timo Bourdon

IMPROVING PROGRAMMABILITY AND PERFORMANCE PORTABILITY ON MANY-CORE PROCESSORS

Untersuchung und Vorstellung moderner Grafikchiparchitekturen

2 Rechnerarchitekturen

Praxiseinheit: Realisierung einer hardwarebeschleunigten Disparitätenberechnung zur automatischen Auswertung von Stereobildern

LEISTUNGSVERGLEICH VON FPGA, GPU UND CPU FÜR ALGORITHMEN ZUR BILDBEARBEITUNG PROSEMINAR INF-B-610

Paralleler Cuckoo-Filter. Seminar: Implementierungstechniken für Hauptspeicherdatenbanksysteme Jeremias Neth München, 21.

Computergrafik Universität Osnabrück, Henning Wenke,

GPGPU-Architekturen CUDA Programmiermodell Beispielprogramm. Einführung CUDA. Ralf Seidler. Friedrich-Alexander-Universität Erlangen-Nürnberg

Architektur moderner GPUs. W. Sczygiol - M. Lötsch

GPGPU WITH OPENCL. Praktikum Parallele Rechnerarchitekturen, 2015w Franz Richter-Gottfried

Gliederung. Was ist CUDA? CPU GPU/GPGPU CUDA Anwendungsbereiche Wirtschaftlichkeit Beispielvideo

Spieleprogrammierung mit DirectX und C++

Software Engineering für moderne parallele Plattformen 9. GPGPUs: Grafikkarten als Parallelrechner

Masterpraktikum Scientific Computing

CUDA Workshop. Ausblick. Daniel Tenbrinck

Diplomarbeit. Neue Möglichkeiten durch programmierbare Shader. Unter der Leitung von: Prof. Dr.-Ing. Detlef Krömker

Programmierpraktikum 3D Computer Grafik

Computergrafik SS 2010 Henning Wenke. Kapitel 21: OpenGL 3.1

Raytracing in GA mittels OpenACC. Michael Burger, M.Sc. FG Scientific Computing TU Darmstadt

Eine kurze Geschichte der Grafikkarten

Automatische OpenCL-Code-Analyse zur Bestimmung von Speicherzugriffsmustern

Masterpraktikum Scientific Computing

Computergrafik Universität Osnabrück, Henning Wenke,

Informatik-Seminar. Auftakt. Informatik. Grundlagen

Computergrafik Universität Osnabrück, Henning Wenke,

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

OpenCL (Cell B. E., PS3) Multicore Architectures and Programming

Proseminar. GPU-Computing Cuda vs. OpenCL. SS 2013 Alexander Stepanov

Entwurf und Programmierung einer Rendering Engine

Softwareprojekt Spieleentwicklung

Kapitel 1 Parallele Modelle Wie rechnet man parallel?

Informatik II Prüfungsvorbereitungskurs

GPU Programmierung 6. Juli 2004 M. Christen, T. Egartner, P. Zanoni

Grundlagen von CUDA, Sprachtypische Elemente

Shader. Computer Graphics: Shader

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Motivation (GP)GPU CUDA Zusammenfassung. CUDA und Python. Christian Wilms. Integriertes Seminar Projekt Bildverarbeitung

Programmierbeispiele und Implementierung. Name: Michel Steuwer

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Cilk Sprache für Parallelprogrammierung. IPD Snelting, Lehrstuhl für Programmierparadigmen

CPU, GPU und FPGA. CPU, GPU und FPGA Maximilian Bandle, Bianca Forkel 21. November 2017

Einführung in die Programmiersprache C

Visuelle Kryptographie. Anwendung von Zufallszahlen

Prozessor- und Rechnerarchitekturen (Master)

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Einstieg in die Informatik mit Java

Implementieren von Klassen

Einführung Pointer. C-Kurs 2013, 2. Vorlesung. Nico Andy

Implementierung zweier Algorithmen mittels OpenCL auf Grafikkarten

Softwaretechnik 1 Übung 5

Vorlesung Programmieren

Ursprünge. Die Syntax von Java. Das Wichtigste in Kürze. Konsequenzen. Weiteres Vorgehen. Rund um Java

Thomas Sillmann. Swift im Detail HANSER

Wie groß ist die Page Table?

Thema: Hardware-Shader

GL ShadingLanguage(GLSL)

Multi- und Many-Core

Konzepte und Methoden der Systemsoftware. Aufgabe 1: Polling vs Interrupts. SoSe bis P

Praxis der Programmierung

Transkript:

Computergrafik Universität Osnabrück, Henning Wenke, 2012-06-25

Kapitel XV: Parallele Algorithmen mit OpenCL

15.1 Parallele Programmierung Quellen: V.a. Wikipedia. Leistungsdaten unter Vorbehalt. Bitte nicht zitieren.

Motivation Gegeben: Array von 10 7 floats Zufallszahlen Berechne für jedes Element tmp: for (int k = 0; k < 1000; k++) tmp=(tmp*(tmp+k)*(tmp*k*k)*(tmp*k*k*k)*tmp Miss Zeit mit / (tmp+10)+tmp*k*k*k*k*k)/1000.0f; Java, Intel Core i7 860, seriell:125 sec OpenCL mit Intel Core i7 860: 21 sec OpenCL mit Nvidia GTX 470: 0.4 sec 4

CPUs 4000 Takt [MHz] Jahr Takt [MHz] TDP [W] Kerne Intel 486 DX2 40 1992 66 6 1 Intel P2 400 1999 400 24 1 Intel P4 3800 2004 3800 115 1 Intel Core 2 E6600 2006 2400 65 2 Intel Core i7 2600 2011 3400 958* 3500 3000 2500 2000 1500 1000 500 0 1990 1995 2000 2005 2010 2015 140 TDP [W] P = ACV 2 F + VI leak, mit: F Frequenz, V Spannung 120 100 80 60 40 20 0 1990 1995 2000 2005 2010 2015 5

GPUs Jahr Cores FLOPS Band Tdp Flops/Core Flops/Watt GTX 8800 Ultra 2007-05 128 576 104 175 4,5 3,29142857 GTX 280 2008-06 240 933 141 236 3,8875 3,95338983 GTX 480 2010-03 480 1345 177 250 2,80208333 5,38 GTX 680 2012-03 1536 3090 192 195 2,01171875 15,8461538 18 16 14 12 Flops/Core Flops/Watt 10 8 6 4 2 0 2007 2008 2009 2010 2011 2012 2013 6

Arten der Parallelität in OpenCL Task Parallelität (wenn Tasks jeweils seriell) a = {1, 2, 3, 4} b = {5, 6, 7, 8} task1(i){return i*i;} task2(i){return i;} a = {1, 4, 9, 16} b = {5, 6, 7, 8} Datenparallelität (Single Instruction Multiple Data) a = {1, 2, 3, 4, 5, 6, 7, 8} task(i){return i*i;} a = {1, 4, 9, 16, 25, 36, 49, 64} Datenparallelität (Single Program Multiple Data) a = {1, 2, 3, 4, 5, 6, 7, 8} task(i){ if(arrayindex < 4) return i*i; else return i; } a = {1, 4, 9, 16, 5, 6, 7, 8} 7

15.2 Vorschau: Prozedurale Modellierung /Partikelsysteme 8

Partikel Beispiel für Partikel: Vertex mit: Position Ausdehnung Aktuelle Geschwindigkeit Zentrale Eigenschaft Partikel? Keine Topologie Simulation v.s. Rendering Partikel kann z.b. als Kugelmesh gerendert werden Instancing 9

Kollision Inwiefern Berechnungen anders als bisher? Berechnungen für Partikel abhängig Nicht im Vertex Shader lösbar t 0 t 1 t 2 10

Update y Model f(t = t 1 ) f(t = t 0 ) y World f(t = t 2 ) x Model Bisher: Vorbestimmte, zeitabhängige Funktion Jetzt: Berechne basierend auf letztem Zeitschritt neue Position Mit OpenGL sehr umständlich (Transform Feedback) x World t 0 t 1 y World t 2 x World 11

15.3 OpenCL

Allgemeines Open Compute Language: API für einheitliche parallele Programmierung heterogener Systeme GPUs, CPUs, APUs, FPGAs Oder Kombinationen daraus Hinweis: Optimierung typischerweise nicht einheitlich Initiiert 2008-12 durch Apple, betreut d. Khronos Group Erste Implementation: 2009-08 (Mac OS X 10.6) Plattform, Betriebssystem & Sprachunabhängig OpenCL C Zugehörige, an C (ISO C99) angelehnte, Sprache mit Erweiterungen für parallele Algorithmen Kein dynamisches Allokieren von Speicher Keine Rekursion Damit geschriebenes Programm heißt Kernel Gibt nur einen Typ Arbeitet direkt mit OpenGL zusammen 13

OpenGL vs. OpenCL Ebenfalls Host Device(s) Architektur Etwa: Host: Applikation, Devices: 2 Grafikkarten + 1 CPU OpenCL C GLSL Kernel Shader Einer für alles Mächtiger als alle Shader zusammen Keine feste Pipeline, Kernel werden direkt aufgerufen Ebenfalls asynchrone Befehlsausführung Keine State Machine Keine speziellen oder High Level Funktionen Keine Grafikfunktionen (Rastern, Culling, Blending, Framebuffer) Auch nicht: Invertierung großer Matrizen, o.ä. Ausnahme: Texturen. Sind aber nur Datenstrukturen 14

Literatur OpenCL Reference Pages: http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/ 15

15.3 OpenCL C Beispiele 16

Pseudo Vertex Shader v.s. Vertex Shader // Unser Pseudo VS zur Translation // beliebiger Geometrie for all(int v in(0,,vertexcnt-1) in parallel do{ vec4 posmc; vec4 poswc; mat4 trans; <Read_Vertex_Data(v)> posmc = readposmc(v); trans = readtrans(); <Do_Calculations(v)> poswc = trans * posmc; // Entsprechender echter // Vertex Shader #version 330 core in vec4 posmc; uniform mat4 trans; out vec4 poswc; void main(){ poswc = trans * posmc; } <Write_Data(v)> writeposwc(v, poswc); } 17

Vertex Shader v.s. Kernel // Entsprechender echter // Vertex Shader #version 330 core in vec4 posmc; uniform mat4 trans; out vec4 poswc; void main(){ poswc = trans * posmc; } // Methode: Vektor-Matrix-Produkt a * b float4 mul(float16 a,float4 b){ }; // Startpunkt eines Kernels vertexshader kernel void vertexshader( global float4* posmc, // Direkter Zugriff global float4* poswc, // auf globale global float16* trans){ // Daten int wiid = get_global_id(0); // Lies Daten dieses Work Items float4 posmc_tt = posmc[wiid]; // Do Calculations float4 poswc_tt = mul(trans[0], posmc_tt); } // Schreib Ergebnis in Global Memory poswc[wiid] = poswc_tt; 18

Update // Methode: Vektor-Matrix-Produkt float4 mul(float16 a,float4 b){ }; // Startpunkt eines Kernels vertexshader kernel void vertexshader( global float4* pos, global float16* trans){ int wiid = get_global_id(0); // Lies Daten dieses Work Items float4 pos_tt = pos[wiid]; // Do Calculations float4 pos_tt = mul(trans, pos_tt); } // Schreib Ergebnis in global Mem pos[wiid] = pos_tt; 19

Gather float4 mul(float16 a,float4 b){ }; // Startpunkt eines Kernels vertexshader kernel void vertexshader( global float4* posmc, global float4* poswc, const float16* trans){ int wiid = get_global_id(0); } // read Data of this Thread float4 posmc_tt = posmc[wiid]; if(wiid % 2 == 0) // Lies auch Daten eines anderen Vertex posmc_tt += posmc[wiid + 1] * 0.25; else posmc_tt += posmc[wiid - 1] * 0.25; // Do Calculations float4 poswc_tt = mul(trans, posmc_tt); // Schreib Ergebnis in global Mem poswc[wiid] = poswc_tt; 20

Gather / Update float4 mul(float16 a,float4 b){ }; kernel void vertexshader( global float4* pos, const float16* trans){ int wiid = get_global_id(0); // read Data of this Thread float4 pos_tt = pos[wiid]; } // Muss syncronisiert werden da pos[wiid - 1] und // pos[wiid + 1] bereits verarbeitet sein können if(wiid % 2 == 0) // Lies auch Daten eines anderen Vertex pos_tt += pos[wiid + 1] * 0.25; else pos_tt += pos[wiid - 1] * 0.25; // Do Calculations float4 pos_tt = mul(trans, pos_tt); // Schreib Ergebnis in global Mem pos[wiid] = pos_tt; 21

15.4 Speicher & Indizierung 22

OpenGL VS Speichermodell PE 1 PE 2 PE 3 PE n Private Memory 1 Private Memory 2 Private Memory 3 Private Memory n Global Memory: Buffer Objects, etc. Global Constant Memory: Texturen, Server / Device Host Memory FloatBuffer, etc. Client / Host PE: Processing Element. Führt je eine Instanz des VS aus Daten werden durch OpenGL geladen Expliziter Zugriff möglich 23

OpenCL Speichermodell PE 1 PE n PE 1 PE n Private Memory 1 Private Memory n Compute Unit 1 Private Mem. 1 Private Memory n Compute Unit M Local Memory 1 Local Memory M Global Memory: Buffer Objects, etc. Device Host Host Memory FloatBuffer, etc. PE: Processing Element. Führt je eine Instanz des Kernels aus Local Memory: User managed Cache, je einer CU zugeordnet PEs einer CU können Zugriffe auf Local / Global Memory synchronisieren 24

Indizierung: Wünsche Zugriff auf Global Memory: Global eindeutiger Index nötig Zugriff auf Local Memory: Lokal, also in einer CU, eindeutiger Index nötig Weiterer Index für CU und Indexzahlen hilfreich Private Memory 1 Local Memory 1 kernel void akernel( } global float4* a, local float4* b){... PE 1 PE n PE 1 PE n Compute Unit 1 Private Memory n Private Mem. 1 Local Memory M Compute Unit M Private Memory n Global Memory: CLMem Objects, etc. Device 25

1D Speichermodell gid = 0 gid = 1 gid = 2 gid = 3 gid = 4 gid = 5 lid = 0 lid = 1 lid = 2 lid = 0 lid = 1 lid = 2 groupid = 0 groupid = 1 gid = 6 gid = 7 gid = 8 gid = 9 gid = 10 gid = 11 lid = 0 lid = 1 lid = 2 lid = 0 lid = 1 lid = 2 groupid = 2 groupid = 3 get_num_groups(0); // Liefert Anzahl der Work Groups. Hier: 4 get_local_size(0); // Liefert Anzahl Work Items einer Work Group. Hier: 3 get_global_size(0); // Liefert Gesamtzahl der Work Items. Hier: 12 Work Group / Compute Unit Work Item / Processing Element gid : Globale Id eines Work Items: get_global_id(0); lid : Lokale Id eines Work Items: get_local_id(0); groupid Id einer Work Group: get_group_id(0); 26

15.5 Programmierung mit OpenCL C (Kurzfassung) 27

OpenCL C Basics I // Startpunkt eines Kernels des Namens akernel kernel void akernel( ){ } // Datentypen z.b. float, float2, float16, int8, uint2, // Initialisierung & Zugriff float8 val = (float8)(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0); val.x // Liefert 1.0 val.s0 // Liefert 1.0 val.s7310 // Liefert (8.0, 4.0, 2.0, 1.0) // Ab Komponente 10:.sa,.sb, etc. // Alle Operationen Komponentenweise float4 a =(float4)(8.0, 4.0, 2.0, 1.0); float4 b = (float4)(0.0, 0.0, 2.0, 1.0); float4 ab = a * b; // Liefert: (0.0, 0.0, 4.0, 1.0) 28

OpenCL C Basics II // Daten werden als Parameter des Kernels deklariert kernel void akernel( const int a, // Konstante global float4* b, // Pointer // Global les- & schreibbare Daten local float4* c // Pointer // Lokal in der Workgroup les- & schreibbar // Müssen erst durch Kernel geschrieben werden ) { // Typischer Zugriff auf globale Daten float4 myb = b[get_global_id(0)]; float4 myc; // Vermutlich keine gute Idee: // 1. c noch gar nicht geschrieben. // 2. Index nur sinnvoll, wenn es nur eine Work Group gibt. myc = c[get_global_id(0)]; } 29

OpenCL C Basics III kernel void akernel( const int a, global float4* b, local float4* c) { float4 myb = b[get_global_id(0)]; // Schreibe einen Wert in den lokalen Speicher an eine Position des lokalen // Speichers dieser Workgroup. Passiert in allen WGs, immer wieder die // gleichen Positionen aber anderer Speicher. c[get_local_id(0)] = myb; // Blockiert, bis alle WEs dieser WG ihre Zugriffe auf den lokalen Speicher // beendet haben barrier(clk_local_mem_fence); } // Jetzt können die in c geschriebenen Werte in allen Work Elements der WG, // etwa das Erste und das Letzte, gelesen werden: float4 firstc = c[0]; float4 lastc = c[get_local_size(0)-1]; 30

OpenCL C Basics IV // Blockiert, bis alle WEs dieser WG ihre Zugriffe auf // den globalen Speicher beendet haben barrier(clk_global_mem_fence); // Achtung: Keine globale Synchronisation. // Globaler Synchronisationspunkt erst nach vollständig // ausgeführtem Kernel möglich // Mathematische Build-In Funktionen auch vorhanden, z.b.: cos(), dot(), cross(), 31