2010-01-25 [長年日記]
λ. “Runtime support for multicore Haskell” by Simon Marlow, Simon P. Jones, Satnam Singh
In ICFP '09: Proceedings of the 14th ACM SIGPLAN international conference on Functional programming (2009), pp. 65-78.
を読んだ。 Parallel Haskell に着目してGHCのランタイムのデザインを見直したという話。 Haskell忘年会のときのmaoeさんの発表で面白そうだったので読んでみた。 色々な改善点があるのだけど、GC周りの話とかは色々面白かった。
通常の並列のコピーGC(copying GC)では、重複してコピーしないためにHEC(Haskell Execution Context, ≒CPU)間で同期を行う。 だけど、実際に重複してコピーされるのはまれだし、Haskellの場合そもそも大多数のイミュータブルなオブジェクトは重複してコピーされても別に問題ないので、ミュータブルなオブジェクトのコピー時にしか同期をとらないようにしたというのは、「おおぉ」と思った。
それから、並列GCのHEC間のロードバランシングを無効にしたほうが速いという話も驚いた。これはその方が局所性が高くなるから。他にもかなり局所性は意識していて、ナイーブにロードバランシングしてるだけじゃだめなんだなぁ、と思った。
Strategiesの話はよく知らなかったので勉強になった。 spark pool のGCとStrategiesの話は悩ましそうだ。
他の、CPU間のsparkのロードバランシングに bounded workstealing queue を使うようにしたとか、spark毎にHaskellスレッドを生成するのではなくバッチ処理するようにしたとかは、地道に改善しているなという感じ。