このBlogで屈指の人気のなさを誇るLinux のカーネルの話題のつづきです。
前回の記事はこちら
今回から数回にわたって smp_rmb(), smp_wmb() について解説していきます。
ロック本体よりも長いなんてアレゲですね。

もっと率直に聞きたい! ランキング!
まず正解をばお見せします。
include/asm-i386/system.h より
(可読性のため#ifdefとかは適当に削ってあります)
alternativeマクロは興味深い動作をするので、回を改めて詳しく説明しますが、今は
wmbが
みたいな内容に展開されると思ってください。
で、今回は説明の手を抜くためにSSE2搭載プロセッサ(Pentium4以上)だと仮定します。
すると
に展開されます。
これをしばらくこれを仮定して話がかかれています。いいですね。
なにやらasm文が普通のコンパイラのものと全然違いますが、これはgccの拡張アセンブラをつかっているから。
gccの拡張インラインアセンブラについては最後に参考URLを列挙しておいたのでそちらで勉強してくださいませ。
さて、ここでsfenceをインテルが配布しているソフトウェアデベロッパーマニュアル 命令セットリファレンスで調べると
なんて書いてある。
まったく説明する気があるとは思えない文章ですね。
これも次々回ぐらいに詳しく説明しますが、sfenceよりも前に現れたstore命令が終わっていなかったら終わるまでじーーーと待つって事です。
意外と簡単ですね。
でも、なにやらまるでメモリを壊す命令に見えませんね。
ますます謎が深まったところで、次回へつづく
参考:
gccのinfoの日本語訳
GCCでインラインアセンブリを使用する方法と留意点等 for x86
GCC x86インラインアセンブラ
IntelのIA32の仕様書
前回の記事はこちら
今回から数回にわたって smp_rmb(), smp_wmb() について解説していきます。
ロック本体よりも長いなんてアレゲですね。

もっと率直に聞きたい! ランキング!
まず正解をばお見せします。
include/asm-i386/system.h より
(可読性のため#ifdefとかは適当に削ってあります)
#define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
#define smp_rmb() rmb()
#define smp_wmb() wmb()
alternativeマクロは興味深い動作をするので、回を改めて詳しく説明しますが、今は
wmbが
if( X86_FEATURE_XMM ){ ← SSE搭載CPUか
return "asm(sfence)"
}else {
return "asm(lock; addl $0,0(%%esp))"
}
みたいな内容に展開されると思ってください。
で、今回は説明の手を抜くためにSSE2搭載プロセッサ(Pentium4以上)だと仮定します。
すると
#define rmb() asm volatile ("lfence" ::: "memory")
#define wmb() asm volatile ("sfence" ::: "memory")
に展開されます。
これをしばらくこれを仮定して話がかかれています。いいですね。
なにやらasm文が普通のコンパイラのものと全然違いますが、これはgccの拡張アセンブラをつかっているから。
gccの拡張インラインアセンブラについては最後に参考URLを列挙しておいたのでそちらで勉強してくださいませ。
さて、ここでsfenceをインテルが配布しているソフトウェアデベロッパーマニュアル 命令セットリファレンスで調べると
SFENCE 命令より前に発行されたすべてのストアメモリ命令に対して、シリアル化操
作を実行する。このシリアル化操作は、プログラムの順序でSFENCE 命令に先行する
すべてのストア命令が、SFENCE 命令に後続するストア命令より前にグローバルにア
クセス可能になることを保証する。SFENCE命令は、ストア命令、他のSFENCE命令、
MFENCE 命令、任意のシリアル化命令(CPUID命令など)に対して順序付けされる。
SFENCE命令は、ロード命令やLFENCE命令に対しては順序付けされない。
順序設定の緩いメモリタイプを使用して、アウト・オブ・オーダー発行、ライト・コ
ンバイニング、ライト・コラプシングなどの手法により、プロセッサ・パフォーマン
スの向上を達成する。データを参照する側のルーチンが、順序設定の緩いデータであ
ることをどの程度認識するかは、アプリケーションによって異なり、データを生成す
る側のルーチンにはわからない。SFENCE命令は、順序設定の緩い結果を生成するルー
チンとそのデータを参照するルーチンの間のストアの順序付けを保証するための効
率的な方法である。
なんて書いてある。
まったく説明する気があるとは思えない文章ですね。
これも次々回ぐらいに詳しく説明しますが、sfenceよりも前に現れたstore命令が終わっていなかったら終わるまでじーーーと待つって事です。
意外と簡単ですね。
でも、なにやらまるでメモリを壊す命令に見えませんね。
ますます謎が深まったところで、次回へつづく
参考:
gccのinfoの日本語訳
GCCでインラインアセンブリを使用する方法と留意点等 for x86
GCC x86インラインアセンブラ
IntelのIA32の仕様書
- 関連記事
-
- シーケンスロック その4(コンパイラの野望を打ち砕け!) (2006/03/19)
- シーケンスロック その3 (2006/03/18)
- シーケンスロック その2 (2006/03/12)
引きだけで終わってしまった前回のつづきです。最近2件つづけて「トイレ スピンロック」というキーワードでうちのサイトにやってきた人がいました。どうやらLinuxでロック=トイレ
【2006-03-19 Sun 23:49:33】 | 革命の日々!
【2006-03-19 Sun 23:49:33】 | 革命の日々!
本日、カーネル読書会だった。お題はalternativeマクロのお話。お題提供者のこさきさんは、薄めの話を持ってきました、などと言っていたが、「薄い話」とわざわざ言う奴ほど濃い話をするという法則のとおり濃いお話であった*1。(すばらしい) なんだかよくわからないのだ
【2006-06-10 Sat 00:24:02】 | 未来のいつか/hyoshiokの日記
【2006-06-10 Sat 00:24:02】 | 未来のいつか/hyoshiokの日記
alternativeマクロについてシーケンスロック その3 において> alternativeマクロは興味深い動作をするので、回を改めて詳しく説明しますが、などと書いておいて すっかり忘れていた al
【2006-06-10 Sat 00:56:19】 | 革命の日々!
【2006-06-10 Sat 00:56:19】 | 革命の日々!