SlideShare une entreprise Scribd logo
Pourquoi développer des
algorithmes parallèles ?
Pourquoi développer des
algorithmes parallèles ?

Pourquoi développer des
applications multithread ?
Pourquoi développer des
algorithmes parallèles ?

=
Pourquoi développer des
applications multithread ?
Pour exploiter la puissance
des processeurs modernes.
Depuis 2005 bla bla bla
Depuis 2005 bla bla bla
Conséquence :
Il va falloir faire preuve
d’intelligence
pour écrire des applications
performantes !
Depuis 2005
Pour développer des applications perfomantes,
il faut :
Depuis 2005
Pour développer des applications perfomantes,
il faut :
1) Ecrire des traitements multithreads

2) Programmer chaque traitement (algorithme)
en parallèle
Boite à outils
1) Ecrire des traitements multithreads :
Java.util.concurrent
2) Programmer chaque traitement (algorithme)
en parallèle
???
Boite à outils
Jusqu’en JDK 6 : rien…
Boite à outils
Jusqu’en JDK 6 : rien…
À partir de JDK 7 :
- Fork / Join
- Parallel Arrays : rend le Fork / Join compatible
JDK 6
À partir de JDK 8 : les lambdas !
Fork / Join
JDK 7 & 6
Que programme-t-on ?
Initialisation du pool
ForkJoinPool pool = new ForkJoinPool() ;

PrimeFactorsFinderRecursiveTask task =
new PrimeFactorsFinderRecursiveTask(1, 4000) ;
ForkJoinTask<PrimeFactors> pfsTask = pool.submit(task) ;
PrimeFactors pfs = pfsTask.get() ; // Eq join
public class PrimeFactorsFinderRecursiveTask
extends RecursiveTask<PrimeFactors> {
private int start, end ;
protected PrimeFactors compute() {
PrimeFactors pfs = new PrimeFactors() ;
if (end - start > MAX_ITERATIONS) { // I’m too big
// processing
ForkJoinTask<PrimeFactors> task = ... ;
task.fork() ;
PrimeFactors pfs = task.get() ;
...
} else {
...
}
return pfs ;
}
}
public class PrimeFactorsFinderRecursiveTaskSous-tâche
extends RecursiveTask<PrimeFactors> {
envoyée au pool
private int start, end ;
protected PrimeFactors compute() {
PrimeFactors pfs = new PrimeFactors() ;
if (end - start > MAX_ITERATIONS) { // I’m too big
// processing
ForkJoinTask<PrimeFactors> task = ... ;
task.fork() ;
PrimeFactors pfs = task.get() ;
...
} else {
...
}
return pfs ;
}
}
public class PrimeFactorsFinderRecursiveTask
Appel à get()
extends RecursiveTask<PrimeFactors> {
bloquant
private int start, end ;
protected PrimeFactors compute() {
PrimeFactors pfs = new PrimeFactors() ;
if (end - start > MAX_ITERATIONS) { // I’m too big
// processing
ForkJoinTask<PrimeFactors> task = ... ;
task.fork() ;
PrimeFactors pfs = task.get() ;
...
} else {
...
}
return pfs ;
}
}
public class PrimeFactorsFinderRecursiveTask Calcul
extends RecursiveTask<PrimeFactors> {
proprement
private int start, end ;

dit

protected PrimeFactors compute() {
PrimeFactors pfs = new PrimeFactors() ;
if (end - start > MAX_ITERATIONS) { // I’m too big
// processing
ForkJoinTask<PrimeFactors> task = ... ;
task.fork() ;
PrimeFactors pfs = task.get() ;
...
} else {
...
}
return pfs ;
}
}
Quelle stratégie de découpage ?
Au niveau du code
// 1ère strategie
if (end - start > MAX_ITERATIONS) { // Trop gros !
int m = (start + end) / 2 ;
PrimeFactorsFinderTask task1 =
new PrimeFactorsFinderTask(start, m) ;
PrimeFactorsFinderTask task2 =
new PrimeFactorsFinderTask(m, end) ;
task1.fork() ;
task2.fork() ;
PrimeFactors pfs1 = task1.join() ;
PrimeFactors pfs2 = task2.join() ;
pfs.add(pfs1) ;
pfs.add(pfs2) ;

}
// 2ème strategie
if (end - start > MAX_ITERATIONS) { // Trop gros !
List<ForkJoinTask<PrimeFactors>> pfsList =
new ArrayList<ForkJoinTask<PrimeFactors>>() ;
for (int i = start ;
i < end – MAX_ITERATIONS ;
i += MAX_ITERATIONS) {
PrimeFactorsFinderRecursiveTask task =
new PrimeFactorsFinderRecursiveTask(
i, i + MAX_ITERATIONS) ;
task.fork() ;
pfsList.add(task) ;
}

for (ForkJoinTask<PrimeFactors> task : pfsList) {
PrimeFactors pfsElement = task.join() ;
pfs.add(pfsElement) ;
}
}

30% plus rapide…
Pièges du Fork / Join
La Java doc nous dit :
Computations should avoid
synchronized blocks or methods
Donc si une tâche a un état, cet état doit être
transmis aux sous-tâches par copie
Pièges du Fork / Join
La Java doc nous dit :
Computations should avoid
synchronized blocks or methods
Donc si une tâche a un état, cet état doit être
transmis aux sous-tâches par copie
Quelles conséquences sur les tableaux ?
Impossible avec le Fork / Join
Parallel Arrays
JDK 6 & 7
Parallel Arrays
Parallel Arrays : JSR 166y, package extra166y
Dispo en Java 6, embarque le Fork / Join
Inconvénient : en Java 7 on a 2 classes
ForkJoinPool, dans deux packages différents
Permet le calcul sur des tableaux de nombres (long ou
double)

http://g.oswego.edu/dl/concurrency-interest/
Parallel Arrays
Initialisation
ForkJoinPool pool = new ForkJoinPool() ; // package !

ParralelLongArray a = ParralelLongArray.create(pool) ;
Parallel Arrays
Map :
Ops.LongOp add2 = new Ops.LongOp() {
@Override
public long op(long l1) {
return l1 + 2 ;
}
} ;
a2 = a.withMapping(add2) ;
Parallel Arrays
Filter :
Ops.LongPredicate filter = new Ops.LongPredicate() {
@Override
public boolean op(long l1) {
return l1 > 50 ;
}
}
a2 = a.withFilter(filter) ;
a2.all() ;
Parallel Arrays
Reduce :
Ops.LongReducer reducer = new Ops.LongReducer() {
@Override
public long op(long l1, long l2) {
return l1 + l2 ;
}

}
long reducedValue = a.reduce(reducer, 0L) ;
Parallel Arrays
Idée :
1) On définit des opérations
2) On « pousse » ces opérations vers le
ParallelArrays, qui effectue le calcul, en
parallèle !
Approche qui ressemble à la
programmation fonctionnelle
Bilan pour les JDK 6 & 7
2 outils disponibles :
- Fork / Join, dans le JDK
- Les parallel arrays, API séparée
Pourquoi l’API Parallel Arrays
n’est-elle pas dans le JDK ?
Bicoze, dans le JDK 8,
on a les …
Et avec les lambdas…
… des nouveaux patterns arrivent !
Et avec les lambdas…
Map :
List<Personne> personnes = new ArrayList<>() ;

personnes.stream()
.map(person -> person.getAge())
Et avec les lambdas…
Filter :
List<Personne> personnes = new ArrayList<>() ;

personnes.stream()
.map(person -> person.getAge())
.filter(age -> age > 20)
Et avec les lambdas…
Reduce :
List<Personne> personnes = new ArrayList<>() ;
int somme =
personnes.stream()
.map(person -> person.getAge())
.filter(age -> age > 20)
.reduce(0, (a1, a2) -> a1 + a2) ;
Et avec les lambdas…
Et si on le veut en parallèle :
List<Personne> personnes = new ArrayList<>() ;
int somme =
personnes.parallelStream()
.map(person -> person.getAge())
.filter(age -> age > 20)
.reduce(0, (a1, a2) -> a1 + a2) ;
API Stream & Collector
Arrivée de deux API : Stream et Collector
Permettent tous les calculs imaginables sur
les collections de grande taille…
En parallèle !
Exemple : tri d’une liste
Stream<String> stream =
Stream.generate(
() ->
Long.toHexString(ThreadLocalRandom.current().nextLong())
) ;
Stream stream =
stream1
.map(s -> s.substring(0, 10))
.limit(10_000_000)
.sorted() ;

Object [] sorted = stream.toArray() ;

Exécution : 14 s
Exemple : tri d’une liste
Stream<String> stream =
Stream.generate(
() ->
Long.toHexString(ThreadLocalRandom.current().nextLong())
) ;
Stream stream =
stream1.parallel()
.map(s -> s.substring(0, 10))
.limit(10_000_000)
.sorted() ;

Object [] sorted = stream.toArray() ;

Exécution : 14 s
En parallèle : 3,5 s
Fork / Join, Lambdas

Comment utiliser ces outils efficacement ?
Utilisation
Malheureusement, il ne suffit pas d’appeler
parallel() pour que ça marche …
Problèmes
1) Écrire des réductions « correctes »
2) Régler « correctement » l’algorithmique
3) Utiliser des algorithmes « corrects »
1er problème : associativité
Une réduction doit être associative
red(a, red(b, c)) = red(red(a, b), c)
1er problème : associativité
Une réduction doit être associative
red(a, red(b, c)) = red(red(a, b), c)
a + (b + c) = (a + b) + c
Correct
1er problème : associativité
Une réduction doit être associative
red(a, red(b, c)) = red(red(a, b), c)
a + (b + c) = (a + b) + c
Correct
(a + (b + c)2)2 = ((a + b) 2 + c)2
Oops !
1er problème : associativité
Une réduction doit être associative
red(a, red(b, c)) = red(red(a, b), c)
a + (b + c) = (a + b) + c
Correct
(a + (b + c)2)2 = ((a + b) 2 + c)2
Oops !
Le compilateur ou la JVM vont-ils m’aider ?
2ème problème : performance
Le calcul parallèle est-il vraiment plus rapide ?
• Exemple : tri d’une liste de long
long begin = System.nanoTime() ;

List<String> hugeList = new ArrayList<>(N) ; // N = 16_000_000
for (int i = 0 ; i < N ; i++) {
long l = random.nextLong() ;
l = l > 0 ? l : -l ;
hugeList.add(Long.toString(l, 32)) ;
}
Tri en parallèle
Déroulement :
• Division de la liste en N sous-listes
• Tri de chaque liste sur un cœur : QuickSort
• Fusion des listes triés : MergeSort
Coût : calcul + déplacement des données de
cœur en cœur
Performances
2 stratégies de découpage :
• Boucle for
• Dyadique
• Tri avec Collections.sort
CPU Intel core i7, 8 cœurs
Performances
2 tableaux : 16M et 32M de long

4M

2M
1M

4M
2M
1M
Performances
1) La bonne taille du paquet

4M

13

2M

12

1M

20

4M
2M
1M
Performances
1) La bonne taille du paquet …
dépend de la taille du tableau !
4M

13

2M

12

1M

20

4M

33

2M

54

1M

93
Performances
2) La stratégie de division est importante !

4M

13

18

2M

12

20

1M

20

35

4M

33

2M

54

1M

93
Performances
2) La stratégie de division est importante !
et dépend de la taille du tableau !
4M

13

18

2M

12

20

1M

20

35

4M

33

47

2M

54

125

1M

93

211
MAIS…
4M

13

18

2M

12

20

1M

20

35

4M

33

47

2M

54

125

1M

93

211
Quelles sont les performances
sans parallélisation ?

4M

13

18

2M

12

20

1M

20

35

4M

33

47

2M

54

125

1M

93

211
16M

18

32M

36

4M

13

18

2M

12

20

1M

20

35

4M

33

47

2M

54

125

1M

93

211
Écrire du code parallèle
est complexe et coûteux
mais n’amène pas toujours
des gains en performance !
3ème problème
Une anecdote
• Le 24/2/2012, Heinz Kabutz défie
les lecteurs de son (excellent) blog Java
Specialists :
• Calculer les 10 premiers et 10 derniers chiffres
du nombre de Fibonacci d’indice 1 milliard
3ème problème
Nombre de Fibonacci
• F0 = 0, F1 = 1
• Fn = Fn – 1 + Fn – 2
F1_000_000 est un nombre trrrès grand !
3ème problème
Record à battre : 5800s (ou 2500 ?) sur un Core
i7 à 8 cœurs
3ème problème
Record à battre : 5800s (ou 2500 ?) sur un Core
i7 à 8 cœurs
1ère amélioration : 3300s sur 4 cœurs
3ème problème
Record à battre : 5800s (ou 2500 ?) sur un Core
i7 à 8 cœurs
1ère amélioration : 3300s sur 4 cœurs

2ème amélioration : 51s sur 1 cœur (pas de
parallélisation)
Où est le miracle ?
Pas de miracle…
- Utilisation de la librairie GNU GMP
- Utilisation d’une bonne implémentation de
BigInteger
- Meilleur algorithme de calcul des nombres de
Fibonacci
- Suppression de la récursivité
Où est le miracle ?
Pas de miracle…
- Utilisation de la librairie GNU GMP
- Utilisation d’une bonne implémentation de
BigInteger
- Meilleur algorithme de calcul des nombres de
Fibonacci
- Suppression de la récursivité

Quel rapport avec
le parallélisme ??
Algorithmes
Entre 1990 et 2005, l’optimisation linéaire a
gagné un facteur 43M
- 1k est du à la rapidité des processeurs
- 43k sont dus à celle des algorithmes
Avant de paralléliser
mieux vaut s’assurer
que l’on utilise
le bon algorithme
4ème problème
Étude de cas : le voyageur de commerce
Comment résoudre ce problème ?
4ème problème
Étude de cas : le voyageur de commerce
Comment résoudre ce problème
Pas d’algorithme direct, il nous faut une
approche « stochastique » (= avec de l’aléatoire)

Et c’est encore un problème de tableaux !
Comment paralléliser ?
Problème de tableau, donc facile !
• On coupe le tableau en morceaux
• On déroule sur chaque morceau
• Et on fusionne
Sauf que …
Ca ne marche pas !
• Les propriétés de convergence sont perdues
en parallèle
Sauf que …
Ca ne marche pas !
• Les propriétés de convergence sont perdues
en parallèle
Le code compile
Il s’exécute
Le résultat est faux…
Conclusion
Conclusion
• 1975 : le langage C permet de ne plus gérer la
pile à la main
Conclusion
• 1975 : le langage C permet de ne plus gérer la
pile à la main
• 1995 : Java permet de ne plus gérer la
mémoire à la main
Conclusion
• 1975 : le langage C permet de ne plus gérer la
pile à la main
• 1995 : Java permet de ne plus gérer la
mémoire à la main
• 2013 : Java (encore lui) permet de ne plus
gérer le multicœur à la main !
Conclusion
Aujourd’hui le CPU lui-même devient une
ressource parmi d’autres, au même titre que la
mémoire
Les applications vont pouvoir s’exécuter en
parallèle de façon transparente
Conclusion
Oui la parallélisation devient facile, comme elle
ne l’a jamais été
• On appele parallel(), et en voiture !
Conclusion
Oui la parallélisation devient facile, comme elle
ne l’a jamais été
• On appele parallel(), et en voiture !
Mais…
Conclusion
Oui la parallélisation devient facile, comme elle
ne l’a jamais été
• On appele parallel(), et en voiture !
Mais…
• Mon traitement est-il plus rapide ?
• Mes résultats sont-ils corrects ?
Conclusion
Il y a quelques années on disait :
« un bon programmeur doit apprendre un
nouveau langage tous les N mois / années »
Conclusion
Aujourd’hui mon conseil :
Conclusion
Aujourd’hui mon conseil :
• 1er mois : apprendre le fonctionnement
interne des CPU
Conclusion
Aujourd’hui mon conseil :
• 1er mois : apprendre le fonctionnement
interne des CPU
• 2ème mois : apprendre à programmer les
algorithmes complexes
Conclusion
Aujourd’hui mon conseil :
• 1er mois : apprendre le fonctionnement
interne des CPU
• 2ème mois : apprendre à programmer les
algorithmes complexes
• 3ème mois : apprendre la version parallèle de
ces algorithmes
Conclusion
La parallélisation des traitements / algorithmes
amène
- De nouvelles opportunités
- Des nouveaux problèmes
- De nouvelles catégories de bugs
Conclusion
La parallélisation des traitements / algorithmes
amène
- De nouvelles opportunités
- Des nouveaux problèmes
- De nouvelles catégories de bugs

Et donc de nouveaux challenges !
Merci !
Q/R

Contenu connexe

Tendances

50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8
José Paumard
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
tchappui
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
Ch'ti JUG
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
Laurent BUNIET
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
Patrick Allaert
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
Microsoft
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
MICHRAFY MUSTAFA
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
Microsoft
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
José Paumard
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
Damien Simonin Feugas
 
R fait du la tex
R fait du la texR fait du la tex
R fait du la tex
Cdiscount
 
Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Coat::Persistent at FPW2009
Coat::Persistent at FPW2009
Alexis Sukrieh
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
MICHRAFY MUSTAFA
 
Initiation r
Initiation rInitiation r
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
Pethrvs
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
José Paumard
 
TP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent PerceptionTP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent Perception
Said Benaissa
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016
François Sarradin
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec R
Laurent Beauguitte
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
Aurélien Regat-Barrel
 

Tendances (20)

50 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 850 nouvelles choses que l'on peut faire avec Java 8
50 nouvelles choses que l'on peut faire avec Java 8
 
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchronesAsyncio: offrez des tulipes à vos entrées sorties asynchrones
Asyncio: offrez des tulipes à vos entrées sorties asynchrones
 
Java 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambdaJava 8 : Un ch'ti peu de lambda
Java 8 : Un ch'ti peu de lambda
 
Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
 
Développer en natif avec C++11
Développer en natif avec C++11Développer en natif avec C++11
Développer en natif avec C++11
 
Scala : programmation fonctionnelle
Scala : programmation fonctionnelleScala : programmation fonctionnelle
Scala : programmation fonctionnelle
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
L'API Collector dans tous ses états
L'API Collector dans tous ses étatsL'API Collector dans tous ses états
L'API Collector dans tous ses états
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
R fait du la tex
R fait du la texR fait du la tex
R fait du la tex
 
Coat::Persistent at FPW2009
Coat::Persistent at FPW2009Coat::Persistent at FPW2009
Coat::Persistent at FPW2009
 
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...Interface fonctionnelle, Lambda expression, méthode par défaut,  référence de...
Interface fonctionnelle, Lambda expression, méthode par défaut, référence de...
 
Initiation r
Initiation rInitiation r
Initiation r
 
C++11 en 12 exemples simples
C++11 en 12 exemples simplesC++11 en 12 exemples simples
C++11 en 12 exemples simples
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
TP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent PerceptionTP3: Comportement Temps Réel de l'Agent Perception
TP3: Comportement Temps Réel de l'Agent Perception
 
Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016Java (8) eXperiments - DevoxxFR 2016
Java (8) eXperiments - DevoxxFR 2016
 
Introduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec RIntroduction à l'analyse de réseaux avec R
Introduction à l'analyse de réseaux avec R
 
Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14Les fonctions lambdas en C++11 et C++14
Les fonctions lambdas en C++11 et C++14
 

En vedette

WWF Fleischfrage: "Fleisch frisst Land"
WWF Fleischfrage: "Fleisch frisst Land"WWF Fleischfrage: "Fleisch frisst Land"
WWF Fleischfrage: "Fleisch frisst Land"
WWF Deutschland
 
Erfundenekalender
ErfundenekalenderErfundenekalender
Erfundenekalender
Axel Thiel
 
12 tendances en tourisme pour 2012
12 tendances en tourisme pour 201212 tendances en tourisme pour 2012
12 tendances en tourisme pour 2012Pierre Bellerose
 
Aquarela
AquarelaAquarela
Aquarela
LabAvilez
 
2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...
2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...
2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...topsoft - inspiring digital business
 
Respir@dom: un flux sécurisé des données.
Respir@dom: un flux sécurisé des données.Respir@dom: un flux sécurisé des données.
Respir@dom: un flux sécurisé des données.
RESEAU MORPHEE
 
Feu vert pour le lancement du premier service de porte-monnaie électronique m...
Feu vert pour le lancement du premier service de porte-monnaie électronique m...Feu vert pour le lancement du premier service de porte-monnaie électronique m...
Feu vert pour le lancement du premier service de porte-monnaie électronique m...VoilaHaiti
 
Wege zum lokalen Medien- und ICT-Konzept
Wege zum lokalen Medien-  und ICT-KonzeptWege zum lokalen Medien-  und ICT-Konzept
Wege zum lokalen Medien- und ICT-KonzeptJürg Fraefel
 
Umgestaltung der Platja de Palma. Integraler Aktionsplan
Umgestaltung der Platja de Palma. Integraler AktionsplanUmgestaltung der Platja de Palma. Integraler Aktionsplan
Umgestaltung der Platja de Palma. Integraler Aktionsplan
Platja de Palma
 
AT2010 Introduction à scrum
AT2010 Introduction à scrumAT2010 Introduction à scrum
AT2010 Introduction à scrum
Normandy JUG
 
Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...
Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...
Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...
Anouk Marchand Mooldijk
 
Module 4
Module 4Module 4
Module 4ISE
 
Le nouveau républicain 1
Le nouveau républicain 1Le nouveau républicain 1
Le nouveau républicain 1
sesostris
 
Cuecos! Capítulo Siete
Cuecos! Capítulo Siete Cuecos! Capítulo Siete
Cuecos! Capítulo Siete
Revulú
 
Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...
Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...
Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...
topsoft - inspiring digital business
 
Best of mensuel bowers & wilkins - mai2011
Best of mensuel   bowers & wilkins -  mai2011Best of mensuel   bowers & wilkins -  mai2011
Best of mensuel bowers & wilkins - mai2011B&W Group France
 

En vedette (20)

WWF Fleischfrage: "Fleisch frisst Land"
WWF Fleischfrage: "Fleisch frisst Land"WWF Fleischfrage: "Fleisch frisst Land"
WWF Fleischfrage: "Fleisch frisst Land"
 
Erfundenekalender
ErfundenekalenderErfundenekalender
Erfundenekalender
 
12 tendances en tourisme pour 2012
12 tendances en tourisme pour 201212 tendances en tourisme pour 2012
12 tendances en tourisme pour 2012
 
Aquarela
AquarelaAquarela
Aquarela
 
2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...
2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...
2011 05 10 09-15 Marcel Siegenthaler, schmid + siegenthaler consulting gmbh -...
 
Respir@dom: un flux sécurisé des données.
Respir@dom: un flux sécurisé des données.Respir@dom: un flux sécurisé des données.
Respir@dom: un flux sécurisé des données.
 
2011 05 10 15-15 topsoft_on_demand_de
2011 05 10 15-15 topsoft_on_demand_de2011 05 10 15-15 topsoft_on_demand_de
2011 05 10 15-15 topsoft_on_demand_de
 
2011 05 11 10-45 referat topsoft_resultate_umfrage_v2
2011 05 11 10-45 referat topsoft_resultate_umfrage_v22011 05 11 10-45 referat topsoft_resultate_umfrage_v2
2011 05 11 10-45 referat topsoft_resultate_umfrage_v2
 
Atelier2 presentation boonzai
Atelier2 presentation boonzaiAtelier2 presentation boonzai
Atelier2 presentation boonzai
 
Feu vert pour le lancement du premier service de porte-monnaie électronique m...
Feu vert pour le lancement du premier service de porte-monnaie électronique m...Feu vert pour le lancement du premier service de porte-monnaie électronique m...
Feu vert pour le lancement du premier service de porte-monnaie électronique m...
 
Referat
ReferatReferat
Referat
 
Wege zum lokalen Medien- und ICT-Konzept
Wege zum lokalen Medien-  und ICT-KonzeptWege zum lokalen Medien-  und ICT-Konzept
Wege zum lokalen Medien- und ICT-Konzept
 
Umgestaltung der Platja de Palma. Integraler Aktionsplan
Umgestaltung der Platja de Palma. Integraler AktionsplanUmgestaltung der Platja de Palma. Integraler Aktionsplan
Umgestaltung der Platja de Palma. Integraler Aktionsplan
 
AT2010 Introduction à scrum
AT2010 Introduction à scrumAT2010 Introduction à scrum
AT2010 Introduction à scrum
 
Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...
Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...
Ateliers Numeriques Office de Tourisme Vallée du Lot et du Vignoble Autmone H...
 
Module 4
Module 4Module 4
Module 4
 
Le nouveau républicain 1
Le nouveau républicain 1Le nouveau républicain 1
Le nouveau républicain 1
 
Cuecos! Capítulo Siete
Cuecos! Capítulo Siete Cuecos! Capítulo Siete
Cuecos! Capítulo Siete
 
Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...
Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...
Gute Auswertungen generieren Massnahmen – schlechte Auswertungen generieren P...
 
Best of mensuel bowers & wilkins - mai2011
Best of mensuel   bowers & wilkins -  mai2011Best of mensuel   bowers & wilkins -  mai2011
Best of mensuel bowers & wilkins - mai2011
 

Similaire à Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) facile ! - José paumard Codeurs en seine 2013

Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
Dr Samir A. ROUABHI
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
Yannick Chartois
 
Activity
ActivityActivity
Activitydido
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
Xavier MARIN
 
201305 - Lambda by R. Forax
201305 - Lambda by R. Forax201305 - Lambda by R. Forax
201305 - Lambda by R. Foraxlyonjug
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
Jean-Pierre Vincent
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScript
Habib Ayad
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf
Patiento Del Mar
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations GreendroidGDG Nantes
 
Cours de Matlab
Cours de MatlabCours de Matlab
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
Olivier Gutknecht
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
Franck SIMON
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
James RAVAILLE
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introOlivier Mallassi
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Alexandre Touret
 

Similaire à Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) facile ! - José paumard Codeurs en seine 2013 (20)

Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)Présentation Javascript à l'ESI (Alger)
Présentation Javascript à l'ESI (Alger)
 
Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8Les concepts de la programmation fonctionnelle illustrés avec java 8
Les concepts de la programmation fonctionnelle illustrés avec java 8
 
Activity
ActivityActivity
Activity
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
201305 - Lambda by R. Forax
201305 - Lambda by R. Forax201305 - Lambda by R. Forax
201305 - Lambda by R. Forax
 
Dijkstra kshortest
Dijkstra kshortestDijkstra kshortest
Dijkstra kshortest
 
Theme 7
Theme 7Theme 7
Theme 7
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScript
 
16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf16-Concurrence-APIs-Concurrentes.pdf
16-Concurrence-APIs-Concurrentes.pdf
 
Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015Spark - Ippevent 19-02-2015
Spark - Ippevent 19-02-2015
 
Android Optimisations Greendroid
Android Optimisations GreendroidAndroid Optimisations Greendroid
Android Optimisations Greendroid
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
Paris RailsCamp 2009
Paris RailsCamp 2009Paris RailsCamp 2009
Paris RailsCamp 2009
 
Java 8 - collections et stream
Java 8 - collections et streamJava 8 - collections et stream
Java 8 - collections et stream
 
C# 7 - Nouveautés
C# 7 - NouveautésC# 7 - Nouveautés
C# 7 - Nouveautés
 
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -introNosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
 
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
Checklist pour concevoir une application dans le cloud.10 conseils à l'attent...
 

Plus de Normandy JUG

Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...
Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...
Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...
Normandy JUG
 
Codeurs En Seine - Lean startup - Matthieu Garde-Lebreton
Codeurs En Seine - Lean startup - Matthieu Garde-LebretonCodeurs En Seine - Lean startup - Matthieu Garde-Lebreton
Codeurs En Seine - Lean startup - Matthieu Garde-Lebreton
Normandy JUG
 
What makes groovy groovy codeurs en seine - 2013 - light size
What makes groovy groovy   codeurs en seine - 2013 - light sizeWhat makes groovy groovy   codeurs en seine - 2013 - light size
What makes groovy groovy codeurs en seine - 2013 - light size
Normandy JUG
 
[Codeurs en seine] management & monitoring cloud
[Codeurs en seine] management & monitoring cloud[Codeurs en seine] management & monitoring cloud
[Codeurs en seine] management & monitoring cloud
Normandy JUG
 
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Normandy JUG
 
Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)
Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)
Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)
Normandy JUG
 
Soirée Ceylon avec Stéphane Epardaud
Soirée Ceylon avec Stéphane EpardaudSoirée Ceylon avec Stéphane Epardaud
Soirée Ceylon avec Stéphane Epardaud
Normandy JUG
 
Soirée Guava et Lombok avec Thierry Leriche
Soirée Guava et Lombok avec Thierry LericheSoirée Guava et Lombok avec Thierry Leriche
Soirée Guava et Lombok avec Thierry Leriche
Normandy JUG
 
Couche Base par Tugdual Grall
Couche Base par Tugdual GrallCouche Base par Tugdual Grall
Couche Base par Tugdual Grall
Normandy JUG
 
Java7 normandyjug
Java7 normandyjugJava7 normandyjug
Java7 normandyjug
Normandy JUG
 
Apache, osgi and karaf par Guillaume Nodet
Apache, osgi and karaf par Guillaume NodetApache, osgi and karaf par Guillaume Nodet
Apache, osgi and karaf par Guillaume Nodet
Normandy JUG
 
Mockito - Design + tests par Brice Duteil
Mockito - Design + tests par Brice DuteilMockito - Design + tests par Brice Duteil
Mockito - Design + tests par Brice Duteil
Normandy JUG
 
Annotations Java par Olivier Croisier
Annotations Java par Olivier CroisierAnnotations Java par Olivier Croisier
Annotations Java par Olivier Croisier
Normandy JUG
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011
Normandy JUG
 
ATR2011 - Planning poker
ATR2011 - Planning pokerATR2011 - Planning poker
ATR2011 - Planning poker
Normandy JUG
 
ATR2011 - Scrum dans les tranchées Normandes
ATR2011 - Scrum dans les tranchées NormandesATR2011 - Scrum dans les tranchées Normandes
ATR2011 - Scrum dans les tranchées Normandes
Normandy JUG
 
Hibernate vs le_cloud_computing
Hibernate vs le_cloud_computingHibernate vs le_cloud_computing
Hibernate vs le_cloud_computing
Normandy JUG
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
Normandy JUG
 
Git
GitGit
Soirée BPM - Introduction Logica
Soirée BPM - Introduction LogicaSoirée BPM - Introduction Logica
Soirée BPM - Introduction Logica
Normandy JUG
 

Plus de Normandy JUG (20)

Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...
Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...
Découvrez les bases de l’ergonomie web : donnez à vos utilisateurs le meilleu...
 
Codeurs En Seine - Lean startup - Matthieu Garde-Lebreton
Codeurs En Seine - Lean startup - Matthieu Garde-LebretonCodeurs En Seine - Lean startup - Matthieu Garde-Lebreton
Codeurs En Seine - Lean startup - Matthieu Garde-Lebreton
 
What makes groovy groovy codeurs en seine - 2013 - light size
What makes groovy groovy   codeurs en seine - 2013 - light sizeWhat makes groovy groovy   codeurs en seine - 2013 - light size
What makes groovy groovy codeurs en seine - 2013 - light size
 
[Codeurs en seine] management & monitoring cloud
[Codeurs en seine] management & monitoring cloud[Codeurs en seine] management & monitoring cloud
[Codeurs en seine] management & monitoring cloud
 
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
Capacity Planning : Pratiques et outils pour regarder la foudre tomber sans p...
 
Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)
Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)
Gatling : Faites tomber la foudre sur votre serveur ! (Stéphane Landelle)
 
Soirée Ceylon avec Stéphane Epardaud
Soirée Ceylon avec Stéphane EpardaudSoirée Ceylon avec Stéphane Epardaud
Soirée Ceylon avec Stéphane Epardaud
 
Soirée Guava et Lombok avec Thierry Leriche
Soirée Guava et Lombok avec Thierry LericheSoirée Guava et Lombok avec Thierry Leriche
Soirée Guava et Lombok avec Thierry Leriche
 
Couche Base par Tugdual Grall
Couche Base par Tugdual GrallCouche Base par Tugdual Grall
Couche Base par Tugdual Grall
 
Java7 normandyjug
Java7 normandyjugJava7 normandyjug
Java7 normandyjug
 
Apache, osgi and karaf par Guillaume Nodet
Apache, osgi and karaf par Guillaume NodetApache, osgi and karaf par Guillaume Nodet
Apache, osgi and karaf par Guillaume Nodet
 
Mockito - Design + tests par Brice Duteil
Mockito - Design + tests par Brice DuteilMockito - Design + tests par Brice Duteil
Mockito - Design + tests par Brice Duteil
 
Annotations Java par Olivier Croisier
Annotations Java par Olivier CroisierAnnotations Java par Olivier Croisier
Annotations Java par Olivier Croisier
 
Spring Batch 17-05-2011
Spring Batch 17-05-2011Spring Batch 17-05-2011
Spring Batch 17-05-2011
 
ATR2011 - Planning poker
ATR2011 - Planning pokerATR2011 - Planning poker
ATR2011 - Planning poker
 
ATR2011 - Scrum dans les tranchées Normandes
ATR2011 - Scrum dans les tranchées NormandesATR2011 - Scrum dans les tranchées Normandes
ATR2011 - Scrum dans les tranchées Normandes
 
Hibernate vs le_cloud_computing
Hibernate vs le_cloud_computingHibernate vs le_cloud_computing
Hibernate vs le_cloud_computing
 
HTML5 en projet
HTML5 en projetHTML5 en projet
HTML5 en projet
 
Git
GitGit
Git
 
Soirée BPM - Introduction Logica
Soirée BPM - Introduction LogicaSoirée BPM - Introduction Logica
Soirée BPM - Introduction Logica
 

Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) facile ! - José paumard Codeurs en seine 2013

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 13. Pourquoi développer des algorithmes parallèles ? Pourquoi développer des applications multithread ?
  • 14. Pourquoi développer des algorithmes parallèles ? = Pourquoi développer des applications multithread ?
  • 15. Pour exploiter la puissance des processeurs modernes.
  • 16. Depuis 2005 bla bla bla
  • 17. Depuis 2005 bla bla bla Conséquence :
  • 18. Il va falloir faire preuve d’intelligence pour écrire des applications performantes !
  • 19. Depuis 2005 Pour développer des applications perfomantes, il faut :
  • 20. Depuis 2005 Pour développer des applications perfomantes, il faut : 1) Ecrire des traitements multithreads 2) Programmer chaque traitement (algorithme) en parallèle
  • 21. Boite à outils 1) Ecrire des traitements multithreads : Java.util.concurrent 2) Programmer chaque traitement (algorithme) en parallèle ???
  • 22. Boite à outils Jusqu’en JDK 6 : rien…
  • 23. Boite à outils Jusqu’en JDK 6 : rien… À partir de JDK 7 : - Fork / Join - Parallel Arrays : rend le Fork / Join compatible JDK 6 À partir de JDK 8 : les lambdas !
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39. Que programme-t-on ? Initialisation du pool ForkJoinPool pool = new ForkJoinPool() ; PrimeFactorsFinderRecursiveTask task = new PrimeFactorsFinderRecursiveTask(1, 4000) ; ForkJoinTask<PrimeFactors> pfsTask = pool.submit(task) ; PrimeFactors pfs = pfsTask.get() ; // Eq join
  • 40. public class PrimeFactorsFinderRecursiveTask extends RecursiveTask<PrimeFactors> { private int start, end ; protected PrimeFactors compute() { PrimeFactors pfs = new PrimeFactors() ; if (end - start > MAX_ITERATIONS) { // I’m too big // processing ForkJoinTask<PrimeFactors> task = ... ; task.fork() ; PrimeFactors pfs = task.get() ; ... } else { ... } return pfs ; } }
  • 41. public class PrimeFactorsFinderRecursiveTaskSous-tâche extends RecursiveTask<PrimeFactors> { envoyée au pool private int start, end ; protected PrimeFactors compute() { PrimeFactors pfs = new PrimeFactors() ; if (end - start > MAX_ITERATIONS) { // I’m too big // processing ForkJoinTask<PrimeFactors> task = ... ; task.fork() ; PrimeFactors pfs = task.get() ; ... } else { ... } return pfs ; } }
  • 42. public class PrimeFactorsFinderRecursiveTask Appel à get() extends RecursiveTask<PrimeFactors> { bloquant private int start, end ; protected PrimeFactors compute() { PrimeFactors pfs = new PrimeFactors() ; if (end - start > MAX_ITERATIONS) { // I’m too big // processing ForkJoinTask<PrimeFactors> task = ... ; task.fork() ; PrimeFactors pfs = task.get() ; ... } else { ... } return pfs ; } }
  • 43. public class PrimeFactorsFinderRecursiveTask Calcul extends RecursiveTask<PrimeFactors> { proprement private int start, end ; dit protected PrimeFactors compute() { PrimeFactors pfs = new PrimeFactors() ; if (end - start > MAX_ITERATIONS) { // I’m too big // processing ForkJoinTask<PrimeFactors> task = ... ; task.fork() ; PrimeFactors pfs = task.get() ; ... } else { ... } return pfs ; } }
  • 44. Quelle stratégie de découpage ?
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51. Au niveau du code // 1ère strategie if (end - start > MAX_ITERATIONS) { // Trop gros ! int m = (start + end) / 2 ; PrimeFactorsFinderTask task1 = new PrimeFactorsFinderTask(start, m) ; PrimeFactorsFinderTask task2 = new PrimeFactorsFinderTask(m, end) ; task1.fork() ; task2.fork() ; PrimeFactors pfs1 = task1.join() ; PrimeFactors pfs2 = task2.join() ; pfs.add(pfs1) ; pfs.add(pfs2) ; }
  • 52. // 2ème strategie if (end - start > MAX_ITERATIONS) { // Trop gros ! List<ForkJoinTask<PrimeFactors>> pfsList = new ArrayList<ForkJoinTask<PrimeFactors>>() ; for (int i = start ; i < end – MAX_ITERATIONS ; i += MAX_ITERATIONS) { PrimeFactorsFinderRecursiveTask task = new PrimeFactorsFinderRecursiveTask( i, i + MAX_ITERATIONS) ; task.fork() ; pfsList.add(task) ; } for (ForkJoinTask<PrimeFactors> task : pfsList) { PrimeFactors pfsElement = task.join() ; pfs.add(pfsElement) ; } } 30% plus rapide…
  • 53. Pièges du Fork / Join La Java doc nous dit : Computations should avoid synchronized blocks or methods Donc si une tâche a un état, cet état doit être transmis aux sous-tâches par copie
  • 54. Pièges du Fork / Join La Java doc nous dit : Computations should avoid synchronized blocks or methods Donc si une tâche a un état, cet état doit être transmis aux sous-tâches par copie Quelles conséquences sur les tableaux ?
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61. Impossible avec le Fork / Join
  • 63. Parallel Arrays Parallel Arrays : JSR 166y, package extra166y Dispo en Java 6, embarque le Fork / Join Inconvénient : en Java 7 on a 2 classes ForkJoinPool, dans deux packages différents Permet le calcul sur des tableaux de nombres (long ou double) http://g.oswego.edu/dl/concurrency-interest/
  • 64. Parallel Arrays Initialisation ForkJoinPool pool = new ForkJoinPool() ; // package ! ParralelLongArray a = ParralelLongArray.create(pool) ;
  • 65. Parallel Arrays Map : Ops.LongOp add2 = new Ops.LongOp() { @Override public long op(long l1) { return l1 + 2 ; } } ; a2 = a.withMapping(add2) ;
  • 66. Parallel Arrays Filter : Ops.LongPredicate filter = new Ops.LongPredicate() { @Override public boolean op(long l1) { return l1 > 50 ; } } a2 = a.withFilter(filter) ; a2.all() ;
  • 67. Parallel Arrays Reduce : Ops.LongReducer reducer = new Ops.LongReducer() { @Override public long op(long l1, long l2) { return l1 + l2 ; } } long reducedValue = a.reduce(reducer, 0L) ;
  • 68. Parallel Arrays Idée : 1) On définit des opérations 2) On « pousse » ces opérations vers le ParallelArrays, qui effectue le calcul, en parallèle ! Approche qui ressemble à la programmation fonctionnelle
  • 69. Bilan pour les JDK 6 & 7 2 outils disponibles : - Fork / Join, dans le JDK - Les parallel arrays, API séparée
  • 70. Pourquoi l’API Parallel Arrays n’est-elle pas dans le JDK ?
  • 71. Bicoze, dans le JDK 8, on a les …
  • 72.
  • 73. Et avec les lambdas… … des nouveaux patterns arrivent !
  • 74. Et avec les lambdas… Map : List<Personne> personnes = new ArrayList<>() ; personnes.stream() .map(person -> person.getAge())
  • 75. Et avec les lambdas… Filter : List<Personne> personnes = new ArrayList<>() ; personnes.stream() .map(person -> person.getAge()) .filter(age -> age > 20)
  • 76. Et avec les lambdas… Reduce : List<Personne> personnes = new ArrayList<>() ; int somme = personnes.stream() .map(person -> person.getAge()) .filter(age -> age > 20) .reduce(0, (a1, a2) -> a1 + a2) ;
  • 77. Et avec les lambdas… Et si on le veut en parallèle : List<Personne> personnes = new ArrayList<>() ; int somme = personnes.parallelStream() .map(person -> person.getAge()) .filter(age -> age > 20) .reduce(0, (a1, a2) -> a1 + a2) ;
  • 78. API Stream & Collector Arrivée de deux API : Stream et Collector Permettent tous les calculs imaginables sur les collections de grande taille… En parallèle !
  • 79. Exemple : tri d’une liste Stream<String> stream = Stream.generate( () -> Long.toHexString(ThreadLocalRandom.current().nextLong()) ) ; Stream stream = stream1 .map(s -> s.substring(0, 10)) .limit(10_000_000) .sorted() ; Object [] sorted = stream.toArray() ; Exécution : 14 s
  • 80. Exemple : tri d’une liste Stream<String> stream = Stream.generate( () -> Long.toHexString(ThreadLocalRandom.current().nextLong()) ) ; Stream stream = stream1.parallel() .map(s -> s.substring(0, 10)) .limit(10_000_000) .sorted() ; Object [] sorted = stream.toArray() ; Exécution : 14 s En parallèle : 3,5 s
  • 81. Fork / Join, Lambdas Comment utiliser ces outils efficacement ?
  • 82. Utilisation Malheureusement, il ne suffit pas d’appeler parallel() pour que ça marche …
  • 83. Problèmes 1) Écrire des réductions « correctes » 2) Régler « correctement » l’algorithmique 3) Utiliser des algorithmes « corrects »
  • 84. 1er problème : associativité Une réduction doit être associative red(a, red(b, c)) = red(red(a, b), c)
  • 85. 1er problème : associativité Une réduction doit être associative red(a, red(b, c)) = red(red(a, b), c) a + (b + c) = (a + b) + c Correct
  • 86. 1er problème : associativité Une réduction doit être associative red(a, red(b, c)) = red(red(a, b), c) a + (b + c) = (a + b) + c Correct (a + (b + c)2)2 = ((a + b) 2 + c)2 Oops !
  • 87. 1er problème : associativité Une réduction doit être associative red(a, red(b, c)) = red(red(a, b), c) a + (b + c) = (a + b) + c Correct (a + (b + c)2)2 = ((a + b) 2 + c)2 Oops ! Le compilateur ou la JVM vont-ils m’aider ?
  • 88. 2ème problème : performance Le calcul parallèle est-il vraiment plus rapide ? • Exemple : tri d’une liste de long long begin = System.nanoTime() ; List<String> hugeList = new ArrayList<>(N) ; // N = 16_000_000 for (int i = 0 ; i < N ; i++) { long l = random.nextLong() ; l = l > 0 ? l : -l ; hugeList.add(Long.toString(l, 32)) ; }
  • 89. Tri en parallèle Déroulement : • Division de la liste en N sous-listes • Tri de chaque liste sur un cœur : QuickSort • Fusion des listes triés : MergeSort Coût : calcul + déplacement des données de cœur en cœur
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98. Performances 2 stratégies de découpage : • Boucle for • Dyadique • Tri avec Collections.sort CPU Intel core i7, 8 cœurs
  • 99. Performances 2 tableaux : 16M et 32M de long 4M 2M 1M 4M 2M 1M
  • 100. Performances 1) La bonne taille du paquet 4M 13 2M 12 1M 20 4M 2M 1M
  • 101. Performances 1) La bonne taille du paquet … dépend de la taille du tableau ! 4M 13 2M 12 1M 20 4M 33 2M 54 1M 93
  • 102. Performances 2) La stratégie de division est importante ! 4M 13 18 2M 12 20 1M 20 35 4M 33 2M 54 1M 93
  • 103. Performances 2) La stratégie de division est importante ! et dépend de la taille du tableau ! 4M 13 18 2M 12 20 1M 20 35 4M 33 47 2M 54 125 1M 93 211
  • 105. Quelles sont les performances sans parallélisation ? 4M 13 18 2M 12 20 1M 20 35 4M 33 47 2M 54 125 1M 93 211
  • 107. Écrire du code parallèle est complexe et coûteux mais n’amène pas toujours des gains en performance !
  • 108. 3ème problème Une anecdote • Le 24/2/2012, Heinz Kabutz défie les lecteurs de son (excellent) blog Java Specialists : • Calculer les 10 premiers et 10 derniers chiffres du nombre de Fibonacci d’indice 1 milliard
  • 109. 3ème problème Nombre de Fibonacci • F0 = 0, F1 = 1 • Fn = Fn – 1 + Fn – 2 F1_000_000 est un nombre trrrès grand !
  • 110. 3ème problème Record à battre : 5800s (ou 2500 ?) sur un Core i7 à 8 cœurs
  • 111. 3ème problème Record à battre : 5800s (ou 2500 ?) sur un Core i7 à 8 cœurs 1ère amélioration : 3300s sur 4 cœurs
  • 112. 3ème problème Record à battre : 5800s (ou 2500 ?) sur un Core i7 à 8 cœurs 1ère amélioration : 3300s sur 4 cœurs 2ème amélioration : 51s sur 1 cœur (pas de parallélisation)
  • 113. Où est le miracle ? Pas de miracle… - Utilisation de la librairie GNU GMP - Utilisation d’une bonne implémentation de BigInteger - Meilleur algorithme de calcul des nombres de Fibonacci - Suppression de la récursivité
  • 114. Où est le miracle ? Pas de miracle… - Utilisation de la librairie GNU GMP - Utilisation d’une bonne implémentation de BigInteger - Meilleur algorithme de calcul des nombres de Fibonacci - Suppression de la récursivité Quel rapport avec le parallélisme ??
  • 115. Algorithmes Entre 1990 et 2005, l’optimisation linéaire a gagné un facteur 43M - 1k est du à la rapidité des processeurs - 43k sont dus à celle des algorithmes
  • 116. Avant de paralléliser mieux vaut s’assurer que l’on utilise le bon algorithme
  • 117. 4ème problème Étude de cas : le voyageur de commerce Comment résoudre ce problème ?
  • 118. 4ème problème Étude de cas : le voyageur de commerce Comment résoudre ce problème Pas d’algorithme direct, il nous faut une approche « stochastique » (= avec de l’aléatoire) Et c’est encore un problème de tableaux !
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134. Comment paralléliser ? Problème de tableau, donc facile ! • On coupe le tableau en morceaux • On déroule sur chaque morceau • Et on fusionne
  • 135. Sauf que … Ca ne marche pas ! • Les propriétés de convergence sont perdues en parallèle
  • 136. Sauf que … Ca ne marche pas ! • Les propriétés de convergence sont perdues en parallèle Le code compile Il s’exécute Le résultat est faux…
  • 138. Conclusion • 1975 : le langage C permet de ne plus gérer la pile à la main
  • 139. Conclusion • 1975 : le langage C permet de ne plus gérer la pile à la main • 1995 : Java permet de ne plus gérer la mémoire à la main
  • 140. Conclusion • 1975 : le langage C permet de ne plus gérer la pile à la main • 1995 : Java permet de ne plus gérer la mémoire à la main • 2013 : Java (encore lui) permet de ne plus gérer le multicœur à la main !
  • 141. Conclusion Aujourd’hui le CPU lui-même devient une ressource parmi d’autres, au même titre que la mémoire Les applications vont pouvoir s’exécuter en parallèle de façon transparente
  • 142. Conclusion Oui la parallélisation devient facile, comme elle ne l’a jamais été • On appele parallel(), et en voiture !
  • 143. Conclusion Oui la parallélisation devient facile, comme elle ne l’a jamais été • On appele parallel(), et en voiture ! Mais…
  • 144. Conclusion Oui la parallélisation devient facile, comme elle ne l’a jamais été • On appele parallel(), et en voiture ! Mais… • Mon traitement est-il plus rapide ? • Mes résultats sont-ils corrects ?
  • 145. Conclusion Il y a quelques années on disait : « un bon programmeur doit apprendre un nouveau langage tous les N mois / années »
  • 147. Conclusion Aujourd’hui mon conseil : • 1er mois : apprendre le fonctionnement interne des CPU
  • 148. Conclusion Aujourd’hui mon conseil : • 1er mois : apprendre le fonctionnement interne des CPU • 2ème mois : apprendre à programmer les algorithmes complexes
  • 149. Conclusion Aujourd’hui mon conseil : • 1er mois : apprendre le fonctionnement interne des CPU • 2ème mois : apprendre à programmer les algorithmes complexes • 3ème mois : apprendre la version parallèle de ces algorithmes
  • 150. Conclusion La parallélisation des traitements / algorithmes amène - De nouvelles opportunités - Des nouveaux problèmes - De nouvelles catégories de bugs
  • 151. Conclusion La parallélisation des traitements / algorithmes amène - De nouvelles opportunités - Des nouveaux problèmes - De nouvelles catégories de bugs Et donc de nouveaux challenges !
  • 153. Q/R