SlideShare a Scribd company logo
Fork/Join Framework。
         そして Lambda へ。




               Java in the Box
               櫻庭 祐一
Java には信頼性の高い
並行プログラムを構築するのに使える
  構成要素がある
            Java: The Good Parts
            10 章より引用
1994 Java 1.0α Thread
               Runnable
2004 J2SE 5.0 JSR 166
                Concurrency Utilities
1994 Java 1.0α Thread
 Concurrent    Runnable
2004 J2SE 5.0 JSR 166
                Concurrency Utilities




                  Parallel
トランジスタ数


          周波数
                消費電力
トランジスタ数


          周波数
                消費電力
2004 UltraSPARC IV

2006 Core2 Extream

2009 Nehalem-EX

2010 Opteron 6100

2010 SPARC T3


Intel SCC
SingleCore 時代の Software




MultiCore 時代の Software
JSR166 Executor
                   同期
Core 1

Core 2

Core 3

Core 4
JSR166y Fork/Join Framework
                               同期
Core 1

Core 2

Core 3

Core 4
分割統治法
分割統治法
フィボナッチ数列                    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);
  }
分割統治法
フィボナッチ数列                       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();
     }
 }
Work Stealing
                                Task
          両端キュー Deque
Worker1
                           Comp        Fork

                          Comp     Fork


Worker2                  Comp    Fork

                        Comp    Fork

  ソート 検索
  数値計算
  行列操作
  枝狩り et al.
内部イテレータ

  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 }     並行処理可
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);
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);
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
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
extra166y ParallelArray

  Integer[] numbers = ...;
  ForkJoinPool pool = new ForkJoinPool();

  ParallelArray<Integer> array
      = ParallelArray.createFromCopy(numbers, pool);

  array.withMapping(#{Integer num -> num * 2});
Multicore Era
   Thread/Executor

                JSR 166y
                Fork/Join Framework
Work Stealing
                     extra166y
  内部イテレータ

JSR 335               もっと簡単に!
Project Lambda
Tips
             時間のかかる処理はしない
         キャッシュを考慮する



  参考 ITpro Java SE 7 徹底理解
  No.2 細粒度の並行処理 - Fork/Join Framework
No.3 Fork/Join Framework から Project Lambda へ
Fork/Join Framework。
       そして Lambda へ。

            Java in the Box
            櫻庭 祐一

More Related Content

PDF
Emcjp item21
PDF
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
PDF
おいしいLisp
PDF
Functional Way
PDF
C++14 Overview
PDF
Cloud TPU Driver API ソースコード解析
PPTX
Brief introduction of Boost.ICL
PDF
Tensorflow dynamically loadable XLA plugin ソースコード解析
Emcjp item21
TensorFlow XLA 「XLAとは、から、最近の利用事例について」
おいしいLisp
Functional Way
C++14 Overview
Cloud TPU Driver API ソースコード解析
Brief introduction of Boost.ICL
Tensorflow dynamically loadable XLA plugin ソースコード解析

What's hot (20)

PDF
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
PDF
Effective Modern C++ 読書会 Item 35
PDF
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
KEY
Sml#探検隊
PDF
組み込みでこそC++を使う10の理由
PDF
Emcpp item31
PPTX
Visual C++で使えるC++11
PDF
研究生のためのC++ no.2
PDF
命令プログラミングから関数プログラミングへ
PDF
Subprocess no susume
PDF
templateとautoの型推論
PDF
ALPSチュートリアル(4) Python入門
PDF
Python で munin plugin を書いてみる
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
boost tour 1.48.0 all
PDF
ゲーム開発者のための C++11/C++14
PPTX
Scalamacrosについて
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
ナウなヤングにバカうけのイカしたタグ付き共用体
Effective Modern C++ 読書会 Item 35
プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
Sml#探検隊
組み込みでこそC++を使う10の理由
Emcpp item31
Visual C++で使えるC++11
研究生のためのC++ no.2
命令プログラミングから関数プログラミングへ
Subprocess no susume
templateとautoの型推論
ALPSチュートリアル(4) Python入門
Python で munin plugin を書いてみる
BoostAsioで可読性を求めるのは間違っているだろうか
boost tour 1.48.0 all
ゲーム開発者のための C++11/C++14
Scalamacrosについて
Ad

Viewers also liked (20)

KEY
MTDDC 2010.2.5 Tokyo - Brand new API
PDF
Novelties in Java EE 7: JAX-RS 2.0 + IPT REST HATEOAS Polling Demo @ BGOUG Co...
PDF
Data API ことはじめ
PPTX
Introducing C# in AWS Lambda
PDF
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
PDF
20161111 java one2016-feedback
PDF
Going Serverless, Building Applications with No Servers
PDF
Introduction to AWS X-Ray
PDF
Awsで作るビッグデータ解析今とこれから
PDF
AWSのサーバレス関連アップデートを10分で紹介します
PDF
デモから見るOpenWhisk - Docker Action -
PDF
Serverless meetup02 openwhisk
PDF
The Internal of Serverless Plugins
PDF
What's new with Serverless
PPTX
CRM分析サービス crm analyzer expressを 支えるサーバレスな色々
PDF
Salesforce Einstein - SaaS企業のAI戦略とテクノロジ -
PDF
Serverless Revolution
PDF
Serverless Architecture on AWS(20151023版)
PDF
スタートアップがグローバルなシステムを作るために、積極的にサーバーレスに取り組んでみた話 / Serverless Meetup Sapporo
PDF
Introducing Amazon Rekognition, Amazon Polly and Amazon Lex
MTDDC 2010.2.5 Tokyo - Brand new API
Novelties in Java EE 7: JAX-RS 2.0 + IPT REST HATEOAS Polling Demo @ BGOUG Co...
Data API ことはじめ
Introducing C# in AWS Lambda
Running Java Apps with Amazon EC2, AWS Elastic Beanstalk or Serverless
20161111 java one2016-feedback
Going Serverless, Building Applications with No Servers
Introduction to AWS X-Ray
Awsで作るビッグデータ解析今とこれから
AWSのサーバレス関連アップデートを10分で紹介します
デモから見るOpenWhisk - Docker Action -
Serverless meetup02 openwhisk
The Internal of Serverless Plugins
What's new with Serverless
CRM分析サービス crm analyzer expressを 支えるサーバレスな色々
Salesforce Einstein - SaaS企業のAI戦略とテクノロジ -
Serverless Revolution
Serverless Architecture on AWS(20151023版)
スタートアップがグローバルなシステムを作るために、積極的にサーバーレスに取り組んでみた話 / Serverless Meetup Sapporo
Introducing Amazon Rekognition, Amazon Polly and Amazon Lex
Ad

Similar to Fork/Join Framework。そしてLambdaへ。 (20)

PDF
Rの高速化
PDF
Replace Output Iterator and Extend Range JP
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PDF
たのしい関数型
PPTX
関数型言語&形式的手法セミナー(3)
PDF
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
PPTX
Prosym2012
PDF
Python physicalcomputing
PDF
Project Loom + Project Panama
PDF
ATN No.2 Scala事始め
PPTX
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PDF
PostgreSQL - C言語によるユーザ定義関数の作り方
PPTX
Java Puzzlers JJUG CCC 2016
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
PPTX
ぱっと見でわかるC++11
PDF
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
PDF
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
PDF
Ylug 110th kpatch code reading
PPTX
T69 c++cli ネイティブライブラリラッピング入門
PDF
第三回ありえる社内勉強会 「いわががのLombok」
Rの高速化
Replace Output Iterator and Extend Range JP
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
たのしい関数型
関数型言語&形式的手法セミナー(3)
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
Prosym2012
Python physicalcomputing
Project Loom + Project Panama
ATN No.2 Scala事始め
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
PostgreSQL - C言語によるユーザ定義関数の作り方
Java Puzzlers JJUG CCC 2016
C++コンパイラ GCCとClangからのメッセージをお読みください
ぱっと見でわかるC++11
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
Ylug 110th kpatch code reading
T69 c++cli ネイティブライブラリラッピング入門
第三回ありえる社内勉強会 「いわががのLombok」

More from Yuichi Sakuraba (20)

PDF
Vector API - Javaによるベクターコンピューティング
PDF
Oracle Code One - Java KeynoteとJava SE
PDF
Project Loom - 限定継続と軽量スレッド -
PDF
Oracle Code One 報告会 Java SE Update
PDF
今こそStream API入門
PDF
Oracle Code One 報告会 Java SE Update
PDF
Learn Language 2018 Java Language Update
PDF
Dockerに向けて、Javaもダイエット
PDF
What's New in Java
PDF
Migration Guide to Java SE 10, and also Java SE 11
PDF
琥珀色のJava - Project Amber -
PDF
Moving to Module: Issues & Solutions
PDF
モジュール移行の課題と対策
PDF
Project Jigsawと、ちょっとだけVector API
PDF
Java SE 9の全貌
PDF
Java SEの現在、過去 そして未来
PDF
Java SE 9 のススメ
PDF
Introduction of Project Jigsaw
PDF
Encouragement of Java SE 9
PDF
Javaで和暦と元号
Vector API - Javaによるベクターコンピューティング
Oracle Code One - Java KeynoteとJava SE
Project Loom - 限定継続と軽量スレッド -
Oracle Code One 報告会 Java SE Update
今こそStream API入門
Oracle Code One 報告会 Java SE Update
Learn Language 2018 Java Language Update
Dockerに向けて、Javaもダイエット
What's New in Java
Migration Guide to Java SE 10, and also Java SE 11
琥珀色のJava - Project Amber -
Moving to Module: Issues & Solutions
モジュール移行の課題と対策
Project Jigsawと、ちょっとだけVector API
Java SE 9の全貌
Java SEの現在、過去 そして未来
Java SE 9 のススメ
Introduction of Project Jigsaw
Encouragement of Java SE 9
Javaで和暦と元号

Fork/Join Framework。そしてLambdaへ。

  • 1. Fork/Join Framework。 そして Lambda へ。 Java in the Box 櫻庭 祐一
  • 2. Java には信頼性の高い 並行プログラムを構築するのに使える 構成要素がある Java: The Good Parts 10 章より引用
  • 3. 1994 Java 1.0α Thread Runnable 2004 J2SE 5.0 JSR 166 Concurrency Utilities
  • 4. 1994 Java 1.0α Thread Concurrent Runnable 2004 J2SE 5.0 JSR 166 Concurrency Utilities Parallel
  • 5. トランジスタ数 周波数 消費電力
  • 6. トランジスタ数 周波数 消費電力
  • 7. 2004 UltraSPARC IV 2006 Core2 Extream 2009 Nehalem-EX 2010 Opteron 6100 2010 SPARC T3 Intel SCC
  • 9. JSR166 Executor 同期 Core 1 Core 2 Core 3 Core 4
  • 10. JSR166y Fork/Join Framework 同期 Core 1 Core 2 Core 3 Core 4
  • 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. 分割統治法 フィボナッチ数列 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. Work Stealing Task 両端キュー Deque Worker1 Comp Fork Comp Fork Worker2 Comp Fork Comp Fork ソート 検索 数値計算 行列操作 枝狩り et al.
  • 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. 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. 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. 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. 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. extra166y ParallelArray Integer[] numbers = ...; ForkJoinPool pool = new ForkJoinPool(); ParallelArray<Integer> array = ParallelArray.createFromCopy(numbers, pool); array.withMapping(#{Integer num -> num * 2});
  • 21. Multicore Era Thread/Executor JSR 166y Fork/Join Framework Work Stealing extra166y 内部イテレータ JSR 335 もっと簡単に! Project Lambda
  • 22. Tips 時間のかかる処理はしない キャッシュを考慮する 参考 ITpro Java SE 7 徹底理解 No.2 細粒度の並行処理 - Fork/Join Framework No.3 Fork/Join Framework から Project Lambda へ
  • 23. Fork/Join Framework。 そして Lambda へ。 Java in the Box 櫻庭 祐一