14

Click here to load reader

Fork/Join Framework

Embed Size (px)

Citation preview

Page 1: Fork/Join Framework

Fork/Join Framework

大崎 瑶

Page 2: Fork/Join Framework

なぜ? Fork/Join

• 並行性と並列性• 並列性を上げるには?• Work Stealing アルゴリズム

Page 3: Fork/Join Framework

並行性と並列性• 並行性とは– プログラムが論理的に並行実行可能な状態– プリエンプティブなスレッドのこと

• 並列性とは– 並行性を持つプログラムが時間的に並列に実

行されること

ものすごいオレオレ解釈だし、もうちょっと厳密な定義がありそうな気がしますが・・・

Page 4: Fork/Join Framework

並行性ポイントは 2つプリエンプティブである(割り込みが可能)

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

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

変数 同じ変数への同時のアクセスを制限する仕組みを持っている

Page 5: Fork/Join Framework

並行性の例IO 待ちが発生

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

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

Page 6: Fork/Join Framework

並列性並行性をもつプログラムが時系列的に並列に動作する

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

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

並列性があるほうが実行時間が短い

複数の CPU/Core で実行される

Page 7: Fork/Join Framework

並列性を上げるには?• 並列性を下げる要因 = スレッドの同期処理– クリティカルセクション– 待ち合わせ– 並列度( Core 数、スレッド数)

Fork/Join Framework が解決しようとしているのはこれ!

Page 8: Fork/Join Framework

Executor では…

クリティカルパス

赤いとこ全部待ち時間

Page 9: Fork/Join Framework

細粒度のタスク

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

そこで Fork/Join Framework ですよ!!!

Page 10: Fork/Join Framework

タスクの細分化タスクを細分化するには分割統治法

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

Fork/Join Framework

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

分割統治といえば誰もがアルゴリズムの教科書で最初に習う再帰処理ですよね!!!

Page 11: Fork/Join Framework

サンプル(フィボナッチ数)

http://itpro.nikkeibp.co.jp/article/COLUMN/20110527/360769/?ST=develop&P=3

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

Page 12: Fork/Join Framework

Work Stealing アルゴリズム

CPU1

CPU2

CPU3

CPU4

分割統治アルゴリズム

分割(Fork)

統治(Join)

タスクキュー( Deque)

PushFork

Pop

Steal

Page 13: Fork/Join Framework

ParallelAray

http://itpro.nikkeibp.co.jp/article/COLUMN/20110627/361738/?ST=develop&P=4

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

extra166y では ParallelArray が提案されています。 (Java8 で登場 )

Page 14: Fork/Join Framework

まとめ• Fork/Join Framework は細粒度のタスクを並

列に実行するのに適しています。– Work Stealing アルゴリズム

• タスクを細粒度に分割するには分割統治アルゴリズムがあります。

• Java8 では ParallelArray も登場。• ParallelArray は Lambda によって使いやす

くなる。