メモリバリアとガチャピン先生

貴重なお話が聞けたのでメモらせて頂きます。
30
kumagi @kumagi_bot

boost::shared_ptrのatomicな加算ってlock-prefix付きで動いてますがこれもっと緩いバリアで充分じゃないですか?僕の頭が弱いだけです?

2011-02-09 00:09:09
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@kumagi_bot バリアだとatomic保証がないから、リファレンスカウンタには使えなくないですか?

2011-02-09 00:18:43
kumagi @kumagi_bot

@kosaki55tea atomic保証はバリアなしのxaddでも大丈夫だと思います。なのでlock-prefixなしのxaddで行けるんじゃないかなぁと思ってる次第です。

2011-02-09 00:24:29
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@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
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@kumagi_bot インプリとしてlock なくてもatomic保証されてるCPUだとlock prefixつけても性能低下ないんじゃないですかねぇ

2011-02-09 00:32:36
kumagi @kumagi_bot

@kosaki55tea なるほど。結局atomicに行うために内部でacomicallyに実行するためにメモリバリアを展開してる、という事でしょうか。現時点ではそうかも知れませんが操作のatomicityとメモリオーダリングのatomicityがごっちゃになってて

2011-02-09 00:37:00
kumagi @kumagi_bot

@kosaki55tea Intelはその2つをそう遠くないうちに切り分けるだろう、と言われています。cas命令の実行コストのうち大半がメモリバリアに由来するものらしく、メモリバリアを使わないCASありうる以上、現時点でその手の考察が行われていそうだな、と思いまして。

2011-02-09 00:39:31
kumagi @kumagi_bot

ガチャピン先生がすごく怖い。気を抜いたら頭からバリバリ食べられそうだ。

2011-02-09 00:41:08
小崎 資広 (KOSAKI Motohiro) @kosaki55tea

@kumagi_bot ええと、僕の記憶がたしかならもう別れてるのあるはず。カーネルの高速化でper-cpu変数使いまくるんだけど、NMI safeにするためにメモリバリアなしCASが必要で。あれ、いま実装どうなってるんだったかな。今度みときます

2011-02-09 00:52:01
kumagi @kumagi_bot

@kosaki55tea なんと。いまどきのCPUはバリアなしのCASが使われてたりするんですね。というか高速化のため以外でメモリバリアなしという世界に需要があることの方に驚きます。lock-prefixなしのxaddが速いのかどうかは一度手元でベンチとって見比べてみます。

2011-02-09 00:55:30
kumagi @kumagi_bot

うぉ。boost::shared_ptrで使われてるatomicカウンタは値の取得の為に0足し算のxaddをprefix付きで呼び出してるのか…。あぁでも0加算ならデコードされた時点で適切な方法で対処されそうな気がする。

2011-02-09 01:04:12
kumagi @kumagi_bot

メモリバリアは他スレッドから観測されるメモリの操作順序を保証するもので、shared_ptrにとってはポインタの増減は他のメモリ内容になんのdependencyも無いんじゃないかなぁと思った。どうせアクセスするときはxaddの戻りが1以上な事を確認したあとなんだし。

2011-02-09 01:24:41
kumagi @kumagi_bot

そしてlock-prefixは今のところの理解だとacq_relバリアを使う事と同義だと考えています。どこで読んだか忘れたけどどなたか詳しい人に教示願いたいです。

2011-02-09 01:26:07
野良猫@がんばらない @mskwt

@kumagi_bot lock-prefix は強い atomicity の保証。acq_rel と同義

2011-02-09 01:27:29
kumagi @kumagi_bot

@mskwt もしacq_relじゃなくてseq_cstだよって言われたら自信が無いのですが具体的にどう違うんでしょうか…?

2011-02-09 01:31:07
野良猫@がんばらない @mskwt

@kumagi_bot それ、lock-prefix が保護できる範囲じゃない気が

2011-02-09 01:37:37
野良猫@がんばらない @mskwt

http://d.hatena.ne.jp/bsdhouse/20090816/1250446250 か。この意味だと lock-prefix は seq_cst を満たす。勘違い orz

2011-02-09 01:41:39
kumagi @kumagi_bot

@yamasaさんのブログに書いてあったのか!!!>acq_relとseq_cstの違い

2011-02-09 01:43:24
野良猫@がんばらない @mskwt

(IA-32, AMD64 しか詳しくないのだが) ← の Architecture では acq/rel は普通に実装可、ccNUMA における lock-prefix は seq_cst になる。IA-64 は acq/rel を明示的に使い分けられる

2011-02-09 01:48:23
野良猫@がんばらない @mskwt

ややこしいのは [lsm]fence の登場なのだが、これらって言語レベルで一般化すべき話なのか悩むな…

2011-02-09 01:52:50
やまさ @yamasa

見てる: Togetter - 「メモリバリアとガチャピン先生」 http://togetter.com/li/98616

2011-02-09 02:32:59
やまさ @yamasa

なんか面白そうな話があったみたいだ。

2011-02-09 02:33:27
やまさ @yamasa

x86において、lock prefixのないcmpxchg(やxaddなど)は割り込みに対してのatomic性だけが保証されていて、他プロセッサとの間のatomic性は保証されないってのがオイラの認識。なので、SMP環境ではlock prefix付きの命令を使わなきゃならない。

2011-02-09 02:38:12
やまさ @yamasa

atomic保証とかメモリバリアとかは、割り込み(シグナル)に対してのみ保証されていれば十分な場合と、他プロセッサとの間でも保証されていなければならない場合がある。

2011-02-09 02:44:15
やまさ @yamasa

なので、C++0xでも atomic_signal_fence と atomic_thread_fence という2種類のメモリバリア関数が用意されていたりするわけで。

2011-02-09 02:45:04