Fork/Join Framework

      大崎 瑶
なぜ?Fork/Join
• 並行性と並列性
• 並列性を上げるには?
• Work Stealingアルゴリズム
並行性と並列性
• 並行性とは
 – プログラムが論理的に並行実行可能な状態
 – プリエンプティブなスレッドのこと
• 並列性とは
 – 並行性を持つプログラムが時間的に並列に実
   行されること

 ものすごいオレオレ解釈だし、もうちょっと厳密な定義がありそうな
 気がしますが・・・
並行性
ポイントは2つ
 プリエンプティブである(割り込みが可能)




           この間に別のことが割り込める


  メモリリソース(変数)を共有する


          変数    同じ変数への同時のアクセスを制限する仕組みを持っている
並行性の例
         IO待ちが発生




           CPUが遊んでいる間に
            ほかのことが出来る




GUIのプログラミングでは並行動作するように設計するのが
基本
(でないと、IO待ちで操作がブロックされてしまう)
並列性
並行性をもつプログラムが時系列的に並列に動作する

 並行性のあるプログラムの          複数のCPU/Coreで実行される
 並列実行




                            並行性のあるプログラムの
                            非並列実行

                並列性があるほうが
                実行時間が短い
並列性を上げるには?
• 並列性を下げる要因 =         スレッドの同期処理
 – クリティカルセクション
 – 待ち合わせ
                  Fork/Join Frameworkが
 – 並列度(Core数、スレッド数)
                  解決しようとしているのはこ
                      れ!
Executorでは…

         クリティカルパス




        赤いとこ全部待ち時間
細粒度のタスク




細粒度のタスクをうまくCPU/Coreに割り振ってあげれば
効率的に使うことが出来る。
でも、Executorではそれを自分でうまくスケジューリングして
あげなければならないし、オーバーヘッドも大きい



そこで Fork/Join Framework ですよ!!!
タスクの細分化
タスクを細分化するには分割統治法

         あのフィボナッチだって、クイックソートだって
         分割統治



 Fork/Join Framework

   java.util.concurrent.RecursiveTask<V>
   java.util.concurrent.RecursiveAction

    分割統治といえば誰もがアルゴリズムの教科書で最初に習う
    再帰処理ですよね!!!
サンプル(フィボナッチ数)

サクラバ大先生の連載から拝借




http://itpro.nikkeibp.co.jp/article/COLUMN/20110527/360769/?ST=de
velop&P=3
Work Stealingアルゴリズム
分割統治アルゴリズム

                                   分割
                                   (Fork)

                                   統治
                                   (Join)



                   タスクキュー(Deque)
            Pop
CPU1
       Fork Push
CPU2
CPU3
                          Steal
CPU4
ParallelAray
extra166yではParallelArrayが提案されています。(Java8で登場)


またまたサンプルを拝借して…




http://itpro.nikkeibp.co.jp/article/COLUMN/20110627/361738/?ST=d
evelop&P=4
まとめ
• Fork/Join Frameworkは細粒度のタスクを並
  列に実行するのに適しています。
 – Work Stealingアルゴリズム
• タスクを細粒度に分割するには分割統治
  アルゴリズムがあります。
• Java8ではParallelArrayも登場。
• ParallelArrayはLambdaによって使いやすく
  なる。

Fork/Join Framework