Click here to load reader
Upload
appresso-engineering-team
View
954
Download
0
Embed Size (px)
Citation preview
Fork/Join Framework
大崎 瑶
なぜ? Fork/Join
• 並行性と並列性• 並列性を上げるには?• Work Stealing アルゴリズム
並行性と並列性• 並行性とは– プログラムが論理的に並行実行可能な状態– プリエンプティブなスレッドのこと
• 並列性とは– 並行性を持つプログラムが時間的に並列に実
行されること
ものすごいオレオレ解釈だし、もうちょっと厳密な定義がありそうな気がしますが・・・
並行性ポイントは 2つプリエンプティブである(割り込みが可能)
メモリリソース(変数)を共有する
この間に別のことが割り込める
変数 同じ変数への同時のアクセスを制限する仕組みを持っている
並行性の例IO 待ちが発生
CPU が遊んでいる間にほかのことが出来る
GUI のプログラミングでは並行動作するように設計するのが基本(でないと、 IO 待ちで操作がブロックされてしまう)
並列性並行性をもつプログラムが時系列的に並列に動作する
並行性のあるプログラムの並列実行
並行性のあるプログラムの非並列実行
並列性があるほうが実行時間が短い
複数の CPU/Core で実行される
並列性を上げるには?• 並列性を下げる要因 = スレッドの同期処理– クリティカルセクション– 待ち合わせ– 並列度( Core 数、スレッド数)
Fork/Join Framework が解決しようとしているのはこれ!
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=develop&P=3
サクラバ大先生の連載から拝借
Work Stealing アルゴリズム
CPU1
CPU2
CPU3
CPU4
分割統治アルゴリズム
分割(Fork)
統治(Join)
タスクキュー( Deque)
PushFork
Pop
Steal
ParallelAray
http://itpro.nikkeibp.co.jp/article/COLUMN/20110627/361738/?ST=develop&P=4
またまたサンプルを拝借して…
extra166y では ParallelArray が提案されています。 (Java8 で登場 )
まとめ• Fork/Join Framework は細粒度のタスクを並
列に実行するのに適しています。– Work Stealing アルゴリズム
• タスクを細粒度に分割するには分割統治アルゴリズムがあります。
• Java8 では ParallelArray も登場。• ParallelArray は Lambda によって使いやす
くなる。