TSX は cmpxchg のかわりに使えるか?

ARMのldrexとstrexのコードを見て、なんとなくx86のcmpxchgより読みやすい気がしたので、x86にもll/sc相当が欲しいなと思ったのですが、よく考えたら今のx86にはTMがあったのを思い出しました。

PPCのll/scやARMでそれに相当するldrex/strexは一個のワード、一個のキャッシュラインしか値を監視できないですが、x86 の TSX は、複数キャッシュラインを監視できるわけで、TSXがあれば、ll/sc, ldrex/strex 相当のことができそうです。

問題はパフォーマンスで、衝突しないときにも無駄なオーバーヘッドがあると少し使うのは心苦しいです。

というわけで、x86 TSXを ll/sc がわりに使った場合、どのぐらいオーバーヘッドがあるか調べてみました

https://bitbucket.org/fixstars/blog/src/491af68bed575593726b3403c077c8e19259937c/llsc/main.c?at=master

結果は、

arch 命令 cycle
i7-5600U TSX 1cacheline 64
TSX 8cacheline 104
cmpxchg 21
load+store 7
Cortex-A53 ldrex+strex 12.2
load+store 4.2
Cortex-A15 ldrex+strex 26
load+store 7.1

というようになりました。

条件完全に揃えたわけではないので、公平な比較ではないですが、TSX はやはりそれなりのオーバーヘッドがあって、
cmpxchg を捨てて全部TSXにする、というわけにはいかないようですね…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です