Streamflowの論文をざっと読む。確かにこれは速かろうて。少なくとも私には、CASの使用回数をこれより少なくできる気がしない。
2011-05-15 01:30:19@nakatwi https://gist.github.com/972375 CAS1回でのLock-free Mallocを試作しました。freeは未テストですが。これだとページをOSに返却できないんですよねぃ…。目的を絞るならまだいいんですが…。
2011-05-15 01:49:08@kumagi Michael氏のallocatorはSuperBlockをヘッダとボディに分けて、ボディだけはOSに返却するようにしてましたね。うまいなぁと感心したものです。StreamflowはCASはほとんど別スレッドからのfree時だけで、こりゃ速いわ、と。
2011-05-15 02:03:57@kumagi allocate()の最初の、 page* next = (*ptr)->next; page* old_ptr = *ptr; if(old_ptr->next != next){continue;} の意図は?
2011-05-15 02:17:54@kumagi で、この実装はget_newpage()でまとまった数のノードを一度に追加するという違いはあるものの、基本的には単純なlock-freeスタックであり、ABA問題に対処できていないようです。
2011-05-15 02:32:09@kumagi タグ付ポインタを用いた方法は http://j.mp/koivnu の newNode, retireNode で、ハザードポインタを用いたものは http://j.mp/lKFGCi の QueueNodePoolAllocator で実装しています。
2011-05-15 02:50:46@yamasa タグ付きポインタはタグが周回する危険を考えるとビット幅が狭い場合軽減しただけでしかなく、ハザードポインタは使う側が気を付けないといけないため、mallocのユーザにハザードポインタの利用を強いずに実現する方法がわかりません。
2011-05-15 12:07:19@kumagi まあ、これらの実装は実際にベンチマーク取ると意外と性能が出ません。本格的にやるなら、thread_localなキャッシュとglobalなプールとの2段構えのような手法が考えられますね。
2011-05-15 02:53:22昨日の昔読んだTLBの話。2001年のTCP/IPスタックでの話でした。http://findarticles.com/p/articles/mi_qa3751/is_200103/ai_n8944849/pg_18/ PDF版は http://bit.ly/jqvepR
2011-05-15 12:27:02@kumagi タグは32bit以上あればまず大丈夫といって良いんじゃないですかね。あと、ハザードポインタに限らず、利用者側の協力が必要とされるのは、C++でlock-freeをやろうとする以上仕方ないことかと。
2011-05-15 12:54:28@yamasa 32bitのタグということはDCASですか。mallocごときにハザードポインタ要求するのは避けたいので実質そちらになりますかねぃ…。
2011-05-15 13:18:50@kumagi どうしてもユーザー側にハザードポインタの利用を要求したくないのであれば、free()のところで実際にスタックに戻す前にハザードポインタのスキャンをする手がありますが……二度手間というか、効率が良くないかと。
2011-05-15 13:43:23@yamasa 今やっと意味が分かりました。freeしかかってる時に既に他の奴がfreeしちゃうからABAるのだからそこで監視すれば良いってことですね。できそうではありますがTLSをこんな場所で使うのはあんまり気が進みませんね…。
2011-05-15 20:54:24@kumagi いや、ABAが起こるのはallocate()側です。そこのCASの直前で他のスレッドに割り込まれてallocate()2回→最初にallocate()されたオブジェクトを引数にfree()とされると、ABAになるのがわかるでしょうか。
2011-05-15 23:12:29@kumagi で、そのABAを回避するには、allocate途中のオブジェクトが別スレッドによって横取りされさらにfreeで戻されるという流れを止めなきゃならないので、free側で監視しようって話なわけです。
2011-05-15 23:14:51