Parallel and Concurrent Programming in Haskell 読書会 第3回

2013/Sep/8に開催された"Parallel and Concurrent Programming in Haskell" (by Simon Marlow) の読書会第3回についての呟きをまとめました。今回はParモナドと、配列に対する並列計算に特化されたRepaライブラリについて。
3
前へ 1 2 ・・ 6 次へ
shelarcy(しぇらーしぃ) @shelarcy

Map なのか IntMap なのか import qualified Data.IntMap.Strict as Map https://t.co/ogVGv3WTpR #PCPjH

2013-09-08 16:10:13
shelarcy(しぇらーしぃ) @shelarcy

「IList どこー?」 「自前で定義してます。」 https://t.co/CX6MdgJsma #PCPjH

2013-09-08 16:19:32
Jun Inoue @jun0inoue

#PCPjH IList→tail を取る毎に IVar を通るように改変されたリスト

2013-09-08 16:21:05
shelarcy(しぇらーしぃ) @shelarcy

古のバージョン(0.1.0.x)では monad-par パッケージに含まれてました [http://t.co/VKlsOWD1Qp ] が、現在では提供せず #PCPjH

2013-09-08 16:21:35
Jun Inoue @jun0inoue

#PCPjH streamFromList では x:xs と IVar v を取り、v に head と 次の IVar w を put し (ここで head が正規形まで評価される)、tail と w に進む。こうしてパイプラインの生産者を作る。

2013-09-08 16:28:30
shelarcy(しぇらーしぃ) @shelarcy

[重要] [大事なことなのでもう一度] 今はデータ並列ではなくパイプライン並列の話! #PCPjH

2013-09-08 16:29:25
Jun Inoue @jun0inoue

#PCPjH 消費者側は IList に対して消費行動を mapM して foldM で答えを集める。

2013-09-08 16:30:02
Jun Inoue @jun0inoue

#PCPjH map decrypt . map encrypt みたいなパイプラインを並列化する場合は fold は (:) をfold することで IList a を [a] に直す。

2013-09-08 16:31:56
Jun Inoue @jun0inoue

#PCPjH decrypt . encrypt では decrypt の方が倍ぐらい速く、encrypt が律速段階になる。理想的なスピードアップは 1.5 倍ぐらい。

2013-09-08 16:32:55
Jun Inoue @jun0inoue

#PCPjH 「実装は、読者への課題とする」 ま さ に ふ つ う

2013-09-08 16:34:51
Jun Inoue @jun0inoue

#PCPjH 生産者が消費者に対して早すぎる場合、在庫が積もってメモリをどんどん食ってしまうので、生産側でも消費側でも一定以上仕事した時点で新たな fork をする必要がある(?)

2013-09-08 16:37:50
Jun Inoue @jun0inoue

#PCPjH 違うな。テイク2。生産者が消費者に対して早すぎる場合、在庫が積もってメモリをどんどん食ってしまうので、一定以上生産したら IVar に加えて "その IVar に値を置く計算" を消費者に渡す。消費者はそれを fork する。

2013-09-08 16:41:34
Jun Inoue @jun0inoue

#PCPjH 生産者は一定量生産したら "IVar に put する計算" という名の携帯番号を残して休暇に出る。消費者は在庫を食い尽くして携帯番号に行き着いたら生産者を呼び出す。まさに社会

2013-09-08 16:44:04
Jun Inoue @jun0inoue

#PCPjH Limitations の項、完全に乗り遅れたのだけど、何について紛糾してたのだろう。

2013-09-08 16:49:09
Jun Inoue @jun0inoue

#PCPjH (生産調整なしの) rsa を見ると、消費者側の streamFold は全ての要素をリストに突っ込むまで runPar を脱しない。これは IVar を含む IList は runPar から返すとバグるから。

2013-09-08 16:52:51
Jun Inoue @jun0inoue

#PCPjH だから並列ストリーム処理に関して言えば、Par は「一旦入ると最後まで出れない」IO みたいな性格を持つ。 Par「出たいか? 俺の影響下から出たいか? だったら全部の要素を含むリストを作るんだな!!」まさに外道

2013-09-08 16:54:35
Jun Inoue @jun0inoue

#PCPjH さて、そんなこと書いてるうちに会場は進んでるようで、ドミノ倒しに乗り遅れてまして…

2013-09-08 16:55:14
shelarcy(しぇらーしぃ) @shelarcy

あっ、そっか。ParIO モナドは lazy I/O のように振る舞えるのね。その代わり結果が非決定的になっちゃうけれど。 #PCPjH

2013-09-08 16:58:33
Jun Inoue @jun0inoue

#PCPjH 探索木を分割統治的に処理してくアルゴリズムでは Strategies は使いにくい。探索木全体を遅延データ構造として作ることになり、処理が進むにしたがって歯に近い方まで遅延が剥がれていくのに根っこは最後までGCされないのでメモリが大変なことに。

2013-09-08 17:12:30
Jun Inoue @jun0inoue

#PCPjH View pattern 説明なしで使いますかそうですか

2013-09-08 17:15:40
shelarcy(しぇらーしぃ) @shelarcy

.@jun0inoue あっ、すみません。さっきの解釈間違っていたかもしれません。とりあえず、(答えが決定的にならない、実行時エラーやデッドロックなどのリスクを潜在的に含むものの、)IVar を返すことは普通の Par モナドでもできてしまうことは確認しました。 #PCPjH

2013-09-08 17:20:03
とーま @Amothic

音声が途切れる… 原因なんだろ… #PCPjH

2013-09-08 17:23:28
前へ 1 2 ・・ 6 次へ