2011年9月1日

GHC 7.0.x―7.2.1 現在のスレッド実装について

GHC (Haskell) のスレッド実装について議論する時の参考になるよう、GHC 7.2.1 までのスレッド実装についてのやり取りやメモ的なつぶやきをまとめておきます。
10

Haskell (GHC) のユーザースレッドは軽量

SKS/ファントムの申し子 @repeatedly

スレッドがもっと軽量になってマシンリソースが増えるとイベントなんて必要なくなるんや!

2011-06-12 19:50:39
SKS/ファントムの申し子 @repeatedly

@tanakh え,Haskellのスレッドって軽量なんですか?

2011-06-12 19:54:54
SKS/ファントムの申し子 @repeatedly

HaskellもSMPな感じの持ってたんだっけ?

2011-06-12 20:00:23
shelarcy(しぇらーしぃ) @shelarcy

@repeatedly @cpp_akira シングルコアならもっと良い結果が出ているので、Erlang の SMP 対応の実装がまだまだなんだと思います http://j.mp/mLEbzw > Erlang が(思ったより)重い

2011-06-12 20:11:36
shelarcy(しぇらーしぃ) @shelarcy

@repeatedly @cpp_akira あっ、しまった。GHC がマルチコアで threadring の性能が下がらないのは、forkOnIO をつかって前処理を同じ CPU に割り振ってるからですね。Erlang の場合、シングルコアでの性能を見たほうが良いかも。

2011-06-12 20:16:39
Hideyuki Tanaka @tanakh

Erlangのスレッドの軽さは認知されてるのに、なんでHaskellのは認知されてないのか?そのあたりにHaskellの普及を阻むものがありそうである。

2011-06-12 20:05:24
Yu SUGAWARA @gusmachine

@tanakh ポインタがほしいです。haskell thread あたりで見まわってもそれっぽい情報がほとんどないです。

2011-06-12 20:08:00
shelarcy(しぇらーしぃ) @shelarcy

@gusmachine 扱いが小さくて煽り度は低めですが、Wikipedia のグリーンスレッドの項目とか。 http://j.mp/iKnrz3

2011-06-12 20:29:03
shelarcy(しぇらーしぃ) @shelarcy

@kazu_yamamoto "Runtime Support for Multicore Haskell" [http://j.mp/lBWECq ] の "4.1 The basic setup" では、15ワード + スタックのサイズだと書いてありますね。

2011-08-03 11:27:23
shelarcy(しぇらーしぃ) @shelarcy

@kazu_yamamoto あっ、+ スレッドの状態です。 "The size of a TSO is around 15 words plus the stack, and constitutes the whole state of a Haskell thread."

2011-08-03 11:30:25
shelarcy(しぇらーしぃ) @shelarcy

(さっきの話の流れの中で示し忘れたのですが、)Haskell のスレッドや並列処理(par 関数)用の spark が軽いっていうのは、この辺のスライドにも出てますね。 http://j.mp/mhVPBX http://j.mp/kxjkvP

2011-06-12 22:13:39
shelarcy(しぇらーしぃ) @shelarcy

.。oO(ただし、par関数は使い方によってはspace leakを起こすので、その辺に気をつける必要がありますが。 http://j.mp/iNLdzq (parallelパッケージでは問題をある程度考慮しているので、par関数を直接使わずにそちらを使うことをお勧めします。))

2011-06-12 22:25:49
GHC 7.2.1 でのスレッドやスタックの実装の変更点
shelarcy(しぇらーしぃ) @shelarcy

ちなみに GHC 7.2.1 でスレッドを使った処理は現在よりももっと軽くなる予定です。 http://hackage.haskell.org/trac/ghc/blog/stack-chunks

2011-06-12 22:26:20
shelarcy(しぇらーしぃ) @shelarcy

GHC Current で、スタックをヒープ上の TSO に置くのを止めて、スタック・チャンクを作成してそこにスタックを置くようにしたそうです。 http://hackage.haskell.org/trac/ghc/blog/stack-chunks

2010-12-16 10:27:42
shelarcy(しぇらーしぃ) @shelarcy

これにより、thread のスタックが深い場合にマイナー GC が高くついてしまう問題が防げるそうです。

2010-12-16 10:34:58
shelarcy(しぇらーしぃ) @shelarcy

この変更の結果、threadring など一部のプログラムでは大きく性能が向上しているみたいですね。(表の中ではプログラム Size の変化が一番目立ちますが、これは -split-objs を使ってオブジェクトを分割したかどうかの違いなので、関係ないとのことです。)

2010-12-16 10:38:33
補足:GHC 7.2.1 での CPU アフィニティ(affinity)を指定する機能

forkOnIO に対する補足説明です。実装ではなく機能の紹介をしているので、興味のない方は次の節まで読み飛ばしてください。

shelarcy(しぇらーしぃ) @shelarcy

GHC Current (HEAD) にて、指定した CPU (HEC) 上で実行されるスレッドを作成するための forkOn 関数が Control.Concurrent に追加されました。 http://j.mp/gWW1Nj http://j.mp/gyXBXT

2011-03-30 21:52:26
残りを読む(84)

コメント

shelarcy(しぇらーしぃ) @shelarcy 2011年10月10日
このまとめの作成後、GHC のスレッド実装についての記事がいくつか出ました。興味のある方はそちらもチェックしてみると良いと思います。
0
shelarcy(しぇらーしぃ) @shelarcy 2011年10月10日
Haskell(GHC)での軽量ユーザスレッドの実装方法 [http://d.hatena.ne.jp/kazu-yamamoto/20110902/1314934306 ] 、(続)Haskell(GHC)での軽量ユーザスレッドの実装方法 [http://d.hatena.ne.jp/kazu-yamamoto/20110908/1315457683 ]
0