Grundlagen von CUDA, Sprachtypische Elemente

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

Compute Unified Device Architecture CUDA

Masterpraktikum Scientific Computing

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

Masterpraktikum Scientific Computing

GPGPU-Programmierung

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

GPGPU-Programmierung

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

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

Yilmaz, Tolga MatNr: Mesaud, Elias MatNr:

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

Programmierbeispiele und Implementierung. Name: Michel Steuwer

Eine kurze Geschichte der Grafikkarten

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

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

Programmierung von Graphikkarten

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

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

Parallele Programmierung mit GPUs

Ferienakademie Erik Muttersbach

Compute Unified Device Architecture (CUDA)

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

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

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

Parallelisierung der Matrixmultiplikation

Cuda Speicherhierarchie

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

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

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

Rechnerarchitektur (RA)

Architektur und Programmierung von Grafik- und Koprozessoren

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

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

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

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

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

Der Goopax Compiler GPU-Programmierung in C++ ZKI AK-Supercomputing, Münster, , Ingo Josopait

GPU-Programmierung: OpenCL

GPU Architektur CUDA - OpenCL

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

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

Parallelisierung auf CUDA

Globale Variablen Diverses. Globale Variablen. Globale Variablen

Software Entwicklung 1

Parallelisierung mit Hilfe grafischer Prozessoren 318

Intels Tick-Tock-Prinzip

1 Einleitung. 2 Parallelisierbarkeit von. Architektur

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

PGI Accelerator Model

CUDA Workshop. Ausblick. Daniel Tenbrinck

einlesen n > 0? Ausgabe Negative Zahl

Übersicht. Speichertypen. Speicherverwaltung und -nutzung. Programmieren in C

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 E-Uebung3.fm

1 Fehler in Bibliotheksfunktionen. 1 Überblick. 2 Ziele der Aufgabe. Besprechung der 1. Aufgabe

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

Vorlesung Programmieren

Informatik II SS Inhalt. Objektlebensdauer (2/3) Objektlebensdauer (1/3)

Projektseminar Parallele Programmierung

GPU-BESCHLEUNIGTE PACKUNGSOPTIMIERUNG. André Müller, Johannes J. Schneider, Elmar Schömer

Automatische OpenCL-Code-Analyse zur Bestimmung von Speicherzugriffsmustern

Typ : void* aktuelle Parameter Pointer von beliebigem Typ

Speicherklassen (1) Lokale Variablen

Rheinisch-Westfälische Technische Hochschule Aachen. Seminararbeit

Multi-Core Architectures and Programming. Bilateral Grid Filter

Parallelisierungspotentiale mit CUDA-Streams 387


GPGPU Architectures - Compiler Techniques and Applications SS 2012

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Digital Image Interpolation with CUDA

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

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

GPGPU-Architekturen CUDA CUDA Beispiel OpenCL OpenCL Beispiel. CUDA & OpenCL. Ralf Seidler. Friedrich-Alexander-Universität Erlangen-Nürnberg

Betriebssysteme. Agenda. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

2.6 Graphikprozessoren

Betriebssysteme. Tafelübung 4. Speicherverwaltung. Olaf Spinczyk.

Zum Aufwärmen nocheinmal grundlegende Tatsachen zum Rechnen mit reelen Zahlen auf dem Computer. Das Rechnen mit Gleitkommazahlen wird durch den IEEE

2.6 Graphikprozessoren

1 wsort - Datenstrukturen (1. Möglichkeit)

GPGPU mit NVIDIA CUDA

Grundlagen der OO- Programmierung in C#

Lösung der zweidimensionalen Wirbeltransportgleichung auf NVIDIA Grafikkarten - Bachelorarbeit -

2. Programmierung in C

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen

Untersuchungen zur Abstraktion der GPU-Programmierung in Java am Beispiel Fluid-Simulation

Kontrollfragen Mikrocontroller Programmiersprache C H1203 Felix Rohrer

Physikalische Berechnungen mit General Purpose Graphics Processing Units (GPGPUs)

Parallelisierung mit Hilfe grafischer Prozessoren 323

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

Betriebssysteme Teil 3: Laufzeitsystem für Programme

C/C++-Programmierung

Enblend - Portierung auf die GPU

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

Objekterkennung mit künstlichen neuronalen Netzen

Transkript:

Grundlagen von CUDA, Sprachtypische Elemente Stefan Maskanitz 03.07.2009 CUDA Grundlagen 1

Übersicht 1. Einleitung 2. Spracheigenschaften a. s, Blocks und Grids b. Speicherorganistion c. Fehlerbehandlung d. Sonstiges 3. Vergleich: CPU/GPU Code 03.07.2009 CUDA Grundlagen 2

EINLEITUNG 03.07.2009 CUDA Grundlagen 3

Voraussetzungen Es wird mindestens eine CUDA fähige Nvidia Grafikkarte benötigt. Dies sind alle Nvidia Modelle ab der G80 Reihe. Beispiele: Nvidia Geforce 8800 GTX Nvidia Geforce 9600 GT Nvidia Geforce 260 GTX 03.07.2009 CUDA Grundlagen - Einleitung 4

CUDA aktuell Zwei Wege, Code zu schreiben C für CUDA CUDA Driver API 03.07.2009 CUDA Grundlagen - Einleitung 5

CUDA zukünftig Mehrere Sprachen Anwendung C OpenCL C++ Fortran CUDA 03.07.2009 CUDA Grundlagen - Einleitung 6

C für CUDA Erweitert die Sprache C/C++ um einfache Sprachelemente, mit denen man Code für die Grafikkarte entwickeln kann Compiler: NVCC (gibt es mit dem SDK) Ermöglicht schnellen Einstieg 03.07.2009 CUDA Grundlagen - Einleitung 7

Trennung von Host und Device C Code wird auf dem Host (CPU) ausgeführt. CUDA Code wird auf einem physikalisch vom Host getrennten Device (GPU) ausgeführt. Host und Device verwalten ihren eigenen Speicher. Host muss die Device-Speicherverwaltung übernehmen Hierzu gehört Allokation, Deallokation und das Kopieren von Daten von und zum Device. 03.07.2009 CUDA Grundlagen - Trennung Host/Device 8

CUDA Kernel Eine CUDA Funktion wird Kernel genannt. Ein Kernel muss so geschrieben sein, dass er von N verschiedenen s in beliebiger Reihenfolge ausgeführt werden kann. (SIMT) Dies ermöglicht eine einfache Skalierbarkeit Neuere GPU Modelle besitzen mehr Recheneinheiten, die den selben Code ausführen. 03.07.2009 CUDA Grundlagen - Einleitung 9

s, Blocks und Grids SPRACHEIGENSCHAFTEN 03.07.2009 CUDA Grundlagen 10

s, Blocks und Grids CUDA Kernel werden von mehreren s ausgeführt. Grid Block Block 03.07.2009 CUDA Grundl. - s, Blocks und Grids 11

Konfiguration der Grids/Blocks Wird im Kernelaufruf festgelegt // Kernel definition global void VecAdd(float* A, float* B, float* C) { int main() { // Kernel invocation // <<<dimgrid, dimblock>>> VecAdd<<<1, N>>>(A, B, C); Max. 512 s pro Block o Technische Grenze: alle s eines Blocks sollen auf einem Prozessor ausgeführt werden Prozessorspeicher begrenzt 03.07.2009 CUDA Grundl. - s, Blocks und Grids 12

blockidx, blockdim, threadidx Kernel besitzen Variablen mit Informationen über den /Block, zu dem sie gehören // Kernel definition global void VecAdd(float* A, float* B, float* C) { int i = blockidx.x * blockdim.x + threadidx.x; C[i] = A[i] + B[i]; int main() { // Kernel invocation VecAdd<<<2, N/2>>>(A, B, C); 03.07.2009 CUDA Grundl. - s, Blocks und Grids 13

Beispiel für N = 4 Grid 0 Block 0 Block 1 0 (i=0) 1 (i=1) 0 (i=2) 1 (i=3) int i = blockidx.x * blockdim.x + threadidx.x; 03.07.2009 CUDA Grundl. - s, Blocks und Grids 14

Syncthreads() s in einem Block können ihre Speicherzugriffe verwalten Barriere, an der ein wartet, bis auch alle anderen s aus dem gleichen Block an ihr angekommen sind. global void VecAdd(float* A, float* B, float* C) { int i = blockidx.x * blockdim.x + threadidx.x; C[i] = A[i] + B[i]; syncthreads(); //... 03.07.2009 CUDA Grundl. - s, Blocks und Grids 15

Speicherorganisation SPRACHEIGENSCHAFTEN 03.07.2009 CUDA Grundlagen 16

Lokaler Speicher 0 Lokaler Speicher global void foo(float* A, float* B) { int counter = 0; //... 03.07.2009 CUDA Grundlagen - Speicherorganisation 17

Shared Speicher Block 0 0 1 shared Speicher global void foo(float* A, float* B) { //... shared float As[BLOCK_SIZE][BLOCK_SIZE]; //... Schnell (ähnlich Registerzugriff bei CPU Code) Größe begrenzt: 16 KB 03.07.2009 CUDA Grundlagen - Speicherorganisation 18

Globaler Speicher Grid 0 0 1 0 1 Grid 1 0 1 0 1 globaler Speicher global void VecAdd(float* A, float* B, float* C) { //... int main() { //... cudamalloc((void **) &A_d, size); cudamemcpy(a_d,a_h,size,cudamemcpyhosttodevice); VecAdd<<<2, N/2>>>(A_d, B_d, C_d); Persistent über alle Kernel Aufrufe einer Anwendung 03.07.2009 CUDA Grundlagen - Speicherorganisation 19

Fehlerbehandlung SPRACHEIGENSCHAFTEN 03.07.2009 CUDA Grundlagen 20

cudagetlasterror() Ein Kernel gibt direkt keine Fehlermeldung aus. Man muss diese deshalb nach dem Aufruf mit cudagetlasterror() auslesen. int main() { //... VecAdd<<<2, N/2>>>(A_d, B_d, C_d); cudasynchronize(); printf("%s\n",cudageterrorstring(cudagetlasterror())); 03.07.2009 CUDA Grundlagen - Fehlerbehandlung 21

Device Emulation CUDA Code wird auf dem Host (CPU) ausgeführt Debugger des Hosts kann verwendet werden (z.b. für breakpoints, ) Device Code kann um Hostfunktionen ergänzt werden (z.b. printf, ) 03.07.2009 CUDA Grundlagen - Fehlerbehandlung 22

Sonstiges SPRACHEIGENSCHAFTEN 03.07.2009 CUDA Grundlagen 23

Device Funktion Kann zum Wiederverwenden von Code benutzt werden. Keine Rekursion möglich device int addiere(int a, int b) { return a+b; global void foo(float* A, float* B, float* C) { int a = 3; int b = 4; int c = addiere(a, b); // 7 03.07.2009 CUDA Grundlagen - Sonstiges 24

cudasynchronize() CUDA Kernel werden asynchron ausgeführt. Um auf Ergebnisse von Kernel Funktionen zu warten, kann man cudasynchronize() nutzen int main() { //... VecAdd<<<2, N/2>>>(A_d, B_d, C_d); cudasynchronize(); 03.07.2009 CUDA Grundlagen - Sonstiges 25

VERGLEICH: CPU/GPU CODE 03.07.2009 CUDA Grundlagen 26

Quadrieren // CPU Code int main() { int i = 0; float *zahlen_host; const int anz = 10; // Speicher reservieren zahlen_host = (float *)malloc( anz*sizeof(float) ); // Zahlen quadrieren for ( i=0; i<anz; i++ ) zahlen_host[i] = (float)i * (float)i; // GPU Code global void quadrieren(float *zahlen) { int idx = blockidx.x * blockdim.x + threadidx.x; // Zahl quadrieren zahlen[idx] = zahlen[idx] * zahlen[idx]; int main() { int i = 0; float *zahlen_host, *zahlen_device; const int anz = 10; // Speicher auf dem Host reservieren zahlen_host = (float *)malloc( anz*sizeof(float) ); // Zahlen im Host-Speicher ablegen for ( i=0; i<anz; i++ ) zahlen_host[i] = (float)i; // Speicher auf dem Device reservieren cudamalloc( (void **) &zahlen_device, anz*sizeof(float) ); // Kopieren der Zahlen zum Device cudamemcpy( zahlen_device, zahlen_host, anz*sizeof(float), cudamemcpyhosttodevice ); // Speicher freigeben free( zahlen_host ); // Quadrieren der Zahlen auf dem Device quadrieren<<< 2, 5 >>> ( zahlen_device ); // Kopieren der Zahlen zum Host cudamemcpy( zahlen_host, zahlen_device, anz*sizeof(float), cudamemcpydevicetohost ); // Speicher freigeben free( zahlen_host ); cudafree( zahlen_device ); 03.07.2009 CUDA Grundlagen - CPU/GPU Code 27