スレッドローカルGCって?

D言語に実装される日は来るのでしょうか…それ以前にJava以外にまともに実装される日は…。
17
SKS rep @repeatedly

GSoCではこういうのにチャレンジして欲しいところ.というかスレッドローカルGCをですね…

2011-04-08 13:13:25
IGARASHI Shinji@無職 @s50

スッドレローカルGCが来てグローバルな単一GC期待した迂闊なコードが動かなくなる将来を期待

2011-04-08 13:35:01
くまぎ @kumagi

僕の観測範囲では、日本で今一番熱狂的なブームを巻き起こしているのはスレッドローカルGCなんだけど、ググってもまともな説明が見当たらない。自分のスタックフレームだけ見るM&Sじゃ誤爆しかしないだろうし想像が付かない。

2011-04-08 13:38:54
IGARASHI Shinji@無職 @s50

@kumagi D的にスレッドは激しく隔離されてて「ほとんど」共有するものがないけど、GCは正直よっぽど変な思い付きする人が出なけりゃ共有でいくだろうなーとか思ってマス

2011-04-08 13:42:02
IGARASHI Shinji@無職 @s50

くまー先生の冷静なツッコミが入ったりしてー、と思ったら本当に入ってびびる

2011-04-08 13:43:32
くまぎ @kumagi

@s50 concurrentなデータ構造とスレッド間の隔離は相反するので、それを意識した前提条件をコード中に書かせるみたいな方法以外だと実現不可能そうで、むしろややこしくなるからやらないんじゃないかと思います。

2011-04-08 13:46:22
やおっち @yaotti

@kumagi ぼくもまさに今スレッドローカルGCを調べてたんですが,google scholarでもひっかからないですねえ

2011-04-08 13:43:40
くまぎ @kumagi

@yaotti スレッドスペシフィック、のほうがアカデミックな場で使われる場所っぽいですね…。

2011-04-08 13:54:32
やおっち @yaotti

@kumagi よく見たらスレッドローカルでも引掛ってました.”Thread-local heaps for Java (ISMM’02)” ライトバリアを使ってローカルオブジェクトをモニタするみたいです

2011-04-08 14:04:37
くまぎ @kumagi

@yaotti ライトバリアでローカルオブジェクトをモニタ…ライトバリアってあのメモリオーダリングでのreleaseバリアの事でしょうか?書き換えを検知する機構でしたっけ?

2011-04-08 14:07:48
やおっち @yaotti

@kumagi 後者です.ライトバリアはオブジェクトや配列への書き込み時に何か処理を行うもので,前者のメモリバリアとはまた別です.

2011-04-08 14:10:00
くまぎ @kumagi

@yaotti なるほど!ライトバリアによって再び非スレッドローカルになった場合にも対処できるわけですね!

2011-04-08 14:16:05
くまぎ @kumagi

ぐぬぬ。そしてメモリ管理の淵へ落ちていくのか。メモリ管理はアリーナ式とスラブ式の2種類があって、前者はロック無しでは共有不可だけど、スラブ式は配列とリストをベースにしてるので既存のデータ構造で大体同じような物を作れるのだけれど以下略

2011-04-08 13:59:22
IGARASHI Shinji@無職 @s50

@kumagi 結局は実行するプログラムとマシン次第でも使い勝手変わりそう、てあたりを実行時最適化でいくらかいい加減に解決できたら面白いのかも、とか思い始めますた

2011-04-08 14:05:01
IGARASHI Shinji@無職 @s50

要はコード中(とか静的な解析)、あるいは実行時に区別する手間をスレッド固有でGC走るメリットが上回れば有効という話ではあるんだよなー。一切を共有しないって話は当然考えないとして

2011-04-08 14:07:51
くまぎ @kumagi

@s50 いい加減な解決は望ましいですが、そうなると今度はJavaのJMMのように、何らかのラインでしっかり契約されていないとマシンの差などを吸収できませんし、そういうラインを賢く決めるのはJVMの中の人でも難しそうです。

2011-04-08 14:12:17
IGARASHI Shinji@無職 @s50

@kumagi 使う状況限定されてるならともかく、汎用言語の標準ランタイムでやろう、ってなるとむつかしい話っすね……

2011-04-08 14:18:32
中村 実 @nminoru_jp

@kumagi escape analysisを行ってスレッドローカルであることを保証できるものだけスレッド領域に割り当てるか、ライトバリアを頼りに投機的に割り付けるという方法があります。

2011-04-08 13:42:43
くまぎ @kumagi

@nminoru_jp 一旦スレッドローカルになったからと言って以後ずっとスレッドローカルになるとは言えないので、割り付けた後でスレッドローカルで無いことを確認したら割付を戻す必要があって、確認する方法って結局他のGCと同じぐらいなんじゃ…などと思います。

2011-04-08 13:50:23
中村 実 @nminoru_jp

@kumagi Escape analysisを使った手法はSteensgaard, B: Thread-Specific Heaps for Multi-Threaded Programs, Proc. ISMM’00, pp. 18–24 (2000).があります。

2011-04-08 13:49:48
くまぎ @kumagi

@nminoru_jp ありがとうございます。読んでみます

2011-04-08 13:52:18
中村 実 @nminoru_jp

@kumagi スレッドローカル割り付けの失敗はあるのですが、本当にローカルGCが欲しいJ2EEのようなアプリだとアロケータ毎に強い局所性があることが多いです。特に呼び出しコンテキストを区別して判定できると綺麗に判別できます。

2011-04-08 14:01:54
中村 実 @nminoru_jp

@kumagi 投機的に割り付けを行う論文は Domani, TのThread-Local Heaps for Java, Proc. ISMM’02, pp. 76--87 (2002). があります。あと拙論文 http://bit.ly/fpis1t

2011-04-08 14:02:36
くまぎ @kumagi

@nminoru_jp 呼び出しコンテキストによる判別!!malloc内部でコールスタックを眺めてスイッチングするとかJITの際に完全に別のmallocに置換しちゃうとかですか!それはすごい技術ですね…!

2011-04-08 14:09:34
中村 実 @nminoru_jp

@nminoru_jp @kumagi 呼び出しコンテキストを区別するというのは、new命令を含んだAという関数があった場合にaAがB関数から呼び出されたC関数から呼び出されたかで区別して割り付けるものです。まじめに実装するにはインライン展開ができるJITが必要ですね。

2011-04-08 14:13:22