Haskell による並列・並行プログラミング #5 担当: waddlawさん
p.70 4.3 例:会議の時間割
国際会議のタイムテーブルみたいなものをイメージ
[Talk]: ある発表枠(slot)における発表のリスト
[[Talk]]: タイムテーブル全体(発表枠のリスト)
generate: 解を生成する再帰アルゴリズムの本体
アキュムレータマシマシなAtCoderとかでありがちなやつ
p.75 4.3.1 並列性の追加
generateが生成する探索木は遅延データ構造でうまく実現できないため、新たな並列スケルトンを導入する
parMap も並列スケルトンの一種
探索スケルトン search
いわゆる rose tree を生成する形
| Just soln <- finished partial = [soln] みたいにガード中でアクションが書けるのは知らなかった…
(Nothingの場合はotherwiseで受け取れる)
こっから読めてない
p.78 4.4 例:並列型推論器
型無しラムダ+Let式
トップレベルの関数を並列化するくらいがちょうどよい
p.83 4.5 別のスケジューラを使う
monad-par ライブラリの Trace, Direct というスケジューラ
デフォルトはDirect
Traceを使う場合は Control.Monad.Par.Scheds.Trace をインポート
p.84 4.6 戦略と比較したParモナド
遅延データ構造を作る自然なアルゴリズム→Strategyが適する
runPar はコストがあるので1回で計算できるようにするべき
戦略によってアルゴリズムと並列性を分離しよう
並列スケルトンはどちらの方法でも使える
細粒度の並列はEvalが適する
ParモナドはHaskellのライブラリとして実装されているので変更が容易
EvalモナドはThreadScopeを使って詳細なプロファイルが得られる
Parモナドには投機的並列のサポートがなく、並列計算は常に実行される
次回
担当: lotzさん