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 に入ってたやつだとダメだけど、最新の binutils は TSX サポートされてるので、遊ぶ時はそれ使うとよさげということ。 gdb は入ってたやつでなんか表示できてた。
まぁこれじゃあんま意味ないんで、とりあえず動くことわかったんでもう少し大きい transaction で試してみたいと思う…
あとそうだ、 TSX のコードは回数カウントとか入ってるしそれぞれあんま等価じゃないんで、結果の数字にそれほど意味はないです。
追記。 glibc の lock elision パッチ使った時の mutex の数字も置いておきます。かなり速くなるなーというかんじ。
mutex100: 3681653991 1.02248s mutex10000: 3681653991 0.77676s