Haskellによる並列・並行プログラミング読書会 #2
7/2 にHaskellによる並列・並行プログラミング読書会の第2回を開催しました。
「3.3 例:K平均法」まで(おそらく)理解して読み進むことができました。
次回は再来週の予定で、会場は目黒になるかと思います。
「3.4 GCされるスパークと投機的並列性」から読み進めます。
ポイント
ポイントになったところをメモ。基本的にはまだそこまで難しい内容は出てきていない。
rparWith
rparWith :: Strategy a -> Strategy a
はrpar
という並列性を与えた上で、rseq
やrdeepseq
などの評価戦略を与える。
つまり、rseq
は単に弱頭部正規形まで評価するという戦略を与えているに過ぎず、並列実行の動きとしてはrpar
単体を与えた時と同じ動作となる。
rdeepseq
は正規形まで評価を行う。
k-means法
知らない人に伝えるとき、ホワイトボードに雑に点を書いて、k = 2 でやってみたらビックリするほど伝わりやすかった。
スレッド生成のオーバーヘッドとチャンク
スレッドごとのタスクが軽すぎると、スレッド生成のためのオーバーヘッドが並列性を圧倒してしまう。 そのため、適切なサイズのチャンクを作成する必要がある。
タスクの粒度が細かすぎるとオーバーヘッドが問題になるが、タスクの粒度が荒すぎると今度は各タスクのコスト差が大きくなり、効率的な並列化が行えなくなる。
適切なチャンクサイズを求める方法としては、チャンクサイズを変えながらひたすら計測を行うのが基本となる。
ミニ課題
今回のミニ課題は anarchy golf - Greatest Common Divisor でした。
最短は 35byte ですが、40byte にまでしかできず……! 2人は 35byte の最短コードを作成できていました……すごすぎ。
最短コードまでの道のりは Qiita にまとめてみました。
余談
並列・並行プログラミング繋がりですが、Ruby の親子プロセス間でエラー情報のやりとりをしたいなと思ったので、実現方法を考えて Qiita にまとめてみました。
感想
並列・並行プログラミングも Haskell も面白い!