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

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

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

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

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

Implementierung eines GPU-beschleunigten Kalman-Filters mittels OpenCL

Heterogeneous Computing

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

OpenCL Implementierung von OpenCV Funktionen

GPU-Programmierung: OpenCL

Computergrafik Universität Osnabrück, Henning Wenke,

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

Compute Unified Device Architecture CUDA

Computergrafik Universität Osnabrück, Henning Wenke,

Grundlagen von CUDA, Sprachtypische Elemente

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

Methoden und Wrapperklassen

6. Funktionen, Parameterübergabe

Einstieg in die Informatik mit Java

GPGPU-Programmierung

GPGPU-Programmierung

Grundlagen. Felix Döring, Felix Wittwer 24. April Python-Kurs

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

Praktikumsanleitung GPU-Computing. Manuel Hohmann

Themen der Übung. Methoden und Wrapperklassen. Vorteile von Methoden. Methoden. Grundlagen

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

Einstieg in die Informatik mit Java

Java Concurrency Utilities

Partikelsimulation einer Explosion mit Raytracing unter Beobachtung der Performance. Bachelorarbeit

1 Klassen und Objekte

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Felder. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Informatik II Übung 5

Einstieg in die Informatik mit Java

Grundlagen von Python

IUG DRESDEN ERSTELLUNG VON ROBUSTEN NATURAL SERVICES Software AG. All rights reserved. For internal use only

Masterpraktikum Scientific Computing

Cuda Speicherhierarchie

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

6 Speicherorganisation

Organisatorisches. Folien (u.a.) auf der Lva-Homepage Skriptum über MU Online

Java Referenzdatentypen genauer betrachtet

Realisierung eines Mehrgitterverfahrens in OpenCL

Repetitorium Informatik (Java)

Einstieg in die Informatik mit Java

Groovy 3 und das neue Meta Object Protocol in Beispielen

Objekte. Theorieteil. Inhaltsverzeichnis. Begriffe. Programmieren mit Java Modul 5. 1 Modulübersicht 3

Praxis der Programmierung

Programmieren in Java -Eingangstest-

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Modernisierung von Forms durch neues Look&Feel

Einführung in die Programmierung. (K-)II/Wb17

Softwareentwicklung II (IB) Blatt 2. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

2. Programmierung in C

6 Speicherorganisation

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

Einstieg in die Informatik mit Java

9. Ausnahmebehandlung

II.1.1. Erste Schritte - 1 -

Informatik II Übung 05. Benjamin Hepp 3 April 2017

Einführung in C# Teil 1. Matthias Nübling

Algorithmen und Datenstrukturen

Threading. Arthur Zaczek. Aug 2015

Programmierung und Angewandte Mathematik

C# - Einführung in die Programmiersprache Arrays, Enumeration und Collections. Leibniz Universität IT Services Anja Aue

Hello World! Eine Einführung in das Programmieren Das erste Programm

Einführung in die Programmiersprache C

Tag 8 Repetitorium Informatik (Java)

OOP. Tagesprogramm. Aspekte und Annotationen. Software-Entwurfsmuster. Factory-Method. Prototype

An Overview of the Signal Clock Calculus

Variablen. int Flugzeug. float. I write code Hund. String. long. Borchers: Programmierung für Alle (Java), WS 06/07 Kapitel

Einstieg in die Informatik mit Java

Organisatorisches. Folien (u.a.) gibt's auf der Lva-Homepage zum Download

1 Abstrakte Datentypen

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Felder - Arrays. Typ feldname[] = new Typ[<ganze Zahl >]; Beispiel: double vektor[] = new double[5]; auch eine Initialisierung ist möglich.

8. Referenzen und Zeiger

Einstieg in die Informatik mit Java

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

public class Test extends MiniJava { public static void main (String [] args) { write(args[0]+args[1]); } } // end of class Test

2. Programmierung in C

Einführung in die Informatik Tools

Klassen als Datenstrukturen

Computergrafik Universität Osnabrück, Henning Wenke,

Rheinisch-Westfälische Technische Hochschule Aachen. Seminararbeit

Grundlagen der Programmierung

Praktische Informatik 1

Masterpraktikum Scientific Computing

Java-Grundkurs für Wirtschaftsinformatiker

Zweck: sequentieller Zugriff auf Elemente eines Aggregats

Felder fester Länge (1)

Übungsblatt 1. Java Vorkurs (WS 2017)

Einführung: Verteilte Systeme - Remote Method Invocation -

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Softwareentwicklung I (IB) Blatt 5

Software Entwicklung 1

Transkript:

Parallele Algorithmen mit OpenCL Universität Osnabrück, Henning Wenke, 203-04-24

Was bisher geschah Host Device Platform Führt aus Führt aus Device Context Applikation Java, C++, Kernel (OpenCL C) Memory Object: Buffer kernel void vec_add( global int a, global int b, global int c){ int i = get_global_id(0); c[i] = a[i] + b[i]; } 2

Program OpenCL C Code mit mindestens einer Kernel- Funktion Genau einem Context und beim builden mindestens einem Device daraus zugeordnet Wird zur Laufzeit durch OpenCL API calls übersetzt Enthält optional, z.b.: Funktionen Konstanten Verwendbar in allen Kernels des Program Objects Platform Device Program Context Buffer 3

Erzeugen eines Program Objects Durch LWJGL-Klasse CLProgram repräsentiert Typischerweise basierend auf Source-Code Instanz liefert dann OpenCL Funktion: CLProgram clcreateprogramwithsource( CLContext context, // Context, mit dem Program Object // assoziiert sein soll String string, // OpenCL C Sourcecode IntBuffer errcode_ret // Rückgabe einer Fehlerkonstante ) 4

Beispiel: Program mit Kernel vec_add String programsource = "kernel void vec_add( \n" + " global int a, \n" + " global int b, \n" + " global int c) { \n" + " int i = get_global_id(0); \n" + " c[i] = a[i] + b[i]; \n" + "} \n"; // Erzeuge Program Object program aus OpenCL C Code CLProgram program = clcreateprogramwithsource( context, // Unser Context context // (Folie 2, letzte Woche) programsource, // Siehe oben ); null // Keine Fehlerbehandlung heute 5

Kompilieren und Linken eines Programs Funktion clbuildprogram kompiliert und linkt Program Object für Teilmenge der Devices des zugehörigen Context Kann asynchron ausgeführt werden int clbuildprogram( CLProgram program, // Rückgabe: Fehlerkonstante // Zu buildendes Program Object CLDevice device Oder: PointerBuffer device_list, // Ein Device, // IDs mehrerer Devices des // program zugeordneten Context ) String options, // Z.B. Optimierungen CLBuildProgramCallback pfn_notify // Zur asynchronen Ausführung // Diese Veranstaltung: Synchron // ausführen (null übergeben) 6

Beispiel // Übersetze und linke Program Object program (Folie 5) // für unser Device device clbuildprogram( // Keine Fehlerbehandlung heute program, device, // (siehe Folie 9, letzte Woche) "", // Keine Optionen ); null // Befehl synchron ausführen 7

Kernel Repräsentiert Funktion für parallele Berechnungen Platform Funktion ohne Rückgabe mit Qualifier kernel Genau einem Program zugeordnet Device Program Context Buffer Kernel 8

Erzeugen eines Kernels Objects Durch LWJGL-Klasse CLKernel repräsentiert Instanz davon liefert OpenCL Funktion clcreatekernel CLKernel clcreatekernel( CLProgram program, String kernel_name, // Ausführbares Program Objekt, // welches den Kernel enthält // Name des Kernels im Sourcecode des // Program Objects program IntBuffer errcode_ret // Rückgabe einer Fehlerkonstante ) kernel void vec_add( global int a, global int b, global int c){ // Beispiel: Erzeuge Kernel Object kernel int i = get_global_id(0); c[i] = a[i] + b[i]; // für Vektoraddition } CLKernel kernel = clcreatekernel( program, // Siehe Folien 5 und 7 "vec_add", // Name der Kernel-Funktion null // Keine Fehlerbehandlung heute ); 9

Argumentübergabe an Kernel OpenCL Funktion clsetkernelarg setzt je ein Argument eines Kernels Hinweis: Kernelparameter sind persistent Hier nur Auszug übergebbarer Informationen int clsetkernelarg ( CLKernel kernel, // Rückgabe: Fehlerkonstante // Kernel, dessen Argument zu setzen ist int arg_index, // 0: Erstes bis n-: Letztes Argument CLObject arg_value // Z.B.: Memory Objects Oder: java.nio.buffer, // Für Konstanten ) 0

Beispiel kernel void vec_add( global int a, global int b, global int c){ int i = get_global_id(0); c[i] = a[i] + b[i]; } // Setze Parameter a des Kernels kernel clsetkernelarg( // Keine Fehlerbehandlung heute kernel, // Setze Argument des auf Folie 9 erzeugten Kernels // kernel 0, // Betrifft erstes Argument ); a // Setze Buffer Object a (Folie 24, letzte Woche) // Beispiel 2: Setze Buffer c (Folie 25, letzte Woche) clsetkernelarg(kernel, 2, c);

Command Queue Regelt Host-Device Kommunikation Für bestimmten Context & Device erzeugt Drei Arten Befehle einhängbar Ausführung der Kernel Datenoperationen Synchronisation Ausführung asynchron zu Host / anderen Queues Optional: Out-Of-Order Execution Platform Device Program Kernel Command Queue Context Buffer 2

Erzeugen einer Command Queue Durch LWJGL-Klasse CLCommandQueue repräsentiert Instanz davon liefert OpenCL Funktion: CLCommandQueue clcreatecommandqueue( CLContext context, // Context, mit welchem Command Queue // assoziiert sein soll CLDevice device, // Ein Device des // zugeordneten Contexts context long properties, // CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE, // CL_QUEUE_PROFILING_ENABLE IntBuffer errcode_ret // Rückgabe einer Fehlerkonstante ) // Beispiel: Initialisiere Command Queue queue // für unsere Konfiguration CLCommandQueue queue = clcreatecommandqueue( context, device, // Siehe Folien 9 & 2 (letzte Woche) 0, // In-order & kein Profiling null // Heute keine Fehlerbehandlung ); 3

Kernel Ausführung OpenCL Kernel werden zur Ausführung in Command Queue eingehängt Achtung: Wird immer asynchron ausgeführt Vereinfacht, bis wir das Parallelitätsmodell besprechen int clenqueuendrangekernel( ) CLCommandQueue command_queue, CLKernel kernel, int work_dim, // Rückgabe: Fehlerkonstante // Queue, in die eingeh. w. soll // Einzuhängender Kernel // Dimension der Kernel-Indizierung PointerBuffer global_work_offset, // Index-Offset pro Dimension // null: Index beginnt mit 0 PointerBuffer global_work_size, // Globale Anzahl Work Items pro Dim // parfor Schleifenlänge PointerBuffer local_work_size, // Kapitel: Parallelitätsmodell // null: OpenCL entscheiden lassen PointerBuffer event_wait_list, // Events: später. PointerBuffer event // null: Keine Events 4

Beispiel int indexdim = ; // Verwende eindimensionale Indizierung // Erzeuge LWJGL-PointerBuffer mit einer Komponente PointerBuffer compcnt = new PointerBuffer(indexDim); compcnt.put(0, hosta.capacity()); // Hänge unseren Kernel kernel (Folie 9) zur Ausführung in Command // Queue queue (Folie 3) ein. clenqueuendrangekernel( // Heute keine Fehlerbehandlung queue, kernel, indexdim, // -Dimensionale Indizierung null, // Index beginnt mit 0 compcnt, // Vektorkomponentenanzahl // parfor Schleifenlänge null, null, null ); // OpenCL lokale Parallelität // festlegen lassen // Keine Events 5

Auswirkungen auf diesen D-Kernel {, 2, 3, 4, 5, 6, 7, 8, 9, 0}; clsetkernelarg kernel void vec_add( global int a, global int b, global int c){ int i = get_global_id(0); c[i] = a[i] + b[i]; } clenqueuendrangekernel(..., PointerBuffer global_work_size, PointerBuffer global_work_offset,...) Es werden global_work_size Instanzen des Kernels erzeugt Verarbeitung potentiell parallel Globale Daten in allen Instanzen sichtbar Für jede Instanz liefert get_global_id(0) einen Index Beginnt bei: global_work_offset Endet bei: global_work_offset + global_work_size Hinweis: Gilt für weitere Indexdimensionen analog 6

Daten zurück zum Host kopieren Kopiert lineare Daten aus Buffer Object in Host-Datenstruktur Wird in Command Queue eingehängt und ggf. asynchron ausgeführt Command Queue und Buffer müssen gleichem Context zugeordnet sein Hinweis: Schreiben analog mit clenqueuewritebuffer int clenqueuereadbuffer( // Rückgabe: Fehlerkonstante CLCommandQueue command_queue, // Queue, in die eingehängt w. soll CLMem buffer, // Quelle-Daten: Buffer Object int blocking_read, // CL_TRUE: Führe Befehl synchron aus // CL_FALSE: Führe Befehl asynchron aus long offset, // Erster Wert in buffer, angegeben in Bytes java.nio.buffer ptr, // Ziel-Datenstruktur des Host ) PointerBuffer event_wait_list, PointerBuffer event // Später... 7

Beispiel // Lies Buffer Object c zurück in Host Datenstruktur // java.nio.intbuffer chost clenqueuereadbuffer( queue, // Folie 3 c, // c definiert auf Folie 25, letzte Woche CL_FALSE, // Führe Befehl asynchron aus 0, // Von Anfang an kopieren. Außerdem: Bis Ende. // (diesem Code nicht entnehmbar) chost, // Host-Datenstruktur, Folie 25, letzte Woche ); null, null // Keine Events 8

Command Queue Abarbeitung erzwingen clfinish blockiert, bis alle in command_queue eingehängten Befehle abgearbeitet sind Live-Beispiel Warum bei blocking_read clfinish in gezeigten Beispiel unnötig? int clfinish( // Rückgabe: Fehlerkonstante CLCommandQueue command_queue ) 9