SlideShare ist ein Scribd-Unternehmen logo
1 von 83
Downloaden Sie, um offline zu lesen
1
Nebenläufigkeit mit
Koroutinen strukturieren
Jörn Dinkla
© 2021 ThoughtWorks
C++
1985
C++ 98
1998
2
2004 2007 2021
2001 2011 2014 2016
Java 9
Reactive
2017
Java 7
Fork/Join
2011
Java 8
Streams
CmplFut
2014
Java 5
2004
Java 1
1995
C++ 11
thread
2011
C++ 14
mutex
2014
C++ 17
par STL
2017
C++ 20
2020
Kotlin
1.0
2016
Kotlin
1.3
2018
Kotlin
1.4
2020
Historische Perspektive
Kotlin
0.0
2011
Kotlin ist Multiplatform
● Server Side / JVM
● Android
● Multiplatform Mobile (core)
● JavaScript (core)
Code für den Vortrag nur auf JVM getestet
https://github.com/jdinkla/2021_kkon_warmup.git
Schwerpunkt hier: JVM
3
https://github.com/Kotlin/kotlinx.coroutines
Nebenläufigkeit und Parallelität
4
https://www.flickr.com/photos/ensermac/49956350473
Browser sind nebenläufig
5
Damit man schneller lesen kann ...
Mit Parallelität beschleunigen ...
Beispiel: Computergrafik
6
https://www.tomsguide.com/us/what-is-ray-tracing,news-27880.html
Datenparallelität
Nebenläufigkeit strukturieren
● Bewährte Lösungsschablonen
● Wiederverwendbare Vorlage
Entwurfsmustern als Grundlage zur
Strukturierung von Nebenläufigkeit!
Mit Entwurfsmustern “design patterns”
7
https://parallelbook.com/
Diagramme aus:
https://parallelbook.com/sites/parallelbook.com/files/SC13_20131117_Intel_McCool_Robison_Reinders_Hebenstreit.pdf
Prozess im Betriebssystem
8
● Prozess ist Einheit der Ausführung
● Verwaltung von OS-Ressourcen
○ Speicher
○ IO-Deskriptoren
Bild: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/images/Chapter4/4_01_ThreadDiagram.jpg
Thread im Betriebssystem
● Prozess
○ 1..* Threads
○ Gemeinsame Ressourcen
○ Gemeinsamer Adressraum
● Parallelität
Ein Thread ist ein leichtgewichtiger Prozess.
9
Bild: https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/images/Chapter4/4_01_ThreadDiagram.jpg
Thread in JVM
10
● Java Thread entspricht OS-Thread
● OS macht Scheduling
○ Context-Switch erforderlich
● Leichtgewichtig?
○ 64kB - 2MB, default 1MB Stackgröße
http://blog.jamesdbloom.com/JVMInternals.html
Threads mit Kotlin benutzen
Fork-Join-Pattern
11
fork
join
Thread-Pool in Kotlin nutzen
Schlafende Threads mit sleep()
12
fork
join
Beispiel: Thread-Pool mit Kotlin
submit
13
Wie lange dauert es?
Alle Räder stehen still, ...
● Weil nur Platz für 4 Threads im Pool ist, muss einer nach
den anderen laufen
● Thread.sleep blockiert den Thread
… wenn alle Threads im Pool blockiert sind
14
Rechner wird nicht
genutzt
Vergrößerung des Pools?
15
● Ncpu: Anzahl der CPUs “number”
● Ucpu: Auslastung “utilization” 0.0 - 1.0
Verhältnis W/C
● Wartender Anteil W “waiting”
● Rechnender Anteil C “computing”
Waiting und Computing
Berechnung der Pool-Größe
16
Ncpu Ucpu W C Nthreads
8 1.0 0 1 8
8 1.0 1 1 16
8 1.0 10 1 80
8 1.0 430 9 390.2
CPU bound
Latency bound
Beispiele
Folgerungen
17
Wenn W >> C wird der Pool sehr groß
⇒
W/C sollte minimiert werden
Frage: Kann man statt warten etwas anderes tun?
“Latency hiding”
To block or not to block ...
18
Kotlin nutzt DSLs
19
Beispiel für HTML
https://kotlinlang.org/docs/type-safe-builders.html
(
(
(
(
(
(
(
)
)
)
)
)
)
)
20
Hello World mit Koroutinen
DSL für Koroutinen
21
Hello World mit Koroutinen
22
● Bindeglied zu synchronem Code
● Neuer CoroutineScope
● Wartet auf alle Koroutinen
runBlocking { }
Hello World mit Koroutinen
23
● Koroutine-Builder
● Startet Koroutine asynchron
launch { }
Hello World mit Koroutinen
24
● Analog Thread.sleep(), aber nicht-blockierend
● “suspension point”
delay()
Unterbrechbare Funktionen ...
25
● Einziges neues Keyword für Koroutinen
● Unterbrechbare Funktionen oder Lambdas
○ Nur von anderen unterbrechbaren Funktionen oder
Koroutinen aufrufbar
Werden mit suspend gekennzeichnet
Koroutinen laufen in Threads
Per Default im Thread “main”
26
Koroutinen mit delay()
Nebenläufigkeit mit Dispatcher
27
Launch mit
Dispatcher!
Job
5 Threads vs. 5000 Koroutinen
Hase gegen Igel?
28
Es gibt einen Unterschied!
Die Wartezeit wird ausgenutzt!
29
Taten statt
Warten
Under the cover
30
https://www.flickr.com/photos/brookpeterson/50346847276/
Wer veranlasst die Unterbrechung ?
Unterschiedliche Arten des Multitaskings
31
Thread
● Präemptives Multitasking
● Von außen vom OS-Scheduler unterbrochen
● Unterbrechung kann zu jeder Zeit passieren
Koroutine
● Kooperatives Multitasking
● Benutzt Suspension-Points, um zum Dispatcher
zurückzukehren
Jede Phase ist ein Zustand in einem endlichen Automat
Koroutinen
32
https://github.com/Kotlin/KEEP/blob/master/proposals/coroutines.md
Kotlin Evolution and Enhancement Process
“Suspension Points” definieren “Phasen”
Phase 0
Phase 1
Phase 2
Endlicher Automat
33
Zustand
Phasen
CoroutineDispatcher
34
● Dispatchers.Default
○ CPU-Bound: Anzahl der Kerne inkl. Hyper-Threading
● Dispatchers.IO
○ max(64, #CPUs), kotlinx.coroutines.io.parallelism
● Dispatchers.Main
○ Single-Thread für UI
● Dispatchers.Unconfined
○ Wenn Thread nicht wichtig ist
Vordefinierte “Thread-Pools”
CPU bound
Koroutinen-Builder: launch
35
● erstellt Job
● Optionale Argumente
● CoroutineContext
● CoroutineStart: optional Lazy
“Fire and forget”
CoroutineContext
36
● Indizierte Menge von “Kontext-Elementen” (Statisch, “immutable”)
● Enthält per Default
○ Job
○ Dispatcher
● Optional
○ Exception-Handler, Cancelling
● Hierarchie mit Job.children()
Operative Eigenschaften der Koroutine
Koroutinen-Builder: async
37
● erstellt Deferred<T>
● Vereinfachte Future<T>
● Erbt von Job
Gibt einen Wert zurück
Beispiel: Quicksort
Parallele Dekomposition, Divide & Conquer
38
Beispiel: Quicksort
Aufruf und Vergleich
39
Speedup 3.5
CoroutineScope
40
● Hat CoroutineContext
● Platz für eigene Extensionsfunktionen
● Hierarchische Organisation
○ Keine Leaks
○ Exceptions- und Cancelling
Structured Concurrency
Job
Job
Job
Job
Exceptions
launch {}
41
Leitet ganz nach oben
weiter!
Exceptions
async {}
42
Jedes catch auf dem
Weg nach oben!
SupervisorJob
Supervisor kann eigene Fehler-Strategie implementieren
hat andere Eigenschaften
43
Cancellation
Mit Exceptions implementiert
44
Benötigt Kooperation
Lebenszyklus eines Jobs
Zustände
45
Cancelling
Completed
Cancelled
New Active Completing
start complete finish
finish
cancel fail
Timeouts
Ebenfalls mit Exceptions implementiert
46
Achtung bei Nebenläufigkeit!
47
https://www.flickr.com/photos/stevensnodgrass/5224901405/
Thread-sicher bzw. Koroutinen-sicher
Auch Koroutinen können sich irren ...
48
Race condition
c = c + 1
"The heart of the problem is that no
one really knows how to organize
and maintain large systems that rely on
locking."
49
50
Modelle der Nebenläufigkeit
https://pragprog.com/titles/pb7con/seven-concurrency-models-in-seven-weeks/
● Reine funktionale Programmierung
○ Keine Seiteneffekte ⇒ keine Konflikte
● Kompromiss
○ Kein geteilter änderbarer Zustand
○ (“shared mutable state”)
● Communicating Sequential Processes (CSP)
● Reactive Streams
● Aktoren
Modelle der Nebenläufigkeit
51
Alternativen sind vorhanden
Channels
52
Communicating sequential processes (CSP)
53
● Modell der Interaktion von Prozessen
● C.A.R. Hoare
○ (Quicksort, ”Erfinder” von null)
● Ursprünglich eher theoretisch
● Wiederbelebt von Go und den “Goroutinen”
● Basiert auf Events die über Kanäle geschickt werden
Anwendungsfall
54
● Wie können Erzeuger und Verbraucher synchronisiert werden?
● “Backpressure”, wenn Geschwindigkeit der Producer zu hoch!
Producer-Consumer / Erzeuger-Verbraucher
https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/08_Channels
Beispiel für Channel
55
Producer-Consumer mit Koroutinen
Beispiel für Channel
56
Ergebnis
Faire
Verteilung
Nicht lazy
Flows
57
https://www.flickr.com/photos/90371939@N00/4292364310
Flows laufen in Koroutinen
58
59
Aktor-Modell
60
https://www.flickr.com/photos/shinyasuzuki/15451548486
Aktoren und Event-Driven-Programming
Traditioneller Aktor:
● Mailbox
● Verhalten (“behaviour”)
● Zustand (“state”)
Unser Aktor:
● Channel
● Koroutine ...
● … mit Zustand
61
Kommunikation über Nachrichten
Counter als Aktor
● Increment
● Get gibt den Wert zurück
Schritt 1: Definiere die Nachrichten
62
Kotlin’s OO model
Counter als Aktor
Schritt 2: Aktor als Koroutine und SendChannel<Msg>
63
Counter als Aktor
Schritt 3: Test
64
Nebenläufig und
Korrekt!!!
Bibliotheken
65
Einfaches Beispiel mit Ktor
66
DSLs überall
HTML-DSL
Route-DSL
67
https://developer.android.com/images/kotlin/kotlin-hero.svg
Android
Android
Verwendet Koroutinen objekt-orientiert
68
UI-Thread
Koroutinen mit Swing
69
Thread-Confinement mit Dispatchers.Swing
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-swing/
Koroutinen mit Swing
Die App bleibt responsiv, weil die Koroutine den Swing-Thread nicht blockiert
70
Retrofit
Retrofit erzeugt einen Rest-Client aus Schnittstellen:
REST-Clients auch mit Koroutinen
71
https://square.github.io/retrofit/
https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/01_Introduction
Fazit
72
https://www.flickr.com/photos/nnova/3399904953
Wann sollte ich Koroutinen einsetzen?
● Lohnt sich die Umstellung?
● Wartbarkeit des Codes
○ Sequentieller Code ist immer einfacher zu lesen
● Lohnt sich die nebenläufige Ausführung?
○ W/C
○ Threads und Koroutinen haben einen Overhead
● Granularität
○ Lassen sich einzelne Tasks zusammen ausführen?
Es lohnt sich nicht immer ...
73
Fazit
74
Koroutinen
+ Entwurfsmuster
+ Structured Concurrency
+ Datenstrukturen (Channel, Flow)
+ alternative Modelle
= modularer, wartbarer und asynchroner Code
75
Vielen Dank für Ihre
Aufmerksamkeit!
Jörn Dinkla
jdinkla@thoughtworks.com
© 2021 ThoughtWorks
Anhang
76
https://www.flickr.com/photos/jandavid/149718410
Koroutinen
77
Dokumentation
● https://kotlinlang.org/docs/coroutines-guide.html
Beispiele
● https://github.com/Kotlin/kotlin-coroutines-examples
Roman Elizarov’s Blog
● https://medium.com/@elizarov
Links
Kotlin lernen und ausprobieren
Informationen
● https://kotlinlang.org/
Ausprobieren im Browser
● https://play.kotlinlang.org
Koans
● https://play.kotlinlang.org/koans/overview
78
Links
Literatur
79
Kotlin (* enthält Koroutinen)
! ! !
Literatur
80
Kotlin (* enthält Koroutinen)
! !
!
!
Literatur
81
Ältere Bücher
Literatur
82
Nebenläufigkeit
https://parallelbook.com/
Icons
83
https://commons.wikimedia.org/wiki/File:Wayuu_Patterns._Wayuu-mochila-bags.png
https://en.wikipedia.org/wiki/Recycling

Weitere ähnliche Inhalte

Ähnlich wie Nebenlaeufigkeit mit Koroutinen strukturieren

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
 
EntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloadedEntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloadedRené Winkelmeyer
 
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
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerPatrick Baumgartner
 
Infonova Devopscon München 2015
Infonova Devopscon München 2015Infonova Devopscon München 2015
Infonova Devopscon München 2015Georg Öttl
 
Helm – The Kubernetes Package Manager
Helm – The Kubernetes Package ManagerHelm – The Kubernetes Package Manager
Helm – The Kubernetes Package Managerinovex GmbH
 
OSMC 2010 | Merlin - status quo by Wolfgang Barth
OSMC 2010 | Merlin - status quo by Wolfgang BarthOSMC 2010 | Merlin - status quo by Wolfgang Barth
OSMC 2010 | Merlin - status quo by Wolfgang BarthNETWAYS
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturQAware GmbH
 
Microservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSMicroservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSRalf Ernst
 
Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020Torsten Kleiber
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungTilo Baller
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance ReloadedGregor Goldbach
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenOdilo Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenPatrick Baumgartner
 
DOAG 2011: MySQL Performance Tuning
DOAG 2011: MySQL Performance TuningDOAG 2011: MySQL Performance Tuning
DOAG 2011: MySQL Performance TuningFromDual GmbH
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im VergleichQAware GmbH
 

Ähnlich wie Nebenlaeufigkeit mit Koroutinen strukturieren (20)

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
 
EntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloadedEntwicklerCamp 2014 - DOTS reloaded
EntwicklerCamp 2014 - DOTS reloaded
 
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
 
BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
 
Infonova Devopscon München 2015
Infonova Devopscon München 2015Infonova Devopscon München 2015
Infonova Devopscon München 2015
 
Helm – The Kubernetes Package Manager
Helm – The Kubernetes Package ManagerHelm – The Kubernetes Package Manager
Helm – The Kubernetes Package Manager
 
OSMC 2010 | Merlin - status quo by Wolfgang Barth
OSMC 2010 | Merlin - status quo by Wolfgang BarthOSMC 2010 | Merlin - status quo by Wolfgang Barth
OSMC 2010 | Merlin - status quo by Wolfgang Barth
 
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer InfrastrukturContinuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
Continuous Delivery für Cloud-native Anwendungen auf Cloud-nativer Infrastruktur
 
Slides
SlidesSlides
Slides
 
Microservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OSMicroservices and Container Management with Mesosphere DC/OS
Microservices and Container Management with Mesosphere DC/OS
 
Akka.NET Teil 1 - Verteilte Architektur von Beginn an
Akka.NET Teil 1 - Verteilte Architektur von Beginn anAkka.NET Teil 1 - Verteilte Architektur von Beginn an
Akka.NET Teil 1 - Verteilte Architektur von Beginn an
 
Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020Our way to 19c - DOAG 2020
Our way to 19c - DOAG 2020
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & Verwendung
 
Perl Renaissance Reloaded
Perl Renaissance ReloadedPerl Renaissance Reloaded
Perl Renaissance Reloaded
 
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 der Tools & Methoden - Baumgartner, Oehmichen
 
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, OehmichenJFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
JFS 2011 - Top 10 Tools & Methoden - Baumgartner, Oehmichen
 
Werkzeugkasten
WerkzeugkastenWerkzeugkasten
Werkzeugkasten
 
DOAG 2011: MySQL Performance Tuning
DOAG 2011: MySQL Performance TuningDOAG 2011: MySQL Performance Tuning
DOAG 2011: MySQL Performance Tuning
 
Asynchrone Event Verarbeitung
Asynchrone Event VerarbeitungAsynchrone Event Verarbeitung
Asynchrone Event Verarbeitung
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 

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
 
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
 
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
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDAJö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
 
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
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisJö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 (16)

Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"Presentation of the book "Mikado Method"
Presentation of the book "Mikado Method"
 
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
 
GPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCLGPU-Computing mit CUDA und OpenCL
GPU-Computing mit CUDA und OpenCL
 
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDASchulung: Einführung in das GPU-Computing mit NVIDIA CUDA
Schulung: Einführung in das GPU-Computing mit NVIDIA CUDA
 
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
 
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
 
GPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der PraxisGPU-Computing mit CUDA und OpenCL in der Praxis
GPU-Computing mit CUDA und OpenCL in der Praxis
 
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
 

Kürzlich hochgeladen

Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Markus Unterauer
 
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...DNUG e.V.
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...DNUG e.V.
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...OPEN KNOWLEDGE GmbH
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationOPEN KNOWLEDGE GmbH
 

Kürzlich hochgeladen (6)

Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
 
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
 

Nebenlaeufigkeit mit Koroutinen strukturieren