lockに魅了された人たち

アウトプットしろと@repeatedly先生が言うので
4
Nobuyuki Kubota @nobu_k

ABA問題が起こらないlock-freeリストのポータブルなC++実装が欲しいです。今だったらどうやって作るのが現実的かな。boostのatomicなものに依存したい・・・。

2011-02-17 18:48:28
くまぎ @kumagi

@nobu_k lock free listですか!順序関係を強制しない物でしょうか?STL的に使いたいと言い出すと双方向リストになると思うんですが。どのようなセマンティクスが欲しいか詳しく聞きたいです。

2011-02-17 18:50:22
Nobuyuki Kubota @nobu_k

@kumagi FIFOであればOKな感じです!入れたものが順不同に帰ってきてもOKなレベルw

2011-02-17 18:53:44
くまぎ @kumagi

@nobu_k それでもfifoじゃなくてlistってことはerase(const T&)やinsert(const iter&)が欲しいのでしょうか?

2011-02-17 18:58:36
Nobuyuki Kubota @nobu_k

@kumagi いやー単にFIFOなキューが欲しかっただけなんですが、lock-freeなキューを実装するなら中身はリストになるなーという思い込みからリストって書いただけですw

2011-02-17 18:59:53
くまぎ @kumagi

lock-free queueは欲しい状況に応じてカスタムパターンが数百どころのオーダーじゃないので、そこが欲しいパターンに合わせてカスタムできたら最強ですね。

2011-02-17 19:00:46
くまぎ @kumagi

@nobu_k ぐぬぬ…。普通のqueueの実装として知ってるのはamino, intel tbb, boost::lockfreeですね。速度比較などはしたことないですが、boostのやつがtbbより速いという記述を見かけたりしました。

2011-02-17 19:12:42
Nobuyuki Kubota @nobu_k

@kumagi おおboostやりますなー。あんまり外部ライブラリに依存できない感じなので、ちょっと実装を参考にしてみます!

2011-02-17 19:17:46
くまぎ @kumagi

http://twitter.com/#!/kumagi_bot/status/23010522366476289 以前呟いたこれを見返して、あぁプラガブルにするの無理そう。と思い直す。実際実装無理なパターンありそう。

2011-02-17 19:18:20
くまぎ @kumagi

ABA避けのあるqueueって、queueならカウンタ付きポインタにするよりはhazard ptrにして利用中のものが再利用されないように回避するほうが安心で確実。

2011-02-17 19:42:05
kuenishi @kuenishi

今こそロックフリーの技術を理解すべきときだと思ったけどErlangでも別にいいか

2011-02-17 19:43:13
くまぎ @kumagi

@kuenishi 何を学んだらロックフリーの技術を学んだ事になるんでしょうか…。art of mppの6章の「ロックフリー普遍構造」が未読なのですが…orz

2011-02-17 19:46:34
Nobuyuki Kubota @nobu_k

@kumagi ありすぎるwwww>未読

2011-02-17 19:49:00
kuenishi @kuenishi

まあしかし、多少マルチスレッドにしても落ちないコードが書けるようになっただけでも成長だな。

2011-02-17 19:54:39
kuenishi @kuenishi

.@kumagi ロックフリーの世界をよく理解していないのでアレなんですが、pthread_mutex_tを使わずにマルチスレッドで動作するプログラムが書けるようになったらっていうくらいを想像しています。

2011-02-17 19:55:40
くまぎ @kumagi

mutexで排他していたカウンタに対しアトミック加算命令を使うように修正したからlock freeになった、というのはよく有る勘違いで、スケーラビリティの観点に於いてはほとんど差が無いらしい。CPUのキャッシュコヒーレンスの仕組みを知ってれば大体見当付きますよね。

2011-02-17 20:04:37
Norihisa Fujita, ぽん @fjnli

@kumagi mutexによる排他制御のコストってどれぐらいなんでしょうか。

2011-02-17 20:09:59
くまぎ @kumagi

あ、確かにロックフリーにはなったけどスケーラビリティは一切伸びない、のだな。カウンタをスケーラブルにするには結構な工夫が必要で知ってる限りはSNZI以外はblocking

2011-02-17 20:10:05
くまぎ @kumagi

@fjnli lockはlock-prefix付きのxchgで獲得値が0になれば良いはずです。lock-prefixつき命令は前後にメモリバリアをはる事になり、競争が少ない場合はコストの半分ほどがメモリバリアに起因するようです。競争が有る場合はコア間の闘争なのでよくわかりません。

2011-02-17 20:13:00
Norihisa Fujita, ぽん @fjnli

@kumagi mutexの場合、待機しているスレッドを叩き起すためにカーネルが介入すると思うのですが、そのあたりのコストが気になります。

2011-02-17 20:14:58
くまぎ @kumagi

@fjnli あー、僕が話してたのはuser spaceなmutexですね。Solarisの場合は待機に入った順にqueueにつっこんで、ロック開放時はそこからdequeするだけでlock xchgの発行すらさせないので競争時のコストはそんなに無さそうです。

2011-02-17 20:19:26
Norihisa Fujita, ぽん @fjnli

@kumagi なるほど。user spaceで完結する(futexとか?)ならば、差はなさそうです。

2011-02-17 20:20:33
くまぎ @kumagi

@fjnli カーネルが介入した場合はキャッシュが汚れる事のほうが深刻な問題で、IPCが回復するのに数百万クロック要するとかそんな噂を聞いたことがあります。

2011-02-17 20:31:17
Norihisa Fujita, ぽん @fjnli

@kumagi ほええ…。cacheなにそれおいしいのなコード書いててすいません…

2011-02-17 20:33:02
くまぎ @kumagi

cache awareって一体どうすればいいんだろうな…。cacheline awareがギリギリだろう。FlexSCのような新兵器以外で何か手法があるのでしょうか…。

2011-02-17 20:38:09