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

2013/Sep/29に開催された"Parallel and Concurrent Programming in Haskell" (by Simon Marlow) の読書会第4回についての呟きをまとめました。今回は、GPUプログラミングのためのAccelerateライブラリを読んでParallelは終了、Concurrentに入りMVarとforkIO、例外処理に関して。
3
前へ 1 ・・ 3 4 次へ
Jun Inoue @jun0inoue

#PCPjH 普通に putMVar / takeMVar してると遅延評価のお陰で lock の保持時間が自動的に極小になる。でも thunk が雪だるまさんしちゃうので、出来れば put したスレが put した後に put したデータを force しとくのが望ましい。

2013-09-29 18:28:30
二階堂ちむら or にしん @thimura

単純に FingerTree あたりを MVar で包んでおけばいいじゃんとか思ったけど、両端の MVar が独立だから別々に操作できるのか。なるほど #PCPjH

2013-09-29 18:31:45
shelarcy(しぇらーしぃ) @shelarcy

なお、GHC HEAD (7.8.1) の readMVar は atomic に処理を行う実装になってます。(もちろん、説明のためにはこの本に書いてある実装の方が良いですけれど。) http://t.co/ENBDzdEPTd #PCPjH

2013-09-29 18:34:53
Jun Inoue @jun0inoue

#PCPjH MVar でバッファ付き通信経路を作るには、背骨 (: の部分) が MVar に置き換わった無限リストを作り、先頭を pop 用、tail の MVar を push 用に使う。こうすることで push と pop が並行に実行できる。

2013-09-29 18:35:11
shelarcy(しぇらーしぃ) @shelarcy

unGetChan 関数は非推奨 - "Deprecated: if you need this operation, use Control.Concurrent.STM.TChan instead." http://t.co/OGfogx2qG1 #PCPjH

2013-09-29 18:45:31
shelarcy(しぇらーしぃ) @shelarcy

7.6.1 から、import 先のモジュールでエクスポートされていない構成要素を hiding で隠せるようになりました。 http://t.co/Py5560e8qB https://t.co/jMMJEQ5bbG https://t.co/RgMMo1f2AT #PCPjH

2013-09-29 19:19:10
shelarcy(しぇらーしぃ) @shelarcy

production code では SomeException を捕まえてそのまま処理を続けるのは良くない 例外設計における大罪: http://t.co/ijlnsb6QkB 例外設計の話。: https://t.co/07UPUA3QE5 #PCPjH

2013-09-29 19:26:18
Jun Inoue @jun0inoue

#PCPjH python は finally を提供する。Haskell ではあなたが finally を書ける。 ソビエトロシアでは finally があなたを書く。

2013-09-29 19:28:25
二階堂ちむら or にしん @thimura

finally とか bracket を自前実装してると stack trace 汚しそうだなと思ったけど、Haskell には stack trace なんてなかったやったね!! #PCPjH

2013-09-29 19:29:39
コスモ @cosmo__

too late to do 〜するには手遅れ #PCPjH

2013-09-29 19:47:09
Jun Inoue @jun0inoue

#PCPjH この waitEither と waitAny って、putter の数だけ take してないけどいいのかなあ…?

2013-09-29 19:49:09
Jun Inoue @jun0inoue

#PCPjH 終了。お疲れ様でした。

2013-09-29 19:51:15
Jun Inoue @jun0inoue

#PCPjH 今回のまとめは苦しい。Accelerate の章が全然テストコード動かせてなく分、よく分かってないので非常に苦しい。

2013-09-29 19:52:07
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ1 AccelerateはGPUプログラミングの為のEDSL。モナドと似てて、a型を返すDSLの内側のコード(GPU上で走る)をAcc aと書き、その外側のコード(ホストCPUで走る)と区別する。ただしAccは扱えるデータ型に制限がありモナドは成さない。

2013-09-29 22:16:10
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ2 GPUは配列(Repaとほぼ同じArray型)以外のデータを扱うのに難があるので、Acc aのaは常に配列かタプルでなくてはならない。以降、モナド云々はピンとこなければ無視して気にしない事。

2013-09-29 22:16:24
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ3 Acc計算にホストCPUから配列を持ち込む(コピる)関数はuse。モナドreturnみたいだが配列型かそのタプル限定。GPU側で配列を作るにはgenerateとかenumFromNを使う。同様にconstantでスカラを持ち込めるが後述の注意点あり。

2013-09-29 22:16:30
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ4 配列にmapやらzipWithやらするとGPU上で各要素を並列計算せよというアクションAcc aが出来る。モナドと同じく、Acc aは計算を表すデータであって計算はまだ行われてない。それを実際にGPUで走らせて結果をホストにコピるのがrun。

2013-09-29 22:16:37
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ5 ただしここでもGPUが任意の計算を実行出来ない制約を反映して、map fのfはa->aでなくExp a->Exp a型を取る。Exp aというのはGPU上で実行可能な演算だけからなるコード片(の構文木)を表す型。ExpはNumなので+などが出来る。

2013-09-29 22:16:42
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ6 Floyd-Warshalでの使用例。新たなノードを追加するstepをカーネルにする。kまでのノードを使った隣接行列をもらって次の新しい隣接行列をgenerate+minで作る。型をすり合わせる演算が色々あるのでコードを見とくべし。

2013-09-29 22:17:02
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ7 constant xはカーネルコードに埋め込まれた定数(リテラル)になるのでxが変わるとカーネルの再コンパイルが必要になる。しかしuse xはカーネルへの入力になるのでxが変わっても同じコードを違う入力に走らせる。xが激しく変化する場合は後者が速い。

2013-09-29 22:17:18
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ8 並行計算編開始。並行の目的は同時進行を表現する事、パフォーマンスは無関係。forkIOでスレを作ってMVarで通信。MVarは何回でも書けるが、重複して書くと遅かったほうが早かった方の値が読まれるまでブロック。要はバッファサイズ1のqueue。

2013-09-29 22:17:26
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ9 MVarにでかいデータを突っ込んどくだけでそのデータ全体の排他アクセスが実現。遅延評価のせいで普通にputMVar/takeMVarしてるだけでロック時間が最小化されるけどthunkが雪だるまするので限度あり。put側がput後seqすると良い。

2013-09-29 22:17:32
Jun Inoue @jun0inoue

#PCPjH 今回のまとめ10 (:)をMVarに置き換えたリストをqueueとして使って無制限サイズのバッファが作れる。queueの先頭を指すMVarと末尾を指すMVarを作り、pop時は前者からtake、push時は後者にput。popとpushが同時進行できるのがミソ。

2013-09-29 22:17:38
前へ 1 ・・ 3 4 次へ