SlideShare ist ein Scribd-Unternehmen logo
1 von 75
Downloaden Sie, um offline zu lesen
GPU-Computing
mit CUDA und OpenCL
     in der Praxis
     24. Mai 2012

      Jörn Dinkla
Motivation
Computer-Grafik
 Vom Modell zum Bild




              Tomas Akenine-Mőller © 2002, Quelle: http://www.realtimerendering.com/
Echtzeit-Grafik

Vertex                  Pixel




               Quelle: Tomas Akenine-Mőller © 2002
Rückblick




1992 …        1995 …
T&L in Hardware
  Fixed pipelines




  DirectX 7.0

1999                2000
Programmierbare Shader




  DirectX 8.0     DirectX 9.0
2001            2002
Shader-Sprachen


  GPGPU




HLSL, Cg, GLSL

2003             2004   2005
Unified Shader




DirectX 10.0

2006            2007
GPU-Computing

                     CUDA



                              OpenCL


       CTM     Stream SDK
                                        DirectX 11.0


2006          2007          2008       2009
Massiv Parallel
Parallelisieren?
 Schneller, Größer, Besser

480p   576p    720p   1080p   4K2D / QFHD




  Höhere Geschwindigkeit
Entwicklungs-Methodik
1. Golden Code
   Sequentiell und korrekt
2. Golden Code parallelisieren
3. Zu GPU-Code transformieren
Parallelität finden

  Eingabe            Eingabe




Verarbeitung    #1     #2      #3




 Ausgabe             Ausgabe
Parallelität finden

  Eingabe        E1   E2     E3




Verarbeitung     #1   #2     #3




 Ausgabe         A1   A2     A3
SPMD / SIMT
   Parameter: Eindeutige ID
   Hole Daten anhand ID
   Verarbeitung
   Speichere Daten anhand ID
                           E1   E2   E3




                           #1   #2   #3




                           A1   A2   A3
SIMT: Lock-step

1   2    3   4



1   2    3   4   uchar4 p;
                 p.x = x+y;
                 p.y = x-y;
                 p.z = y;
                 p.w = 255;
Frameworks
                      Plattform-Unabhängigkeit ?


Komfortabel       OpenACC ?             C++ AMP?


                                        PyCUDA /
  Besser            Thrust?
                                       PyOpenCL ?

                CUDA Runtime
 Praktisch
                    API                 C++ cl.hpp


Low Level       CUDA Driver API          Open CL



 Hardware
CUDA Runtime API
 HelloWorld.cu

                  Kernel




                  Host
Programm zu Code
 Host Code      Device Code
  C/C++           (Kernel)

                                 JIT?
  Compiler        Compiler


 Assembler /
               LLVM / PTX / IL
   LLVM
                                 JIT?

 Assembler      Assembler (*)


               Cubin / Machine
Machine Code
                    Code
OpenCL
 Vorteile
   „Plattformunabhängig“
   CPU+GPU
   Vektorberechnungen
 Aber
   Performance von Device abhängig
   „Komiteesprache“
OpenCL / Driver API
                   Plattform

                    Device

                   Context

                Command Queue

                   Program

                    Kernel

                    Aufruf
WebCL




Siehe http://webcl.nokiaresearch.com/kerneltoy/
Smoothing
Smoothing
 3x3 Fenster
    0 1 2 3 4       0 1 2 3 4       0 1 2 3 4

0               0               0
1               1               1
2               2               2
3               3               3
4               4               4
Algorithmus
 Für alle x,y,z in vol
   sum = 0, c = 0
   Für alle dx,dy,dz in Nachbarschaft
      sum += vol[x+dx,y+dy,z+dz]
      c += 1
   vol‘[x,y,z] = sum / c           Threads
Extent
 Extension / Größe
      width, height, depth
      index(x,y,z)
      inBounds(x,y,z)
    0 1 2 3
0
                0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1
2
3
Accum
 Akkumulator                0 1 2 3 4

   add(value)           0
     Akkumuliert int4   1

   avg()
                         2
                         3
     Durchschnitt       4
Golden Code
Fermi (GTX 580)
Kernel-Konfiguration
 x*y*z Threads  Cores/SMs
 Thread-Block / Work group / Tile
 Grid / NDRange
                0 1 2 3 4 5 6 7

            0   T   T   T   T   T   T   T   T
            1   T   T   T   T   T   T   T   T
            2   T   T   T   T   T   T   T   T
            3   T   T   T   T   T   T   T   T
            4   T   T   T   T   T   T   T   T
            5   T   T   T   T   T   T   T   T
            6   T   T   T   T   T   T   T   T
            7   T   T   T   T   T   T   T   T
Kernel-Konfiguration
 ExecConfig
     grid
     threads
     stream
     ExecConfig(Extent)
Host              Überblick


         Buffer   Algorithmus        Buffer‘        Buffer‘
Device




                  Buffer    Kernel        Buffer‘
Speicher-Management
 Device-Speicher
   cudaMalloc(), cudaFree()
 Host-Speicher
   cudaMallocHost(), cudaFreeHost()
 Transfer
   cudaMemcpy()
Host-Speicher
Virtueller
Speicher




                 Physikalischer
                   Speicher


                 cudaMallocHost()
                     malloc()
                                     Device
                                    Speicher
Buffer
 BaseBuffer
   malloc(), free()
 HostBuffer
   PinnedHostBuffer
 DeviceBuffer
   copyFrom(), copyTo()
 Versionierung
BufferPair
 Paar




                     Host
                              Buffer                               Buffer‘




   Host-Buffer



                     Device
                                       Buffer   Kernel   Buffer‘




   Device-Buffer
 Methoden
   updateDevice()
   updateHost()
GPU-Code
Performance-Vergleich
                         Nur GPU    Mit Kopien
    Größe      CPU    GPU Speedup GPU+C Speedup
      8          0      0           2      0,00
      16         1      0           2      0,00
      32         2      0           4      0,00
      64        15      0           4      0,00
     128        97      4    24,25  10     9,70
     256        660    23    28,70  63    10,48
     384       2216    78    28,41 204    10,86
     512       5249   184 28,53    482    10,89

Und größer ?
Speicherplatz: N^3
Größere Volumen
 Swapping

Host



Device
Swapping
 BufferIterator
 Kernel: Anpassen
 BufferPair: Erweitern
Host
                     Auslastung


         I               O   I               O   I               O
Device




             I   K   O           I   K   O           I   K   O
Last
Streams & Overlap

Schritt   Ein Stream   Stream 1    Stream 2   Stream 1    Stream 2
  1           H2D         H2D                    H2D
  2         Kernel 1    Kernel 1    H2D        Kernel 1    H2D
  3           D2H         D2H      Kernel 2      D2H      Kernel 2
  4           H2D                   D2H          H2D       D2H
  5         Kernel 2    H2D                    Kernel 3
  6           D2H      Kernel 3                  D2H
  7           H2D       D2H
  8         Kernel 3
  9           D2H

                         Kernel + Kopie       Kernel + Kopie und
                          überlappend           H2D und D2H
Swapping & Streaming
 Initialisierung
 Parallel
    Für alle „ungeraden“ Partitionen p
       Kopiere H2D für p in s1
       Rufe Kernel auf für p in s1
                                        Asynchron
       Kopiere D2H für p in s1
    Für alle „geraden“ Partitionen q
       Kopiere H2D für q in s2
       Rufe Kernel auf für q in s2
       Kopiere D2H für q in s2
Übersicht
 Asynchrone Kopien
 Host




          Buffer                                      Buffer‘




                   Buf 1   Kernel   Buf‘ 1
 Device




                           Buf 2    Kernel   Buf‘ 2
Double Buffering

         Volumen                                     Volumen
          Input                                       Output
Host




         Buf 1     Buf 2                     Out 1       Out 2




                   Buf 1   Kernel   Out 1
Device




                           Buf 2    Kernel     Out 2
Klasse
 HostBufferPair
   Analog zu BufferPair
   Buffer
     HostBuffer
     PinnedHostBuffer
   Unterschiedliche Größe
     updateFrom(), updateTo()
Performance-Vergleich
   Größe    CPU    GPU    Speedup
     8       0      0
     16      0      0
     32      10     0
     64      20     0
    128     110     0
    256     660     23     10,48
    384     2233    80     10,86
    512     5263   183     10,89
    768    17707   1718    10,31
    1024   42101   4079    10,32
    1152   59156   5924    9,99
Theorie
 GTX 580
   1632,3 GFLOPS und 194,5 GB/s
 Wen es interessiert:
   GFLOPS
      #Cores * Shader-Takt * 2
   GB/s
      Breite [Byte] * Memory-Takt * x
      GDDR3: x = 2, GDDR5: x = 4
Pi mal Daumen
 Pro Kernel
   27 Laden, 1 Speichern
   638 Operationen
   Arithmetische Intensität
 Bei 512er Test
   467,93 GFLOPS
   20,54 GB/s
 Optimierungspotential vorhanden!
Optimierung
Maximiere …
1. Parallelität
2. Speicherdurchsatz
3. Berechnungsdurchsatz
Maximiere Parallelität
 Streams
   Asynchrone Kopien und Kernel
 Auslastung des Device
   Grid
 Auslastung der SMs
   Thread-Block
   „Occupancy“
Occupancy
 Mehrere Thread-Blöcke pro SM
 Speicherzugriffe verstecken
 O(1) Scheduler


   SM   TB   TB   TB   TB   TB   --   --   --
Occupancy Calculator
Speicher-Architektur
                                                         GPU
          Global Memory                       Global Memory
8-20                               8-16
                                          Constant             Texture
   Bus / Memory Controller
                                                                         160-
                                                  L2 Cache
                                                                         200

                 CPU 1                        Prozessor (SM)
       Core              Core                C       C     C      C
                                   8000
       L1 / L2           L1 / L2
                                                 Registers

              L3 Cache                       Local / Shared / L1          1600
Max. Speicherdurchsatz
 „Coalesced“ Zugriffe
   32, 64, oder 128-byte
   „Alignment“
Max. Speicherdurchsatz
 Pinned-Host-Speicher
 Minimiere Kopien
 Benutze On-Chip-Speicher
   Shared/Local, Register
   Konfiguriere Cache
Divergenz

1   2   3    4



1   2   3    4   int tid = treadIdx.x;
                 if (tid < 2) {
                      o[tid] = 1;
                 } else {
                      o[tid] = 2;
                 }
Max. Berechnungen
   Minimiere Divergenz
   Loop-Unrolling
   Berechnen statt Speichern
   Arithmetik
     Präzision vs. Geschwindigkeit
 Fusion von Kerneln
Synchronisation
 Innerhalb Thread-Block
   __syncthreads()
 Atomare Zugriffe
   atomicAdd()
 Speicher
   Zwischen Kernel-Aufrufen
Weiterführend …
JVM
 JNI
   JCuda
   Javacl, Jocl
 Eigenes API
   Aparapi, Java-GPU
JVM
Komfortabel



  Besser


              CUDA Runtime
 Praktisch
                  API           C++ cl.hpp
                   JCUDA

Low Level     CUDA Driver API   Open CL


                                       JavaCL
 Hardware
CUDA mit Java
Hello, Groovy CUDA!




                 JCUDA
Hello, Groovy OpenCL!
                  JavaCL
Hello, Scala + GPU


                     JavaCL
Fazit JVM
 Vorteile
   Entwicklungsgeschwindigkeit
      Host-Code
 Nachteile
   Datentypen
   Getrennt Debuggen
Fazit
 „Richtig“ eingesetzt unschlagbar!




 Folien & Code
   http://dinkla.net/parallel2012
Literatur: CUDA
 Sanders, Kandrot
  CUDA by Example



 Kirk, Hwu
  Programming Massively
     Parallel Processors
Literatur: OpenCL
 Scarpino
  OpenCL in Action



 Gaster et.al.
  Heterogeneous Computing
  With OpenCL
Literatur: CUDA
 Hwu (Ed.)
  GPU Computing Gems
    Emerald Edition


 Hwu (Ed.)
  GPU Computing Gems
    Jade Edition

Weitere ähnliche Inhalte

Was ist angesagt?

Introduction to the command line
Introduction to the command lineIntroduction to the command line
Introduction to the command linesteffenbauer
 
Integrierte und dedizierte Backup Lösung von GFI MAX
Integrierte und dedizierte Backup Lösung von GFI MAXIntegrierte und dedizierte Backup Lösung von GFI MAX
Integrierte und dedizierte Backup Lösung von GFI MAXMAX2014DACH
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit JujuFrank Müller
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLFromDual GmbH
 
Ceph Introduction @GPN15
Ceph Introduction @GPN15Ceph Introduction @GPN15
Ceph Introduction @GPN15m1no
 

Was ist angesagt? (6)

Introduction to the command line
Introduction to the command lineIntroduction to the command line
Introduction to the command line
 
Integrierte und dedizierte Backup Lösung von GFI MAX
Integrierte und dedizierte Backup Lösung von GFI MAXIntegrierte und dedizierte Backup Lösung von GFI MAX
Integrierte und dedizierte Backup Lösung von GFI MAX
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit Juju
 
Ceph Object Store
Ceph Object StoreCeph Object Store
Ceph Object Store
 
DOAG: NoSQL with MySQL
DOAG: NoSQL with MySQLDOAG: NoSQL with MySQL
DOAG: NoSQL with MySQL
 
Ceph Introduction @GPN15
Ceph Introduction @GPN15Ceph Introduction @GPN15
Ceph Introduction @GPN15
 

Ähnlich wie GPU-Computing mit CUDA und OpenCL in der Praxis

Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleJörn Dinkla
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingJörn Dinkla
 
20111006 roadshow-sandy-bridge
20111006 roadshow-sandy-bridge20111006 roadshow-sandy-bridge
20111006 roadshow-sandy-bridgeWerner Fischer
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...inovex GmbH
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHagilemethoden
 
Private Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStackPrivate Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStackDaniel Schneller
 
Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...
Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...
Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...Stephan Hochhaus
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
Gesichtserkennung in Kamerastreams
Gesichtserkennung in KamerastreamsGesichtserkennung in Kamerastreams
Gesichtserkennung in KamerastreamsChristian Kehl
 
DOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 Server
DOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 ServerDOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 Server
DOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 ServerJomaSoft
 
C API for Lotus Notes & Domino
C API for Lotus Notes & DominoC API for Lotus Notes & Domino
C API for Lotus Notes & DominoUlrich Krause
 
oVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und EvaluierungsergebnisseoVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und Evaluierungsergebnisseinovex GmbH
 
C / C++ Api for Beginners
C / C++ Api for BeginnersC / C++ Api for Beginners
C / C++ Api for BeginnersUlrich Krause
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesQAware GmbH
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...NETWAYS
 
Drahtwanderung: Wir machen den NeXTen Schritt
Drahtwanderung: Wir machen den NeXTen SchrittDrahtwanderung: Wir machen den NeXTen Schritt
Drahtwanderung: Wir machen den NeXTen SchrittFalk Hartmann
 
TechTalkThursday 27.10.2016: Ceph im NVME Cluster
TechTalkThursday 27.10.2016: Ceph im NVME ClusterTechTalkThursday 27.10.2016: Ceph im NVME Cluster
TechTalkThursday 27.10.2016: Ceph im NVME Clusternine
 

Ähnlich wie GPU-Computing mit CUDA und OpenCL in der Praxis (20)

Multi-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz vieleMulti-GPU-Computing: Eins, zwei, drei, ganz viele
Multi-GPU-Computing: Eins, zwei, drei, ganz viele
 
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-ComputingTipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
Tipps & Tricks für den erfolgreichen Einsatz von GPU-Computing
 
20111006 roadshow-sandy-bridge
20111006 roadshow-sandy-bridge20111006 roadshow-sandy-bridge
20111006 roadshow-sandy-bridge
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
 
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbHDocker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
Docker Workshop Experten Forum Stuttgart 2015, Agile Methoden GmbH
 
Private Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStackPrivate Cloud mit Ceph und OpenStack
Private Cloud mit Ceph und OpenStack
 
OpenCL Grundlagen
OpenCL GrundlagenOpenCL Grundlagen
OpenCL Grundlagen
 
Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...
Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...
Weltvermessen mit OpenDataCam - Wie ich einmal eine Viertelmillionen Autos ge...
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
SuperCollider SS2016 1
SuperCollider SS2016 1SuperCollider SS2016 1
SuperCollider SS2016 1
 
Gesichtserkennung in Kamerastreams
Gesichtserkennung in KamerastreamsGesichtserkennung in Kamerastreams
Gesichtserkennung in Kamerastreams
 
DOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 Server
DOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 ServerDOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 Server
DOAG 2018 / Praktische Erfahrungen mit SPARC S7-2 Server
 
C API for Lotus Notes & Domino
C API for Lotus Notes & DominoC API for Lotus Notes & Domino
C API for Lotus Notes & Domino
 
oVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und EvaluierungsergebnisseoVirt 3.5 - Einführung und Evaluierungsergebnisse
oVirt 3.5 - Einführung und Evaluierungsergebnisse
 
C / C++ Api for Beginners
C / C++ Api for BeginnersC / C++ Api for Beginners
C / C++ Api for Beginners
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
Dataservices - Data Processing mit Microservices
Dataservices - Data Processing mit MicroservicesDataservices - Data Processing mit Microservices
Dataservices - Data Processing mit Microservices
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
Drahtwanderung: Wir machen den NeXTen Schritt
Drahtwanderung: Wir machen den NeXTen SchrittDrahtwanderung: Wir machen den NeXTen Schritt
Drahtwanderung: Wir machen den NeXTen Schritt
 
TechTalkThursday 27.10.2016: Ceph im NVME Cluster
TechTalkThursday 27.10.2016: Ceph im NVME ClusterTechTalkThursday 27.10.2016: Ceph im NVME Cluster
TechTalkThursday 27.10.2016: Ceph im NVME Cluster
 

Mehr von Jörn Dinkla

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Jörn Dinkla
 
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDJörn Dinkla
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenJörn Dinkla
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Jörn Dinkla
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to KotlinJörn Dinkla
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesJörn Dinkla
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenJörn Dinkla
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLJörn Dinkla
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftJörn Dinkla
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer ÜberblickJörn Dinkla
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyJörn Dinkla
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel ComputingJörn Dinkla
 
Subversion Schulung
Subversion SchulungSubversion Schulung
Subversion SchulungJörn Dinkla
 
Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Jörn Dinkla
 

Mehr von Jörn Dinkla (15)

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
 
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDDKorrekte nebenläufige Anwendungen mit Koroutinen und TDD
Korrekte nebenläufige Anwendungen mit Koroutinen und TDD
 
Nebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturierenNebenlaeufigkeit mit Koroutinen strukturieren
Nebenlaeufigkeit mit Koroutinen strukturieren
 
Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?Plain react, hooks and/or Redux ?
Plain react, hooks and/or Redux ?
 
A short introduction to Kotlin
A short introduction to KotlinA short introduction to Kotlin
A short introduction to Kotlin
 
Concurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutinesConcurrency in Kotlin with coroutines
Concurrency in Kotlin with coroutines
 
Nebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins KoroutinenNebenläufigkeit mit Kotlins Koroutinen
Nebenläufigkeit mit Kotlins Koroutinen
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
 
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale WirtschaftDie ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
Die ‚komplexe‘ Perspektive - Einführung in die digitale Wirtschaft
 
Geschäftsmodelle - Ein kurzer Überblick
Geschäftsmodelle -Ein kurzer ÜberblickGeschäftsmodelle -Ein kurzer Überblick
Geschäftsmodelle - Ein kurzer Überblick
 
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard CaseyBuchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
Buchvorstellung "Libertarian Anarchy: Against the State" von Gerard Casey
 
Introduction To Parallel Computing
Introduction To Parallel ComputingIntroduction To Parallel Computing
Introduction To Parallel Computing
 
Subversion Schulung
Subversion SchulungSubversion Schulung
Subversion Schulung
 
Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4Test-Driven-Development mit JUnit 4
Test-Driven-Development mit JUnit 4
 
Ant im Detail
Ant im DetailAnt im Detail
Ant im Detail
 

GPU-Computing mit CUDA und OpenCL in der Praxis