はじめての TSX

TSX とかちょっと遊んでみたいよねーというのと、 fedora つらくなってきたので debian 入れるついでなどと言い訳して haswell マシン買った。買ってから id:w_o さんが haswell でも TSX 無いモデルがあるという趣旨の tweet をしていて、すごくヒヤっとしたけど、たまたま僕が買ったやつにはついていた。型番がデカけりゃあるもんでもないらしく、運がよかっただけで、こういうのはこわいからやめてほしい…

https://github.com/shinh/test/blob/master/tsx.cc

全然適切なネタが思いつかなかったので、とりあえず乱数を計算して、一定期間おきに global 変数な sum に加算する、みたいなのを書いた。単一オペレーションだともちろん atomic 演算で十分なんで、 atomic なやつが普通に速い。

100万回乱数を計算するスレッドが8体いるって設定で、基本的には100回おきに加算するみたいなのの時間を比べてみた。 2 つめのカラムは加算した結果。 nolock は当然但しくない結果を出す。

nolock100: 715491126 0.802569s
mutex100: 3681653991 1.62795s
mutex10000: 3681653991 0.775924s
atomic100: 3681653991 0.808765s
TSX100000000: 3681653991 0.780674s
tsx_cnt=8
TSX100: 3681653991 0.998887s
tsx_cnt=11504482
nolock100: 506473942 0.790571s

HTM はまぁ atomic 演算と mutex の間くらいが守備範囲というなんとなくの認識で、まぁなんかだいたいそんな感じになった。

あと最初の nolock は有意に遅くて、 turbo boost かかってないからかなーとか思う。

あとわかったこととしては、 debian に入ってたやつだとダメだけど、最新の binutilsTSX サポートされてるので、遊ぶ時はそれ使うとよさげということ。 gdb は入ってたやつでなんか表示できてた。

まぁこれじゃあんま意味ないんで、とりあえず動くことわかったんでもう少し大きい transaction で試してみたいと思う…

あとそうだ、 TSX のコードは回数カウントとか入ってるしそれぞれあんま等価じゃないんで、結果の数字にそれほど意味はないです。

追記。 glibc の lock elision パッチ使った時の mutex の数字も置いておきます。かなり速くなるなーというかんじ。

mutex100: 3681653991 1.02248s
mutex10000: 3681653991 0.77676s
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h