Fork/Join Framework。そしてLambdaへ。

6,686 views

Published on

Published in: Technology, News & Politics
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,686
On SlideShare
0
From Embeds
0
Number of Embeds
2,922
Actions
Shares
0
Downloads
32
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Fork/Join Framework。そしてLambdaへ。

  1. 1. Fork/Join Framework。 そして Lambda へ。 Java in the Box 櫻庭 祐一
  2. 2. Java には信頼性の高い並行プログラムを構築するのに使える 構成要素がある Java: The Good Parts 10 章より引用
  3. 3. 1994 Java 1.0α Thread Runnable2004 J2SE 5.0 JSR 166 Concurrency Utilities
  4. 4. 1994 Java 1.0α Thread Concurrent Runnable2004 J2SE 5.0 JSR 166 Concurrency Utilities Parallel
  5. 5. トランジスタ数 周波数 消費電力
  6. 6. トランジスタ数 周波数 消費電力
  7. 7. 2004 UltraSPARC IV2006 Core2 Extream2009 Nehalem-EX2010 Opteron 61002010 SPARC T3Intel SCC
  8. 8. SingleCore 時代の SoftwareMultiCore 時代の Software
  9. 9. JSR166 Executor 同期Core 1Core 2Core 3Core 4
  10. 10. JSR166y Fork/Join Framework 同期Core 1Core 2Core 3Core 4
  11. 11. 分割統治法
  12. 12. 分割統治法フィボナッチ数列 F0 = 0, F1 = 1 Fn = Fn-1+ Fn-2 public int compute(int n) { if (n <= 1) { return n; } return compute(n-1) + compute(n-2); }
  13. 13. 分割統治法フィボナッチ数列 F0 = 0, F1 = 1 Fn = Fn-1+ Fn-2 class FibonacciTask extends RecursiveTask<Integer> { private final int n; FibonacciTask(int n) { this.n = n; } protected Integer compute() { if (n <= 1) { return n; } FibonacciTask f1 = new FibonacciTask(n - 1); f1.fork(); FibonacciTask f2 = new FibonacciTask(n - 2); return f2.compute() + f1.join(); } }
  14. 14. Work Stealing Task 両端キュー DequeWorker1 Comp Fork Comp ForkWorker2 Comp Fork Comp Fork ソート 検索 数値計算 行列操作 枝狩り et al.
  15. 15. 内部イテレータ Java List<Integer> numbers = ...; for (int i = 0; i < numbers.size(); i++) { numbers.set(i, numbers.get(i) * 2); } Groovy def numbers = ... 独立 numbers.collect { it * 2 } 並行処理可
  16. 16. extra166y ParallelArray Integer[] numbers = ...; ForkJoinPool pool = new ForkJoinPool(); ParallelArray<Integer> array = ParallelArray.createFromCopy(numbers, pool); Ops.Op<Integer, Integer> doubler = new Ops.Op<>() { @Override public Integer op(Integer x) { return x * 2; } }; array.withMapping(doubler);
  17. 17. extra166y ParallelArray Integer[] numbers = ...; ForkJoinPool pool = new ForkJoinPool(); ParallelArray<Integer> array = ParallelArray.createFromCopy(numbers, pool); Ops.Op<Integer, Integer> doubler = new Ops.Op<>() { @Override public Integer op(Integer x) { return x * 2; } }; array.withMapping(doubler);
  18. 18. extra166y ParallelArray Integer[] numbers = ...; ForkJoinPool pool = new ForkJoinPool(); ParallelArray<Integer> array = ParallelArray.createFromCopy(numbers, pool); Ops.Op<Integer, Integer> doubler = #{Integer num -> num * 2}; array.withMapping(doubler); ラムダ式 Project Lambda
  19. 19. extra166y ParallelArray Integer[] numbers = ...; ForkJoinPool pool = new ForkJoinPool(); ParallelArray<Integer> array = ParallelArray.createFromCopy(numbers, pool); Ops.Op<Integer, Integer> doubler = #{Integer num -> num * 2}; array.withMapping(doubler); ラムダ式 Project Lambda
  20. 20. extra166y ParallelArray Integer[] numbers = ...; ForkJoinPool pool = new ForkJoinPool(); ParallelArray<Integer> array = ParallelArray.createFromCopy(numbers, pool); array.withMapping(#{Integer num -> num * 2});
  21. 21. Multicore Era Thread/Executor JSR 166y Fork/Join FrameworkWork Stealing extra166y 内部イテレータJSR 335 もっと簡単に!Project Lambda
  22. 22. Tips 時間のかかる処理はしない キャッシュを考慮する 参考 ITpro Java SE 7 徹底理解 No.2 細粒度の並行処理 - Fork/Join FrameworkNo.3 Fork/Join Framework から Project Lambda へ
  23. 23. Fork/Join Framework。 そして Lambda へ。 Java in the Box 櫻庭 祐一

×