
boost::shared_ptrのatomicな加算ってlock-prefix付きで動いてますがこれもっと緩いバリアで充分じゃないですか?僕の頭が弱いだけです?
2011-02-09 00:09:09
@kumagi_bot バリアだとatomic保証がないから、リファレンスカウンタには使えなくないですか?
2011-02-09 00:18:43
@kosaki55tea atomic保証はバリアなしのxaddでも大丈夫だと思います。なのでlock-prefixなしのxaddで行けるんじゃないかなぁと思ってる次第です。
2011-02-09 00:24:29
@kumagi_bot アーキテクチャー上は This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically. としかないので
2011-02-09 00:31:50
@kumagi_bot インプリとしてlock なくてもatomic保証されてるCPUだとlock prefixつけても性能低下ないんじゃないですかねぇ
2011-02-09 00:32:36
@kosaki55tea なるほど。結局atomicに行うために内部でacomicallyに実行するためにメモリバリアを展開してる、という事でしょうか。現時点ではそうかも知れませんが操作のatomicityとメモリオーダリングのatomicityがごっちゃになってて
2011-02-09 00:37:00
@kosaki55tea Intelはその2つをそう遠くないうちに切り分けるだろう、と言われています。cas命令の実行コストのうち大半がメモリバリアに由来するものらしく、メモリバリアを使わないCASありうる以上、現時点でその手の考察が行われていそうだな、と思いまして。
2011-02-09 00:39:31
@kumagi_bot ええと、僕の記憶がたしかならもう別れてるのあるはず。カーネルの高速化でper-cpu変数使いまくるんだけど、NMI safeにするためにメモリバリアなしCASが必要で。あれ、いま実装どうなってるんだったかな。今度みときます
2011-02-09 00:52:01
@kosaki55tea なんと。いまどきのCPUはバリアなしのCASが使われてたりするんですね。というか高速化のため以外でメモリバリアなしという世界に需要があることの方に驚きます。lock-prefixなしのxaddが速いのかどうかは一度手元でベンチとって見比べてみます。
2011-02-09 00:55:30
うぉ。boost::shared_ptrで使われてるatomicカウンタは値の取得の為に0足し算のxaddをprefix付きで呼び出してるのか…。あぁでも0加算ならデコードされた時点で適切な方法で対処されそうな気がする。
2011-02-09 01:04:12
メモリバリアは他スレッドから観測されるメモリの操作順序を保証するもので、shared_ptrにとってはポインタの増減は他のメモリ内容になんのdependencyも無いんじゃないかなぁと思った。どうせアクセスするときはxaddの戻りが1以上な事を確認したあとなんだし。
2011-02-09 01:24:41
そしてlock-prefixは今のところの理解だとacq_relバリアを使う事と同義だと考えています。どこで読んだか忘れたけどどなたか詳しい人に教示願いたいです。
2011-02-09 01:26:07
@mskwt もしacq_relじゃなくてseq_cstだよって言われたら自信が無いのですが具体的にどう違うんでしょうか…?
2011-02-09 01:31:07
http://d.hatena.ne.jp/bsdhouse/20090816/1250446250 か。この意味だと lock-prefix は seq_cst を満たす。勘違い orz
2011-02-09 01:41:39
(IA-32, AMD64 しか詳しくないのだが) ← の Architecture では acq/rel は普通に実装可、ccNUMA における lock-prefix は seq_cst になる。IA-64 は acq/rel を明示的に使い分けられる
2011-02-09 01:48:23
x86において、lock prefixのないcmpxchg(やxaddなど)は割り込みに対してのatomic性だけが保証されていて、他プロセッサとの間のatomic性は保証されないってのがオイラの認識。なので、SMP環境ではlock prefix付きの命令を使わなきゃならない。
2011-02-09 02:38:12
atomic保証とかメモリバリアとかは、割り込み(シグナル)に対してのみ保証されていれば十分な場合と、他プロセッサとの間でも保証されていなければならない場合がある。
2011-02-09 02:44:15
なので、C++0xでも atomic_signal_fence と atomic_thread_fence という2種類のメモリバリア関数が用意されていたりするわけで。
2011-02-09 02:45:04