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

Ähnliche Dokumente
GPGPU-Programmierung

GPGPU-Programmierung

Rechnerarchitektur (RA)

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

Grundlagen von CUDA, Sprachtypische Elemente

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

Compute Unified Device Architecture CUDA

Masterpraktikum Scientific Computing

Masterpraktikum Scientific Computing

GPU-Programmierung: OpenCL

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

Eine kurze Geschichte der Grafikkarten

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

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

Yilmaz, Tolga MatNr: Mesaud, Elias MatNr:

Rheinisch-Westfälische Technische Hochschule Aachen. Seminararbeit

OpenCL. OpenCL. Boris Totev, Cornelius Knap

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

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

Parallele Programmierung mit GPUs

Ferienakademie Erik Muttersbach

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

Programmierbeispiele und Implementierung. Name: Michel Steuwer

Physikalische Berechnungen mit General Purpose Graphics Processing Units (GPGPUs)

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

Stream Processing und High- Level GPGPU Sprachen

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

Computergrafik Universität Osnabrück, Henning Wenke,

FPGA Beschleuniger. Your Name. Armin Jeyrani Mamegani Your Organization (Line #2)

CUDA. Axel Jena, Jürgen Pröll. Multi-Core Architectures and Programming. Friedrich-Alexander-Universität Erlangen-Nürnberg Axel Jena, Jürgen Pröll 1

Gliederung. Problemstellung Motivation Multi-Agenten Simulation GPU Programmierung Stand der Technik Abgrenzung

Software Engineering für moderne, parallele Plattformen. 9. GPGPUs: Grafikkarten als Parallelrechner. Dr. Victor Pankratius

> High-Level Programmierung heterogener paralleler Systeme

Grafikkarten-Architektur

Multicore-Architekturen

GPGPU-Architekturen CUDA Programmiermodell Beispielprogramm Organiosatorisches. Tutorial CUDA. Ralf Seidler

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

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

Automatische OpenCL-Code-Analyse zur Bestimmung von Speicherzugriffsmustern

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

GPU Architektur CUDA - OpenCL

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

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

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

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

Parallel Computing in der industriellen Bildverarbeitung

Programmierung von Graphikkarten

OpenCL mit Aparapi. Seminararbeit. Studiengang: Scientific Programming. 1. Betreuer: Prof. Ulrich Stegelmann

GPGPU mit NVIDIA CUDA

PGI Accelerator Model

Architektur und Programmierung von Grafik- und Koprozessoren

CUDA Workshop. Ausblick. Daniel Tenbrinck

GPGPU Programming nvidia CUDA vs. AMD/ATI Stream Computing. Seminar HWS 08/09 by Erich Marth

MESIF- (links) vs. MESI-Protokoll (rechts)

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

GPUs. Arbeitsbereich Wissenschaftliches Rechnen Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg

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

CUDA. 7. Vorlesung GPU Programmierung. Danke an Hendrik Lensch

Compute Unified Device Architecture (CUDA)

General Purpose Computation on GPUs

OpenCL Implementierung von OpenCV Funktionen

Hochleistungsrechnen auf dem PC

Cuda Speicherhierarchie

Volumenrendering mit CUDA

GPU-Computing im Rahmen der Vorlesung Hochleistungsrechnen

Untersuchung und Vorstellung moderner Grafikchiparchitekturen

GPGPU Basiskonzepte. von Marc Kirchhoff GPGPU Basiskonzepte 1

Prozessor- und Rechnerarchitekturen (Master)

CUDA by Example. Paralleles Rechnen auf der Grafikkarte. Leipzig, Paul Jähne SethosII

Memory Models Frederik Zipp

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

Parallelisierung mit Hilfe grafischer Prozessoren 318

Enblend - Portierung auf die GPU

Seminarvortrag: Direktivenbasierte Programmierung von Beschleunigern mit OpenMP 4.5 und OpenACC 2.5 im Vergleich

CUDA. (Compute Unified Device Architecture) Thomas Trost. May 31 th 2016

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

Prinzipieller Aufbau der Architektur eines Multikern- Prozessors. Programmierung Standard-Mulitkern-Prozessoren mit OpenMP


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

GPU-Computing. Michael Vetter

DIGITALE SCHALTUNGEN II

Hardware-unabhängige Beschleunigung von Medizinischer Bildverarbeitung mit OpenCL

Games with Cellular Automata auf Parallelen Rechnerarchitekturen

C-to-CUDA-Compiler. Johannes Kölsch. October 29, 2012

2.6 Graphikprozessoren

Hardware-unabhängige Beschleunigung von Medizinischer Bildverarbeitung mit OpenCL

2.6 Graphikprozessoren

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

Parallelisierung mit Hilfe grafischer Prozessoren 323

Cell and Larrabee Microarchitecture

Spezialprozessoren zur Übernahme Grafik-spezifischer Aufgaben, vorrangig der Bildschirmausgabe

Mehrprozessorarchitekturen

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

Transkript:

12 GPGPU-Programming Constantin Timm Informatik 12 TU Dortmund 2012/04/09 Diese Folien enthalten Graphiken mit Nutzungseinschränkungen. Das Kopieren der Graphiken ist im Allgemeinen nicht erlaubt.

Motivation (1) General Purpose Computing on Graphics Processing Units (GPGPU) Einführung um CPU (bei Spielen) zu entlasten Physikalische Berechnungen Künstliche Intelligenz www.geforce.com & fr.wikipedia - 2 -

Motivation (2) GPUs haben eine große Anzahl von parallelen Rechenkernen Wie kann man diese effizient programmieren? Gut für datenparallele Programme void add_vector(int* in1, int *in2, int *out) { for ( int i = 0; i < N; ++i ) { out[i] = in1[i] + in2[i] ; Nvidia Best Practice Guide - 3 -

Motivation (3) Was sollte man bzgl. GPGPU-Applikationen beachten? Parallele Applikationen mit möglichst unabhängigen Operationen Kopier-Overhead für Daten GPU GPU CPU CPU - 4 -

Geschichte der GPGPU-Programmierung (1) Bis zirka 2003 2004 Benutzung von Shader-Sprachen zur Programmierung Vertex- und Fragmentshaderprogramme void main(void) { gl_fragcolor = vec4(0.0, 1.0, 0.0, 1.0); David Kirk/NVIDIA and Wen-mei W. Hwu, 2007-2009, University of Illinois - 5 -

Geschichte der GPGPU-Programmierung (2) Ab 2004 Einführung von Sprachen zum Streamprocessing, z.b. BrookGPU Von der Stanford University Nutzung von GPUs als Coprocessor / Beschleuniger Versteckt Komplexität kernel void foo (float a<>, float b<>, out float result<>) { result = a + b; float a<100>; float b<100>; float c<100>; foo(a,b,c); - 6 -

Geschichte der GPGPU-Programmierung (3) Ab 2004 BrookGPU Komplexer Kompilervorgang Plattform-unabhängig BrookGPU-Kompilervorgang brcc : S2S-Compiler brt : Runtime Stanford University Graphics Lab - 7 -

Geschichte der GPGPU-Programmierung (4) Ab 2007 Einführung von CUDA Compute Unified Device Architecture Framework für Streamprocessing auf Nvidia Grafikkarten Ursprünglich nur für Datenparallelität konzipiert Ab 2008 Einführung von OpenCL Allgemeines Framework für Streamprocessing auf Multi- und Manycore- Architekturen Für Daten- und Taskparallelität konzipiert Spezifikation durch Khronos: AMD, Apple, ARM, Creative, Google, Intel, TI, Samsung, Nvidia - 8 -

CUDA Adaptiert das Streamprocessing-Konzept Elementare Programmierkomponente => Kernel Keine Rekursion Parameteranzahl ist nicht variabel Unterscheidung von Host- und GPU-Code void add_vector(int* in1, int *in2, int *out) { for ( int i = 0; i < N; ++i ) { out[i] = in1[i] + in2[i] ; Vektoraddition in C global void add_vector (int* in1, int *in2, int *out) { int i = (blockidx.x*blockdim.x)+threadidx.x; out[i] = in1[i] + in2[i]; add_vector<<<n,1>>>( in1, in2, out ); Vektoraddition in Cuda - 9 -

CUDA Entwicklungsprozess Mehrstufig und kompliziert Programmierung von Code für einen Thread Spezifikation der Parallelität per Hand Viele statisch vorgegebene Größen - 10 -

CUDA Elemente des Frameworks Thread Instanz eines Kernels Block Gruppe von Threads Grid Gesamtheit aller Blocks Host Kernel 1 Device Grid 1 Block (0, 0) Block (0, 1) Block (1, 0) Block (1, 1) Grid 2 global void add_vector (int* in1, int *in2, int *out) { int i = (blockidx.x*blockdim.x)+threadidx.x; out[i] = in1[i] + in2[i]; Kernel 2 Block (1, 1) (0,0,1) (1,0,1) (2,0,1) (3,0,1) Thread (0,0,0) Thread (0,1,0) Thread (1,0,0) Thread (1,1,0) Thread (2,0,0) Thread (2,1,0) Thread (3,0,0) Thread (3,1,0) Nvidia - 11 -

CUDA Kompilierung CUDA-Programme werden in einem mehrstufigen Verfahren kompiliert GPU- und Host-Code getrennt kompiliert GPU-Binaries in Host-Code eingebettet Neuster Compiler von Nvidia basiert auf LLVM - 12 -

CUDA Abbildungsbeispiel Kernel benötigt folgende Ressourcen 5 Register pro Thread 1052 Bytes Shared Memory per Block Grid size: 64 Blocks Block size: 256 Threads Grafikkarte (1 Streaming-Multiprocessor) 8152 Register 16384 Bytes Scratchpad-Speicher Max 768 Threads, 8 Blocks und 24 Warps Auslastung der Grafikkarte 768 Threads, 3 Blocks, 4608 Bytes Shared Memory und 3840 Register - 13 -

CUDA - Speicherallokation cudamalloc() Allokiert globalen Speicher auf der Grafikkarte cudafree() Gibt allokierten Speicher auf der Grafikkarte frei Grid Block (0, 0) Shared Memory Block (1, 0) Shared Memory cudamemcpy() Kopiert in/aus/im globalen Speicher auf der Grafikkarte Registers Thread (0, 0) Registers Thread (1, 0) Registers Thread (0, 0) Registers Thread (1, 0) Host Global Memory Nvidia - 14 -

CUDA - Speichertransfers Kopieren in/aus/im globalen Speicher Vom Host zur Grafikkarte int *d_x; cudamalloc((void**) &d_x, sizeof(int)); int x=0; cudamemcpy(d_x, &x, sizeof(int), cudamemcpyhosttodevice); Von der Grafikkarte zum Host int *d_y; cudamalloc((void**) &d_y, sizeof(int)); int y=0; cudamemcpy(&y, d_y, sizeof(int), cudamemcpydevicetohost); Auf der Grafikkarte int *d_x,d_y; cudamalloc((void**) &d_x, sizeof(int)); cudamalloc((void**) &d_y, sizeof(int)); cudamemcpy(d_x, d_y, sizeof(int), cudamemcpydevicetodevice); - 15 -

CUDA Speicherzugriff Globaler/Shared Memory-Speicherzugriff Zugriff auf globalen/shared Speicher nicht synchronisiert Ausgang von Schreibe-/Leseoperationen auf gemeinsamen Speicher? Lösung: Atomare Operationen global void add_vector_gpu (int* out) { *out+=5; add_vector_gpu<<<1,5>>>(out); global void add_vector_gpu (int* out) { atomicadd(out,5); add_vector_gpu<<<1,5>>>(out); Ergebnis? => out = 5 Ergebnis? => out = 25-16 -

CUDA Thread Divergence (1) Ablauf der Threads Vorhersage der tatsächlichen Reihenfolge schwierig Kann von Programmierer erzwungen werden global void update(int* x, int* y) { int i = threadidx.x + blockdim.x * blockidx.x; if (i == 60){ sharedx = *x; sharedx = 1; syncthreads(); if (i == 100) *y = sharedx; update <<<2,512>>>(in,out); Ergebnis? => *out =? 1; - 17 -

CUDA Thread Divergence (2) Synchronisation über Blockgrenzen Problemlos, wenn Blocks auf gleichem SM allokiert Sonst Synchronisation problematisch global void update_1(int* update(int* x, int* x, int* y) y) { { int i = threadidx.x + blockdim.x * blockidx.x; if (i == 600) *x = 1; *x = 1; global syncthreads(); void update_2(int* x, int* y) { if int(i i == = threadidx.x 0) + blockdim.x * blockidx.x; if (i == *y 0) = *y *x; = *x; update_1 <<<2,512>>>(in,out); update_2 <<<2,512>>>(in,out); Ergebnis? => *out =?; 1; - 18 -

CUDA Inline Assembly PTX-Code kann direkt im Kernel benutzt werden Code meist effizienter PTX-Instruktionen keine Hardwarebefehle global void kern(int* x, int* y) { int i = threadidx.x + ; if (i == 0) *x += 1; syncthreads(); if (i == 1) *y = *x; global void kern(int* x, int* y) { int i = threadidx.x + blockdim.x * blockidx.x; if (i == 0) asm("ld.global.s32 %r9, [%0+0];" "add.s32 %r9, %r9, 1;" "st.global.s32 [%0+0], %r9;" : :"r"(x)); syncthreads(); if (i == 1) *y = *x; - 19 -

Open Compute Language - OpenCL http://www.khronos.org/developers/library/overview/opencl_overview.pdf - 20 -

OpenCL: Vergleich zu CUDA Unterschied zum CUDA-Ansatz Taskparallelität kann modelliert werden OpenCL-Programme werden online compiliert Unterstützung von heterogenen Systemen Befehle, kleinster Nenner Ausführung auf Nvidia-GPU Nur anderes Frontend + API Leider schlechterer Compiler Nvidia - 21 -

OpenCL für heterogene Systeme OpenCL auf verschiedensten Plattformen zu finden ZiiLabs Tablets Samsung SnuCore ZiiLabs & Samsung - 22 -

OpenCL vs. CUDA: Platform Model Compute Device CUDA: Nvidia Grafikkarte IBM CELL Board Compute Unit CUDA: Streaming Multiprozessor IBM CELL PPU Processing Element CUDA: Streaming Prozessor IBM CELL SPU AMD - 23 -

OpenCL vs. CUDA: Memory Model CUDA Global memory Constant memory Shared memory Register OpenCL Global memory Constant memory Local memory Private memory Nvidia & Patrick Cozzi, GPU Programming and Architecture, University of Pennsylvania - 24 -

OpenCL vs. CUDA: Execution/Program. Model CUDA Kernel Host program Thread Block Grid global void vecadd(float *a, float *b, float *c) { int i = blockidx.x* blockdim.x + threadidx.x; c[i] = a[i] + b[i]; OpenCL Kernel Host program Work item Work group NDRange (index space) kernel void vecadd( global const float *a, global const float *b, global float *c) { int i = get_global_id(0); c[i] = a[i] + b[i]; Nvidia & Patrick Cozzi, GPU Programming and Architecture, University of Pennsylvania - 25 -

OpenCL vs. CUDA: Task-Parallelität Einsortierung von OpenCL-Kernel in Command Queue Synchrone Ausführung Asynchrone Ausführung Kernel A Kernel B Kernel C Kernel D - 26 -

Zusammenfassung Grafikkarten können effizient zur Beschleunigung von parallelen Programmen eingesetzt werden NVIDIA setzt auf CUDA und OpenCL CUDA Programmierung ist zeitaufwendig OpenCL bietet Alternative zu CUDA Portablen Code Unterstützt Taskparallelität direkt - 27 -