2008年11月5日水曜日

x86でのセマフォ実装?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

label: 00406BEA
mov ecx, FFFFFFFF
xchg dword[esi+14], ecx
test ecx, ecx
jne 00406BEA

最初意味がわからなかったが、おそらくatomic exchange and testってやつだ。
大学の研究室時代を思い出した。当時はinner loopにしか興味が無くて(行列とかのHPCなのだ)、RISCの命令の中ではずいぶんと遠く(基盤の上バス)まで影響の出る命令があるもんだと印象に残った。

ほかのRISCの命令・・・とはいってもmull/add/loadとかばっかしで単純で、bspがどーのこーのとかはあまり気にすることはなかった。そいつらが綺麗にならんでくれることが大事で、そいつらがstallしないことがすべてだった。xchgでとまるなんてあまり興味が無かった。

時は流れてHT全盛で、遅いメモリアクセスを使ってlockするのが仕方ないのが結構影響ありそうなアプリは世の中山盛りのようだ。

で、Intelのドキュメント(IA32)によると、

XCHG (exchange) 命令は、2 つのオペランドの内容を入れ替える。この命令は、3 つのMOV命令と同じ効果を持つが、一方のオペランドをロードする間に他方のオペランドの内容を保存するための一時的なロケーションを必要としない。XCHG命令でメモリ・オペランドを処理するときは、プロセッサのLOCK 信号が自動的にアサートされる。この命令は、プロセスの同期をとるためにセマフォまたは同様のデータ構造を実装するのに便利である(バス・ロックについての詳細は、『IA-32 インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第7 章の「バス・ロック」を参照)。


ここまでよんで、あああ~~atomic exchangeなのね。了解。マルチスレッドとかじゃないなら、とりあえずは無視だな。

「x86 セマフォ xchg」でgoogle神に神託したらObj-C 最適化:不可分な操作とか転がり出てきた。

日本語でわかりやすそうな記事は4.Atomicなメモリ書き換えとかだな。

MySQLのバグレポートに完全におなじassmelbyが出てくる。

Use GCC-provided atomic lock operations to replace pthread_mutex_lock functions


At least it doesn't hurt. Since we use xchg for both lock and unlock.
Here is the assembly code:

lock:
00000000000005b0 :
5b0: b8 01 00 00 00 mov $0x1,%eax
5b5: 86 47 08 xchg %al,0x8(%rdi)
5b8: 84 c0 test %al,%al
5ba: 75 04 jne 5c0

assemblyのoperandの順番が違うのに注意ね。

0 件のコメント: