編集可能

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

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

コメント

やまさ @yamasa 2011年2月20日
おまけの解説をblogに書いた。: メモリバリアを理解するために必要な3つのこと http://t.co/3wBWyQb
ログインして広告を非表示にする
ログインして広告を非表示にする